2017-10-01 3 views
1

J'essaie de tracer l'hyperplan pour le modèle que j'ai entraîné avec LinearSVC et sklearn. Notez que je travaille avec des langues naturelles; avant d'ajuster le modèle, j'ai extrait des fonctionnalités avec CountVectorizer et TfidfTransformer.Hyperplan de tracé Linear SVM python

Voici le classificateur:

from sklearn.svm import LinearSVC 
from sklearn import svm 

clf = LinearSVC(C=0.2).fit(X_train_tf, y_train) 

Puis j'ai essayé de tracer comme l'a suggéré on the Scikit-learn website:

# get the separating hyperplane 
w = clf.coef_[0] 
a = -w[0]/w[1] 
xx = np.linspace(-5, 5) 
yy = a * xx - (clf.intercept_[0])/w[1] 

# plot the parallels to the separating hyperplane that pass through the 
# support vectors 
b = clf.support_vectors_[0] 
yy_down = a * xx + (b[1] - a * b[0]) 
b = clf.support_vectors_[-1] 
yy_up = a * xx + (b[1] - a * b[0]) 

# plot the line, the points, and the nearest vectors to the plane 
plt.plot(xx, yy, 'k-') 
plt.plot(xx, yy_down, 'k--') 
plt.plot(xx, yy_up, 'k--') 

plt.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1], 
      s=80, facecolors='none') 
plt.scatter(X[:, 0], X[:, 1], c=Y, cmap=plt.cm.Paired) 

plt.axis('tight') 
plt.show() 

Cet exemple utilise svm.SVC (kernel = 'linéaire'), alors que mon classificateur est LinearSVC . Par conséquent, je reçois cette erreur:

AttributeError       Traceback (most recent call last) 
<ipython-input-39-6e231c530d87> in <module>() 
     7 # plot the parallels to the separating hyperplane that pass through the 
     8 # support vectors 
----> 9 b = clf.support_vectors_[0] 
    1 yy_down = a * xx + (b[1] - a * b[0]) 
    11 b = clf.support_vectors_[-1] 

AttributeError: 'LinearSVC' object has no attribute 'support_vectors_' 

Comment puis-je tracer avec succès le hyperplan de mon classificateur LinearSVC?

+0

Ici, il est: http://scikit-learn.org/0.18/auto_examples/svm/plot_separating_hyperplane.html – Alex

+0

Je sais que dans cet exemple, ils utilisent un autre noyau pour SVM linéaire, mais Je voudrais tracer mon classificateur – Alex

+0

Eh bien la question se lit comme vous cherchez la raison de l'erreur, mais comme la documentation indique clairement: * "Notez que LinearSVC n'accepte pas le noyau de mot-clé, comme cela est supposé être linéaire. Il manque aussi certains des membres de SVC et de NuSVC, comme 'support_'." * Je ne sais pas grand chose sur l'utilisation de LinearSVC, mais je suppose que vous pourriez reformuler la question pour indiquer clairement que vous voulez une sortie similaire s 'SVC', mais utilise' LinearSVC' à la place, qui n'a pas d'attribut '' support_vectors_''. De cette façon, les gens n'ont pas besoin de creuser profondément pour trouver l'évidence. – ImportanceOfBeingErnest

Répondre

1

Qu'en est-il de quitter le support_, ce qui n'est pas défini pour un LinearSVC?

import numpy as np 
import matplotlib.pyplot as plt 
from sklearn import svm 

np.random.seed(0) 
X = np.r_[np.random.randn(20, 2) - [2, 2], np.random.randn(20, 2) + [2, 2]] 
Y = [0] * 20 + [1] * 20 

fig, ax = plt.subplots() 
clf2 = svm.LinearSVC(C=1).fit(X, Y) 

# get the separating hyperplane 
w = clf2.coef_[0] 
a = -w[0]/w[1] 
xx = np.linspace(-5, 5) 
yy = a * xx - (clf2.intercept_[0])/w[1] 

# create a mesh to plot in 
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1 
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1 
xx2, yy2 = np.meshgrid(np.arange(x_min, x_max, .2), 
        np.arange(y_min, y_max, .2)) 
Z = clf2.predict(np.c_[xx2.ravel(), yy2.ravel()]) 

Z = Z.reshape(xx2.shape) 
ax.contourf(xx2, yy2, Z, cmap=plt.cm.coolwarm, alpha=0.3) 
ax.scatter(X[:, 0], X[:, 1], c=Y, cmap=plt.cm.coolwarm, s=25) 
ax.plot(xx,yy) 

ax.axis([x_min, x_max,y_min, y_max]) 
plt.show() 

enter image description here

+0

Il échoue à cette ligne: ----> 8 x_min, x_max = X [:, 0] .min() - 1, X [:, 0] .max() + 1 Erreur: TypeError: type non vérifiable : 'tranche' – Alex

+0

Oui, je cours le code exact. J'utilise python 3.6, sklearn 0.19, numpy 1.13 – Alex

+0

J'ai essayé de redémarrer le noyau et maintenant ça marche. Mais maintenant, comment puis-je tracer l'hyperplan du modèle que j'ai formé? – Alex