如何在sklearn中获取分类器对预测的置信度分数?

35

我想要获取每个预测的置信度分数,以显示分类器对其正确性的确定程度。

我需要类似这样的东西:

分类器在其预测上有多确定?

类别 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
1
概率对应于classifier.classes_。但是如果数据集很小,它们就没有意义 :-( 。此外,它们也不能保证与classifier.predict()匹配 :'( 。文档页面链接 - AneesAhmed777
3个回答

34

根据 SVC文档,看起来你需要更改如何构建SVC:

model = SVC(probability=True)

然后使用predict_proba方法:

class_probabilities = model.predict_proba(sub_main)

2
啊,好的,谢谢!那么你怎么把class_probabilities转换成百分比形式呢?例如,我得到了[[1.614297e-03 3.99785477e-04 5.44054423e-02 9.9254921e-01]]作为输出,但我不知道如何解释这些值,更不用说自己转换了。这些值到底代表什么意思? - user3377126
1
@user3377126 你是如何解释这些值的? - manish Prasad
概率和置信度是一样的吗?虽然predict_proba返回该观察值属于特定类别的概率/可能性,但我们如何找到确定可能性的置信度呢? - The Great
如果您有时间,可以帮忙回答这个相关问题。- https://stats.stackexchange.com/questions/560774/likelihood-vs-confidence-in-layman-terms - The Great

17

对于那些实现了predict_proba()方法的估计器,可以像Justin Peel建议的那样,直接使用predict_proba()方法来生成预测概率。

对于那些没有实现predict_proba()方法的估计器,您可以使用自助法(重复计算许多子样本中的点估计)构建置信区间。

如果您需要任何详细示例来演示这两种情况,请告诉我。


啊,好的,谢谢!那么你怎么把class_probabilities转换成百分比形式呢?例如,我得到了[[1.614297e-03 3.99785477e-04 5.44054423e-02 9.9254921e-01]]作为输出,但我不知道如何解释这些值,更不用说自己转换了。这些值到底代表什么意思? - user3377126
5
@user3377126,它们已经以百分比形式表示了。 :) 每行的总和应该恰好等于1。最后一个元素实际上是0.992,这意味着算法预测其属于此类的概率为99.2%。请注意,e-03只是科学计数法。 - Jianxun Li
啊,我现在明白了,谢谢! :) 我本来会接受你的答案的,但由于 Justin Peel 先评论并给出了适合我的示例,我决定把它给了他,对此很抱歉,但还是感谢你的建议! - user3377126
1
完全没有问题。 :) 很高兴我们都能帮忙。 - Jianxun Li
1
有没有办法将类名与概率关联起来呢?例如,如果我得到一个输入的概率列表[0.33 0.25 0.75],我知道第三个将被选中,但第三个代表哪个类别呢? - AbtPst
显示剩余2条评论

0
使用上述代码,您将获得每个样本的预测值和4个类名。您可以根据需要更改no_of_class的数量。
probas1 =model.predict_proba(sub_main)
no_of_class=4

top3_classes1 = np.argsort(-probas1, axis=1)[:, :no_of_class]

class_labels1 = rf.classes_[top3_classes1[i]] for i in range(len(top3_classes1))]

class_labels1

top_confidence1=[probas1[i][top3_classes1[i]] for i in range(len(top_classes1))]

for i in range(len(class_labels1)):

    for j in range(no_of_class):

        print(f"Sample {i}: {class_labels1[i][j]} :: {top_confidence1[i][j]}")

注意:您也可以将其转换为数据框,其中您可以添加预测类别的列和另一列中的预测值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接