sklearn의 SVM 분류 실패

Oct 04 2020

나는 사소한 분류기를 맞추려고 노력하고 있지만 내가 뭘 잘못하고 있는지 잘 모르겠습니다. 저는 scikit-learn의 svm.SVC 선형 분류기에 X = [[0.], [0.5]]의 두 샘플과 y = [0, 1] 레이블을 제공하고 있으며 완벽한 분류를 얻었지만 다른 태그를 추가하면 X를 [0.4]로 샘플링하고 해당 레이블 1을 y로 다시 맞추려고 시도하면 분류가 실패하고 항상 1의 예측을 얻습니다. 왜 실패합니까?

샘플 코드 :

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

및 출력 :

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]

답변

1 gunes Oct 04 2020 at 15:47

여백 너비와 오 분류 오류 (슬랙 변수에 따라 다름) 사이에는 균형이 있습니다. 분명히$C=1$여백 너비를 더 선호합니다. 이 값을 늘려 오 분류에 더 심각한 페널티를 주면 더 나은 분할 지점을 찾을 수 있습니다.

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

다음을 산출합니다.

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]