Сюжет scikit-learn (sklearn) SVM решение границы / поверхности

В настоящее время я выполняю многоклассный SVM с линейным ядром, используя библиотеку scikit Python. Типовые данные обучения и данные тестирования приведены ниже:

Данные модели:

x = [[20,32,45,33,32,44,0],[23,32,45,12,32,66,11],[16,32,45,12,32,44,23],[120,2,55,62,82,14,81],[30,222,115,12,42,64,91],[220,12,55,222,82,14,181],[30,222,315,12,222,64,111]]
y = [0,0,0,1,1,2,2]

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

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

2 ответа

Решение

Вы должны выбрать только 2 функции, чтобы сделать это. Причина в том, что вы не можете построить график 7D. После выбора 2 функций используйте только эти для визуализации поверхности решения.

Теперь следующий вопрос, который вы бы задали, если How can I choose these 2 features?, Ну, есть много способов. Вы могли бы сделать univariate F-value (feature ranking) test и посмотрите, какие функции / переменные являются наиболее важными. Тогда вы могли бы использовать их для сюжета. Также мы можем уменьшить размерность с 7 до 2, используя PCA например.


2D-график для 2 объектов и использование набора данных радужной оболочки

from sklearn.svm import SVC
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm, datasets

iris = datasets.load_iris()
# Select 2 features / variable for the 2D plot that we are going to create.
X = iris.data[:, :2]  # we only take the first two features.
y = iris.target

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

model = svm.SVC(kernel='linear')
clf = model.fit(X, y)

fig, ax = plt.subplots()
# title for the plots
title = ('Decision surface of linear SVC ')
# Set-up grid for plotting.
X0, X1 = X[:, 0], X[:, 1]
xx, yy = make_meshgrid(X0, X1)

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_ylabel('y label here')
ax.set_xlabel('x label here')
ax.set_xticks(())
ax.set_yticks(())
ax.set_title(title)
ax.legend()
plt.show()


РЕДАКТИРОВАТЬ: применить PCA, чтобы уменьшить размерность.

from sklearn.svm import SVC
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm, datasets
from sklearn.decomposition import PCA

iris = datasets.load_iris()

X = iris.data  
y = iris.target

pca = PCA(n_components=2)
Xreduced = pca.fit_transform(X)

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

model = svm.SVC(kernel='linear')
clf = model.fit(Xreduced, y)

fig, ax = plt.subplots()
# title for the plots
title = ('Decision surface of linear SVC ')
# Set-up grid for plotting.
X0, X1 = Xreduced[:, 0], Xreduced[:, 1]
xx, yy = make_meshgrid(X0, X1)

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_ylabel('PC2')
ax.set_xlabel('PC1')
ax.set_xticks(())
ax.set_yticks(())
ax.set_title('Decison surface using the PCA transformed/projected features')
ax.legend()
plt.show()

Вы можете использовать mlxtend. Это довольно чисто.

Сначала сделайте pip install mlxtend, а потом:

from sklearn.svm import SVC
import matplotlib.pyplot as plt
from mlxtend.plotting import plot_decision_regions

svm = SVC(C=0.5, kernel='linear')
svm.fit(X, y)
plot_decision_regions(X, y, clf=svm, legend=2)
plt.show()

Где X - это двумерная матрица данных, а y - связанный вектор обучающих меток.

Вы также можете использовать пакет seaborn, где у вас есть возможность делать диаграммы рассеяния между объектами, как можно увидеть здесь. пример морского парного заговора

Другие вопросы по тегам