Использование Python для реализации различных ядер SVC в наборе данных Iris

В этой статье мы рассмотрим алгоритм SVC в библиотеке Sklearn и поэкспериментируем с различными ядрами в наборе данных Iris.

Классификатор опорных векторов

Классификатор опорных векторов (SVC) - это модель машинного обучения с учителем, используемая для задач классификации на две группы. После предоставления модельного набора SVC помеченных обучающих данных для каждой категории они могут классифицировать новые тестовые данные.

SVM классифицирует данные на основе плоскости, которая максимизирует запас. Граница решения SVM прямая. SVM - действительно хороший алгоритм для классификации изображений. Экспериментальные результаты показывают, что SVM достигают значительно более высокой точности поиска, чем традиционные схемы уточнения запросов, всего после трех-четырех раундов обратной связи по релевантности. Это также верно для систем сегментации изображений, включая те, которые используют модифицированную версию SVM, которая использует привилегированный подход.

Код

Здесь мы рассмотрим сегмент кодирования. Набор данных, используемый для этой реализации, - это набор данных радужной оболочки глаза, который можно импортировать из библиотеки sklearn.

Импорт набора данных и соответствующих библиотек / модулей

Во-первых, мы импортируем numpy и matplotlib для математической обработки данных и построения графиков. Затем мы импортируем классификатор svm и набор данных радужной оболочки из библиотеки sklearn.

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm, datasets
iris = datasets.load_iris()

Набор данных Iris состоит из 150 образцов, каждый из которых имеет 4 характеристики: длина чашелистика, ширина чашелистика, длина лепестка и ширина лепестка.

Данные разделены на 3 класса: сетоса, разноцветный и вирджинский.

Функции и целевой массив Numpy

Затем мы возьмем первые две характеристики радужной оболочки, а именно длину и ширину чашелистиков, оба в сантиметрах.

Наша переменная X будет содержать функции, а переменная y будет содержать цель.

X = iris.data[:, :2]
y = iris.target

Создание модели

Затем мы создадим модели алгоритмов svm в наборе данных Iris и будем использовать разные ядра для наблюдения за результатами.

Мы сохраним значение C = 1.0 для всех моделей.

C = 1.0  # SVM regularization parameter
models = (svm.SVC(kernel='linear', C=C),
          svm.LinearSVC(C=C, max_iter=10000),
          svm.SVC(kernel='rbf', gamma=0.7, C=C),
          svm.SVC(kernel='poly', degree=3, gamma='auto', C=C))
models = (clf.fit(X, y) for clf in models)

Мы создали 4 модели:

  1. svm.SVC с линейным ядром и значением C, равным 1.0
  2. svm.LinearSVC (который использует liblinear) с тем же значением C
  3. svm.SVC с ядром rbf
  4. svm.SVC с ядром = «поли», степенью = 3, гаммой = «авто» и значением по умолчанию C

Сделать сетку

Затем мы определим функцию для создания сетки для построения наших 4 моделей.

def make_meshgrid(x, y, h=.02):
    x_min, x_max = x.min() - 1, x.max() + 1
    y_min, y_max = y.min() - 1, y.max() + 1
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
                         np.arange(y_min, y_max, h))
    return xx, yy

Построение контуров

Эта функция будет вызываться для построения границ решения для классификаторов.

def plot_contours(ax, clf, xx, yy, **params):
    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    out = ax.contourf(xx, yy, Z, **params)
    return out

Сюжет

Затем мы определим заголовки каждого графика и настроим сетку 2x2 для построения графиков наших 4 классификаторов.

Затем мы по очереди подгоним модель к набору данных Iris и построим график результатов:

# title for the plots
titles = ('SVC with linear kernel',
          'LinearSVC (linear kernel)',
          'SVC with RBF kernel',
          'SVC with polynomial (degree 3) kernel')
# Set-up 2x2 grid for plotting.
fig, sub = plt.subplots(2, 2)
plt.subplots_adjust(wspace=0.4, hspace=0.4)
X0, X1 = X[:, 0], X[:, 1]
xx, yy = make_meshgrid(X0, X1)
for clf, title, ax in zip(models, titles, sub.flatten()):
    plot_contours(ax, clf, xx, yy,
                  cmap=plt.cm.coolwarm, alpha=0.8)
    ax.scatter(X0, X1, c=y, cmap=plt.cm.coolwarm, s=20, edgecolors='k')
    ax.set_xlim(xx.min(), xx.max())
    ax.set_ylim(yy.min(), yy.max())
    ax.set_xlabel('Sepal length')
    ax.set_ylabel('Sepal width')
    ax.set_xticks(())
    ax.set_yticks(())
    ax.set_title(title)
plt.show()

Далее следует сюжет:

Длина чашелистиков отложена по оси x, а ширина чашелистиков отложена по оси y.

Вывод

В этой статье мы реализовали алгоритм svm.SVC для набора данных Iris с использованием ряда комбинаций ядер. Как видно, алгоритм SVC с линейным ядром разделяет границу линейным образом.

LinearSVC также соответствует линейному расположению данных, однако отличается от предыдущего формой.

Ядро rbf (радиальная базисная функция) не является линейным, оно соответствует данным нелинейным способом и является хорошим инструментом для задач нелинейной классификации.

SVC с полиномиальной степенью 3 является сложной моделью и может использоваться в сложных задачах машинного обучения. Когда возникает линейная проблема, лучше всего использовать svm.SVC с ядром = ‘linear’!