С помощью Scikit-Learn и Google Colab

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

и узнайте, как подать заявку:

Как сделать линейные модели более гибкими?

Чтобы построить более гибкие модели, мы можем добавить больше функций, создать взаимодействие функций, добавить многочлен и так далее. Все эти методы можно разделить на две основные категории: (1) полиномиальное ядро ​​и (2) гауссовское ядро.

(1) Полиномиальное ядро

Цель полиномиального ядра — добавить дополнительные функции к существующим. С этой целью полиномиальное ядро ​​использует уже существующие функции для получения новых.

В двумерном пространстве невозможно разделить две группы наблюдений. Мы можем создать полином для функции 2, и тогда у нас будет трехмерное пространство (с тремя функциями):

  • особенность 1
  • особенность 2
  • функция 2 ** функция 2

Нового трехмерного пространства достаточно, чтобы правильно различать две группы наблюдений.

Количество полиномиальных признаков можно увеличивать по мере необходимости, пока не будет достигнута оптимальная точность. При вычислении трюка с ядром с помощью SciKit-Learn нам не нужно вручную добавлять эти функции, поскольку математическая модель применит их «внутри».

(2) Гауссово ядро

Чтобы объяснить вам ядро ​​Гаусса, я буду использовать визуализацию, так как она может быть более интуитивной, чем объяснение всей математики. Итак, давайте подумаем о точках данных в одномерном пространстве (1-D):

Мы видим, что невозможно провести линию, эффективно разделяющую два класса точек. Однако с помощью ядра Гаусса мы можем нарисовать две кривые Гаусса и разделить класс в перехвате:

И теперь мы видим, что можно различать группы. Но что происходит в многомерном пространстве?

Ядро Гаусса построит несколько кривых Гаусса в многомерном пространстве, чтобы построить эффективную модель. Ядро Гаусса в многомерном пространстве будет выглядеть так:

И теперь наши точки данных будут раздельными:

Если у вас есть более сложные данные, ядро ​​Гаусса будет продолжаться до N-мерного пространства, а алгоритм оптимизирован для различения двух классов наблюдений.

Требования к предварительной обработке:

Ядерные машины опорных векторов требуют, чтобы данные были предварительно обработаны в одном и том же масштабе. Чтобы узнать больше о препроцессинге и о том, как его выполнить для ваших данных, посмотрите мою статью:

Параметры в Kernelized SVM

Есть три основных параметра, которыми вы можете управлять при построении модели Kernelized SVM:

  • Тип ядра: «rbf» (по умолчанию — гауссовский), «linear» (простой SVM) и «poly» (полиномиальный);
  • гамма: управляет расширением преобразования ядра;
  • C: управляет важностью каждой точки (по умолчанию = 1).

Преимущества ядра SVM:

→ Хорошо работает со сложными данными
→ Хорошо работает с большим количеством функций, но также и с небольшим количеством функций.

Недостатки ядра SVM:

→ Сложно (или невозможно) понять модель и то, как принимаются решения;
→ Плохо масштабировать наборы данных, превышающие 10 000 наблюдений;
→ Требовать тщательной предварительной обработки данных.

Теперь, когда мы уже разобрались с основами, давайте попробуем на примере. В этом примере я буду использовать набор данных wine.csv.

#Import and load dataframe:
import pandas as pd
df = pd.read_csv('/content/Wine.csv')
#Check dataframe:
df.head()

Из предыдущей работы с этим набором данных я знаю, что функция Customer_Segment имеет 3 значения. Чтобы упростить этот пример, я выберу только 2 значения (бинарная классификация), но всю работу здесь можно применить к данным с 2 или более категориями.

#Select only Customer segment 1 and 2:
df = df.loc[df['Customer_Segment'].isin([1, 2])]
#Inspect dataframe variables:
df.describe()

Как видите, объекты данных находятся в разных масштабах. Чтобы применить Kernelized-SVM, нам нужно предварительно обработать данные с помощью StandardScaler. Мы назначим «Customer_Segment» в качестве прогнозируемой переменной y, а остальные переменные X (предикторы).

from sklearn import preprocessing
#Define X and y:
X = df.drop(['Customer_Segment'], axis=1)
y = df['Customer_Segment']
#Transform X in numpy array:
X = np.array(X)
#Define preprocessing method:
scaler = preprocessing.StandardScaler().fit(X)
#Transform X:
X_scaled = scaler.transform(X)
X = X_scaled

Теперь наши данные масштабируются. Мы можем проверить, как сейчас выглядят данные, и увидеть, что весь наш набор данных находится в одном масштабе.

#Convert np.array to pd.DataFrame:
df_scaled = pd.DataFrame(X_scaled)
#Check data scaled:
df_scaled.describe()

И теперь мы можем построить нашу модель:

from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
#Train and test split:
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20)
#Classification with polynomial kernel:
clf_poly = SVC(C=1, kernel='poly', gamma='auto').fit(X_train, y_train)
print("training set score: %f" % clf_poly.score(X_train, y_train))
print("test set score: %f" % clf_poly.score(X_test, y_test))

А теперь с гауссовым ядром:

#Classification with Gaussian kernel:
clf_gaussian = SVC(C=0.8, kernel='rbf', gamma='scale').fit(X_train, y_train)
print("training set score: %f" % clf_gaussian.score(X_train, y_train))
print("test set score: %f" % clf_gaussian.score(X_test, y_test))

Спасибо за чтение! Дайте мне знать, если у вас есть предложения по добавлению в этот список, и не забудьте подписаться, чтобы получать уведомления о моих будущих публикациях.

Если: вам понравилась эта статья, не забудьте подписаться на меня и, таким образом, получать все обновления о новых публикациях.

Остальное Если: вы хотите узнать больше, вы можете подписаться на членство в Medium с помощью моей реферальной ссылки. Это не будет стоить вам больше, но заплатит мне за кофе.

Остальное: Спасибо!