Błąd klasyfikacji SVM sklearn

Oct 04 2020

Próbuję dopasować trywialny klasyfikator, ale nie jestem pewien, co robię źle. Dostarczam klasyfikator liniowy svm.SVC scikit-learn z dwiema próbkami X = [[0.], [0.5]] i etykietami y = [0, 1] i otrzymuję doskonałą klasyfikację, ale kiedy dodam kolejną oznaczoną próbka do X wynosząca [0,4] i odpowiadająca jej etykieta od 1 do y, i próbuję ponownie dopasować, klasyfikacja zawodzi i zawsze otrzymuję prognozę równą 1. Dlaczego się nie udaje?

Przykładowy kod:

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

i wyjście:

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]

Odpowiedzi

1 gunes Oct 04 2020 at 15:47

Istnieje równowaga między szerokością marginesu a błędem błędnej klasyfikacji (w zależności od zmiennych zapasu). Widocznie$C=1$bardziej preferuje szerokość marginesu. Jeśli go zwiększysz, zmuszając go do surowszego karania błędnej klasyfikacji, znajdzie lepszy punkt podziału.

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

co daje następujący wynik

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]