2013-12-17 1 views
4

Я пытаюсь сделать следующую простую классификацию, используя объект LinearSVC в scikit-learn. Я пробовал использовать как версии 0.10, так и 0.14. Использование кода:Почему LinearSVC не делает эту простую классификацию?

from sklearn.svm import LinearSVC, SVC 
from numpy import * 

data = array([[ 1007., 1076.], 
       [ 1017., 1009.], 
       [ 2021., 2029.], 
       [ 2060., 2085.]]) 
groups = array([1, 1, 2, 2]) 

svc = LinearSVC() 
svc.fit(data, groups) 
svc.predict(data) 

Я получаю результат:

array([2, 2, 2, 2]) 

Однако, если я заменю классификатор с

svc = SVC(kernel='linear') 

я получить результат

array([ 1., 1., 2., 2.]) 

что правильно. Кто-нибудь знает, почему использование LinearSVC приведет к этой простой проблеме?

ответ

13

алгоритм, лежащий в основе LinearSVC очень чувствителен к экстремальным значениям в своем входе:

>>> svc = LinearSVC(verbose=1) 
>>> svc.fit(data, groups) 
[LibLinear].................................................................................................... 
optimization finished, #iter = 1000 

WARNING: reaching max number of iterations 
Using -s 2 may be faster (also see FAQ) 

Objective value = -0.001256 
nSV = 4 
LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True, 
    intercept_scaling=1, loss='l2', multi_class='ovr', penalty='l2', 
    random_state=None, tol=0.0001, verbose=1) 

(. Предупреждение относится к LibLinear FAQ, так как scikit-узнать-х LinearSVC основан на этой библиотеке)

Перед установкой следует нормализовать:

>>> from sklearn.preprocessing import scale 
>>> data = scale(data) 
>>> svc.fit(data, groups) 
[LibLinear]... 
optimization finished, #iter = 39 
Objective value = -0.240988 
nSV = 4 
LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True, 
    intercept_scaling=1, loss='l2', multi_class='ovr', penalty='l2', 
    random_state=None, tol=0.0001, verbose=1) 
>>> svc.predict(data) 
array([1, 1, 2, 2])