SVM-Klassifizierungsfehler von sklearn

Oct 04 2020

Ich versuche, einen trivialen Klassifikator zu verwenden, bin mir aber nicht sicher, was ich falsch mache. Ich versorge den linearen Klassifikator svm.SVC von scikit-learn mit zwei Stichproben von X = [[0.], [0.5]] und den Bezeichnungen y = [0, 1] und erhalte eine perfekte Klassifizierung, aber dann, wenn ich einen anderen Tag hinzufüge Probe auf X von [0.4] und das entsprechende Label 1 auf y und versuche erneut zu passen, die Klassifizierung schlägt fehl und ich bekomme immer eine Vorhersage von 1. Warum scheitert es?

Beispielcode:

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))

und die Ausgabe:

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]

Antworten

1 gunes Oct 04 2020 at 15:47

Es besteht ein Gleichgewicht zwischen der Randbreite und dem Fehlklassifizierungsfehler (abhängig von den Durchhangvariablen). Offenbar$C=1$begünstigt die Randbreite mehr. Wenn Sie es erhöhen und es zwingen, Fehlklassifizierungen stärker zu bestrafen, wird es einen besseren Aufteilungspunkt finden.

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))

was folgendes ergibt

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]