Как выполнить мультиклассовый SVM в python - PullRequest
0 голосов
/ 09 июля 2020

Я могу понять, как кодировать двоичную SVM, например простую метку 1, -1. Однако я выхожу за пределы своей зоны комфорта, чтобы попробовать выполнить мультиклассовый и, по сути, многокомпонентный SVM. Однако я нигде не могу найти, как это сделать.

Я собираюсь использовать набор данных iris, который имеет три класса. Итак, как выполнить три метки? Это просто -2, -1, 1 или 2, 1, -1?

Например, чем отличается способ обучения SVM с двумя классами, а затем с тремя. Я пытаюсь реализовать это с нуля, чтобы действительно хорошо понять, а не просто использовать библиотеки, чтобы помочь мне. . Спасибо за ваше время

1 Ответ

0 голосов
/ 09 июля 2020

Я считаю, что здесь была бы полезна библиотека sklearn. Согласно документации scikit-learn (https://scikit-learn.org/stable/modules/svm.html), класс sklearn.svm.SVC «способен выполнять двоичную и мультиклассовую классификацию набора данных».

Метки могут фактически возьмите любой набор целых чисел, если они различны (например, {-1, 1, 2} и {0, 1, 2} и {1, 2, 3} все допустимы). Как правило, я считаю, что для присвоения ярлыков рекомендуется использовать {0, 1, 2, ..., N}.

См. Пример в приведенном ниже коде:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC

N = 1000  # Number of samples

# Create synthetic dataset
X1 = np.random.normal(loc=0, scale=1, size=(N, 2))
Y1 = 0 * np.ones(shape=(1000,))  # LABEL = 0 

X2 = np.random.normal(loc=[-5, 5], scale=1, size=(N, 2))
Y2 = 1 * np.ones(shape=(1000,))  # LABEL = 1

X3 = np.random.normal(loc=[5, -5], scale=1, size=(N, 2))
Y3 = 2 * np.ones(shape=(1000,))  # LABEL = 2

# Create stacked dataset
X = np.vstack((X1, X2, X3))
Y = np.hstack((Y1, Y2, Y3))

# TRAIN SVM LEARNING ALGORITHM
clf = SVC(kernel='linear')
clf = clf.fit(X, Y)

# create decision boundary plot
xx, yy = np.meshgrid(
    np.arange(-10, 10, 0.2),
    np.arange(-10, 10, 0.2))
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

# PLOT EVERYTHING
plt.scatter(X1[:,0], X1[:,1], color='r')
plt.scatter(X2[:,0], X2[:,1], color='b')
plt.scatter(X3[:,0], X3[:,1], color='y')
plt.contourf(xx,yy,Z,cmap=plt.cm.coolwarm, alpha=0.8)
plt.title("SVM With Linear Kernel and Three Labels (0, 1, 2)")
plt.show()

введите описание изображения здесь Надеюсь, это поможет!

...