échec de la classification SVM de sklearn
J'essaie d'adapter un classificateur trivial mais je ne suis pas sûr de ce que je fais de mal. Je fournis le classificateur linéaire svm.SVC de scikit-learn avec deux échantillons de X = [[0.], [0.5]] et des étiquettes y = [0, 1] et j'obtiens une classification parfaite, mais quand j'ajoute un autre tag échantillon à X de [0,4], et l'étiquette correspondante 1 à y, et essayez à nouveau d'ajuster, la classification échoue et j'obtiens toujours une prédiction de 1. Pourquoi échoue-t-elle?
Exemple de code:
from sklearn import svm
import numpy as np
clf = svm.SVC(C=1, kernel='linear')
X = [[0.], [0.5]]
y = [0, 1]
clf.fit(X, y)
print('coefs: ', clf.coef_)
print('svs: ', clf.support_vectors_)
if np.all(y == clf.predict(X)):
print('classification worked')
else:
print('classification failed:')
print('X=', X, ',y=', y, ' ,prediction=', clf.predict(X))
print('\n\n')
X.append([0.4])
y.append(1)
clf = svm.SVC(C=1, kernel='linear')
clf.fit(X, y)
print('coefs: ', clf.coef_)
print('svs: ', clf.support_vectors_)
if np.all(y == clf.predict(X)):
print('classification worked')
else:
print('classification failed:')
print('X=', X, ',y=', y, ' ,prediction=', clf.predict(X))
et la sortie:
coefs: [[0.5]]
svs: [[0. ]
[0.5]]
classification worked
X= [[0.0], [0.5]] ,y= [0, 1] ,prediction= [0 1]
coefs: [[0.4]]
svs: [[0. ]
[0.4]]
classification failed:
X= [[0.0], [0.5], [0.4]] ,y= [0, 1, 1] ,prediction= [1 1 1]
Réponses
Il existe un équilibre entre la largeur de la marge et l'erreur de classification erronée (en fonction des variables d'écart). Apparemment$C=1$favorise davantage la largeur de la marge. Si vous l'augmentez, en le forçant à pénaliser plus sévèrement les erreurs de classification, il trouvera un meilleur point de partage.
from sklearn import svm
import numpy as np
clf = svm.SVC(C=1, kernel='linear')
X = [[0.], [0.5]]
y = [0, 1]
clf.fit(X, y)
print('coefs: ', clf.coef_)
print('svs: ', clf.support_vectors_)
if np.all(y == clf.predict(X)):
print('classification worked')
else:
print('classification failed:')
print('X=', X, ',y=', y, ' ,prediction=', clf.predict(X))
print('\n\n')
X.append([0.4])
y.append(1)
clf = svm.SVC(C=10, kernel='linear')
clf.fit(X, y)
print('coefs: ', clf.coef_)
print('svs: ', clf.support_vectors_)
if np.all(y == clf.predict(X)):
print('classification worked')
else:
print('classification failed:')
print('X=', X, ',y=', y, ' ,prediction=', clf.predict(X))
ce qui donne ce qui suit
coefs: [[0.5]]
svs: [[0. ]
[0.5]]
classification worked
X= [[0.0], [0.5]] ,y= [0, 1] ,prediction= [0 1]
coefs: [[4.]]
svs: [[0. ]
[0.4]]
classification worked
X= [[0.0], [0.5], [0.4]] ,y= [0, 1, 1] ,prediction= [0 1 1]