С помощью 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 с помощью моей реферальной ссылки. Это не будет стоить вам больше, но заплатит мне за кофе.
Остальное: Спасибо!