Fallo de clasificación SVM de sklearn

Oct 04 2020

Estoy tratando de ajustar un clasificador trivial, pero no estoy seguro de qué estoy haciendo mal. Estoy proporcionando el clasificador lineal svm.SVC de scikit-learn con dos muestras de X = [[0.], [0.5]] y etiquetas y = [0, 1] y obtengo una clasificación perfecta, pero luego cuando agrego otro etiquetado muestra a X de [0.4], y la etiqueta correspondiente 1 ay, y trato de ajustar de nuevo, la clasificación falla y siempre obtengo una predicción de 1. ¿Por qué falla?

Código de muestra:

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

y la salida:

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]

Respuestas

1 gunes Oct 04 2020 at 15:47

Existe un equilibrio entre el ancho del margen y el error de clasificación errónea (dependiendo de las variables de holgura). Aparentemente$C=1$favorece más el ancho del margen. Si lo aumenta, obligándolo a penalizar más severamente la clasificación errónea, encontrará un mejor punto de división.

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

que produce lo siguiente

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]