В этом посте мы рассмотрим наиболее важные параметры классификатора Sklearn SVC и их влияние на нашу модель с точки зрения переобучения.
Классификатор опорных векторов пытается найти лучшую гиперплоскость для разделения различных классов, максимизируя расстояние между точками выборки и гиперплоскостью.
Мы будем использовать данные Iris из sklearn.
Начнем с загрузки библиотек и SVC
import numpy as np import matplotlib.pyplot as plt from sklearn import svm, datasets %matplotlib inline # import some data to play with iris = datasets.load_iris() X = iris.data[:, :2] # we only take the first two features. We could # avoid this ugly slicing by using a two-dim dataset y = iris.target
Мы используем тот же сценарий построения графиков.
def plotSVC(title): # create a mesh to plot in x_min, x_max = X[:, 0].min() — 1, X[:, 0].max() + 1 y_min, y_max = X[:, 1].min() — 1, X[:, 1].max() + 1 h = (x_max / x_min)/100 xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h)) plt.subplot(1, 1, 1) Z = svc.predict(np.c_[xx.ravel(), yy.ravel()]) Z = Z.reshape(xx.shape) plt.contourf(xx, yy, Z, cmap=plt.cm.Paired, alpha=0.8) plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired) plt.xlabel(‘Sepal length’) plt.ylabel(‘Sepal width’) plt.xlim(xx.min(), xx.max()) plt.title(title) plt.show()
Ядро
Параметры ядра выбирают тип гиперплоскости, используемой для разделения данных. При использовании «linear» будет использоваться линейная гиперплоскость (линия в случае 2D-данных). «Rbf» и «poly» используют нелинейную гиперплоскость.
kernels = [‘linear’, ‘rbf’, ‘poly’] for kernel in kernels: svc = svm.SVC(kernel=kernel).fit(X, y) plotSVC(‘kernel=’ + str(kernel))
гамма
гамма - параметр для нелинейных гиперплоскостей. Чем выше значение гаммы, тем точнее он пытается соответствовать набору обучающих данных.
gammas = [0.1, 1, 10, 100] for gamma in gammas: svc = svm.SVC(kernel=’rbf’, gamma=gamma).fit(X, y) plotSVC(‘gamma=’ + str(gamma))
Мы видим, что увеличение гаммы приводит к переобучению, поскольку классификатор пытается идеально соответствовать обучающим данным.
C
C - штрафной параметр члена ошибки. Он контролирует компромисс между гладкой границей решения и правильной классификацией тренировочных точек.
cs = [0.1, 1, 10, 100, 1000] for c in cs: svc = svm.SVC(kernel=’rbf’, C=c).fit(X, y) plotSVC(‘C=’ + str(c))
Увеличение значений C может привести к переобучению обучающих данных.
степень
Степень - это параметр, используемый, когда ядро установлено на «поли». По сути, это степень полинома, используемого для нахождения гиперплоскости для разделения данных.
degrees = [0, 1, 2, 3, 4, 5, 6] for degree in degrees: svc = svm.SVC(kernel=’poly’, degree=degree).fit(X, y) plotSVC(‘degree=’ + str(degree))
Использование степени = 1 аналогично использованию «линейного» ядра. Кроме того, увеличение этого параметра приводит к увеличению времени обучения.
Серия inDepth исследует, как параметры модели влияют на производительность с точки зрения переобучения и недостаточного подгонки. Вы можете проверить настройку параметров для моделей на основе дерева, таких как Дерево решений, Случайный лес, Повышение градиента и KNN.