2015-06-05 3 views
2

Моя цель - нарисовать PR-кривую по отсортированной вероятности каждого образца для определенного класса. Тем не менее, я обнаружил, что полученные вероятности svm's pred_proba() имеют два разных поведения, когда я использую два разных стандартных набора данных: диафрагму и цифры.Сбивание вероятностей предсказания svm scikit-learn svm scikit-learn

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

D = datasets.load_iris() 
clf = SVC(kernel=chi2_kernel, probability=True).fit(D.data, D.target) 
output_predict = clf.predict(D.data) 
output_proba = clf.predict_proba(D.data) 
output_decision_function = clf.decision_function(D.data) 
output_my = proba_to_class(output_proba, clf.classes_) 

print D.data.shape, D.target.shape 
print "target:", D.target[:2] 
print "class:", clf.classes_ 
print "output_predict:", output_predict[:2] 
print "output_proba:", output_proba[:2] 

Затем он производит выходные данные, как показано ниже. По-видимому, самая высокая вероятность каждого образца соответствует выходам прогноза(): 0,97181088 для образца №1 и 0,96961523 для образца № 2.

(150, 4) (150,) 
target: [0 0] 
class: [0 1 2] 
output_predict: [0 0] 
output_proba: [[ 0.97181088 0.01558693 0.01260218] 
[ 0.96961523 0.01702481 0.01335995]] 

Однако, когда я изменить набор данные на «цифру» со следующим кодом, вероятности показывают обратное явление, что самая низкая вероятность каждого образца доминирует выводимые метки прогнозировани() с вероятностью 0.00190932 для образец №1 и 0,00220549 для образца №2.

D = datasets.load_digits() 

Выходы:

(1797, 64) (1797,) 
target: [0 1] 
class: [0 1 2 3 4 5 6 7 8 9] 
output_predict: [0 1] 
output_proba: [[ 0.00190932 0.11212957 0.1092459 0.11262532  0.11150733 0.11208733 
0.11156622 0.11043403 0.10747514 0.11101985] 
[ 0.10991574 0.00220549 0.10944998 0.11288081 0.11178518 0.11234661 
0.11182221 0.11065663 0.10770783 0.11122952]] 

Я прочитал this post и это приводит решение с использованием линейной SVM с decision_function(). Однако из-за моей задачи мне все еще нужно сосредоточиться на ядре chi-squared для SVM.

Любые решения?

+0

Поскольку вы уже поняли это, каков ваш вопрос? – omerbp

+0

Мой вопрос заключается в том, как нарисовать кривую PR для вывода квадратного СВМ квадрата. Благодаря :) – user3030046

ответ

1

Как documentation states, нет никаких гарантий, что predict_proba и predict даст согласованные результаты по SVC. Вы можете просто использовать decision_function. Это справедливо как для линейного, так и для ядра SVM.

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