6

Я хотел бы получить оценку доверия каждого из прогнозов, которые она делает, показывая, насколько уверен, что классификатор в своем предсказании, что это правильно.Как получить оценку доверия классификатора для предсказания в sklearn?

Я хочу что-то вроде этого:

Как уверен, классификатор на его предсказания?

Класс 1: 81%, что это класс 1
Класс 2: 10%
Класс 3: 6%
Класс 4: 3%

Образцы моего кода:

features_train, features_test, labels_train, labels_test = cross_validation.train_test_split(main, target, test_size = 0.4) 

# Determine amount of time to train 
t0 = time() 
model = SVC() 
#model = SVC(kernel='poly') 
#model = GaussianNB() 

model.fit(features_train, labels_train) 

print 'training time: ', round(time()-t0, 3), 's' 

# Determine amount of time to predict 
t1 = time() 
pred = model.predict(features_test) 

print 'predicting time: ', round(time()-t1, 3), 's' 

accuracy = accuracy_score(labels_test, pred) 

print 'Confusion Matrix: ' 
print confusion_matrix(labels_test, pred) 

# Accuracy in the 0.9333, 9.6667, 1.0 range 
print accuracy 



model.predict(sub_main) 

# Determine amount of time to predict 
t1 = time() 
pred = model.predict(sub_main) 

print 'predicting time: ', round(time()-t1, 3), 's' 

print '' 
print 'Prediction: ' 
print pred 

Я подозреваю, что буду использовать функцию score(), но я, похоже, продолжаю ее правильно выполнять. Я не знаю, является ли это правильной функцией или нет, но как получить доверительный процент от прогноза классификатора?

+1

действительно полезный вопрос. есть ли способ связать имена классов с вероятностями? например, если я получу следующий список вероятностей для ввода [0,33 0,25 0,75]. я знаю, что третья будет выбрана, но к какому классу относится третий? – AbtPst

+0

вероятности соответствуют «classifier.classes_». Но они не имеют смысла, если набор данных невелик :-(Более того, они также не гарантируют соответствие с 'classifier.predict()': '(. [Ссылка на страницу документов] (http: // scikit- learn.org/stable/modules/generated/sklearn.svm.SVC.html#sklearn.svm.SVC.predict) – AneesAhmed777

ответ

8

Пер с SVC documentation, похоже, что вам нужно изменить, как вы строите SVC:

model = SVC(probability=True) 

, а затем использовать метод predict_proba:

class_probabilities = model.predict_proba(sub_main) 
+0

Ну ладно, спасибо! И как бы вы перевели class_probabilities в процентную форму? Например, я получил [[1.614297] e-03 3.99785477e-04 5.44054423e-02 9.9254921e-01]], но я не знаю, как интерпретировать эти значения, не говоря уже об их самообращении. Что именно означают эти значения? – user3377126

+0

Ничего, Я получил это. Спасибо! – user3377126

3

Для тех оценок, реализующий predict_proba() метод, как Джастин Пил предложил, вы можете просто использовать predict_proba(), чтобы получить вероятность на ваш прогноз.

Для тех, кто не реализует метод predict_proba(), вы можете построить доверительный интервал самостоятельно, используя концепцию начальной загрузки (многократно вычисляйте ваши точечные оценки во многих подвыборках).

Сообщите мне, если вам нужны подробные примеры, чтобы продемонстрировать любой из этих двух случаев.

+0

Ах, ладно, спасибо! И как бы вы перевели class_probabilities в процентную форму? Например, я получил [[1.614297e-03 3.99785477e-04 5.44054423e-02 9.9254921e-01]] как но я не знаю, как интерпретировать эти значения, не говоря уже о том, чтобы преобразовать их самостоятельно. Что именно означают эти значения? – user3377126

+3

@use r3377126 Они уже в процентном выражении. :) Сумма каждой строки должна быть ровно равна 1. Последний элемент равен 0.992, что означает, что алгоритм предсказывает, что он принадлежит этому классу с вероятностью 99,2%. Примечание 'e-03' - это просто научная нотация. –

+0

А теперь я вижу, спасибо! :) Я бы принял ваш ответ, но так как Джастин Пил сначала прокомментировал пример, который работал на меня, я решил отдать его ему, извините, но спасибо за совет! – user3377126