2017-02-10 3 views
0

У меня есть набор данных с образцами, помеченными как «0» или «1».Значения меток для бинарных классификаторов sklearn

Должны ли эти метки быть «-1» и «1» для правильной классификации?

Я не уверен, какие функции потерь склеронные классификаторы минимизируют. Может быть, он полагается на значения как «1» или «-1»?

ответ

1

sklearn классификаторы обычно могут использовать различные функции потерь или штрафы. Все, хотя я не могу найти это документально, где-то, по моему опыту, обычно разумно относиться к классам, в которые вы проходите. Фактические решатели используют внешние библиотеки, поэтому под капотом, вероятно, происходит какая-то дезинфекция. Но в целом, я считаю, эти работы из коробки:

>>> from sklearn.linear_model import LogisticRegression 
>>> import numpy as np 
>>> X = np.random.randint(0,10,(20,5)) 
>>> y1 = np.random.choice([-1,1], 20) 
>>> y2 = np.random.choice([0,1], 20) 
>>> y1 
array([-1, -1, 1, -1, -1, 1, -1, 1, -1, 1, 1, -1, 1, -1, -1, -1, 1, 
     1, -1, 1]) 
>>> y2 
array([0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0]) 
>>> model1, model2 = LogisticRegression(), LogisticRegression() 
>>> model1.fit(X,y1) 
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True, 
      intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1, 
      penalty='l2', random_state=None, solver='liblinear', tol=0.0001, 
      verbose=0, warm_start=False) 
>>> model2.fit(X, y2) 
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True, 
      intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1, 
      penalty='l2', random_state=None, solver='liblinear', tol=0.0001, 
      verbose=0, warm_start=False) 
>>> model1.predict(X) 
array([-1, 1, 1, -1, 1, -1, -1, 1, -1, -1, 1, 1, 1, -1, -1, -1, -1, 
     1, -1, 1]) 
>>> model2.predict(X) 
array([1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0]) 
>>> y1 
array([-1, -1, 1, -1, -1, 1, -1, 1, -1, 1, 1, -1, 1, -1, -1, -1, 1, 
     1, -1, 1]) 
>>> y2 
array([0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0]) 

Или даже:

>>> y3 = np.random.choice(['a','b'], 20) 
>>> model3 = LogisticRegression() 
>>> model3.fit(X,y3) 
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True, 
      intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1, 
      penalty='l2', random_state=None, solver='liblinear', tol=0.0001, 
      verbose=0, warm_start=False) 
>>> model3.classes_ 
array(['a', 'b'], 
     dtype='<U1') 
>>> model3.predict(X) 
array(['b', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'b', 'b', 'a', 'a', 'a', 
     'a', 'b', 'b', 'a', 'a', 'a', 'a'], 
     dtype='<U1') 

Или, используя метод опорных векторов:

>>> from sklearn.svm import LinearSVC 
>>> svm1 = LinearSVC() 
>>> svm1.fit(X,y1) 
LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True, 
    intercept_scaling=1, loss='squared_hinge', max_iter=1000, 
    multi_class='ovr', penalty='l2', random_state=None, tol=0.0001, 
    verbose=0) 
>>> svm1.predict(X) 
array([-1, 1, -1, -1, 1, -1, -1, 1, -1, -1, 1, 1, 1, -1, -1, -1, 1, 
     1, -1, 1]) 
>>> svm2 = LinearSVC() 
>>> svm2.fit(X,y3) 
LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True, 
    intercept_scaling=1, loss='squared_hinge', max_iter=1000, 
    multi_class='ovr', penalty='l2', random_state=None, tol=0.0001, 
    verbose=0) 
>>> svm2.predict(X) 
array(['b', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 
     'a', 'a', 'a', 'a', 'a', 'a', 'a'], 
     dtype='<U1') 

Просто всегда читать документацию вашего классификатор, и я думаю, что если бы он принимал только конкретный тип схемы маркировки, он был бы документирован.

Смежные вопросы