如何在支持向量机中使用predict()函数预测的类别中得知概率?

31

我该如何知道样本属于Scikit-Learn中支持向量机预测函数predict()预测的类别的概率?

>>>print clf.predict([fv])
[5]

有任何函数吗?

5个回答

37

一定要阅读文档的这个部分,因为其中涉及到一些微妙的问题。还可以查看Scikit-learn predict_proba gives wrong answers

基本上,如果你有一个多类别问题,并且有足够的数据,如先前所建议的那样,predict_proba效果很好。否则,您可能不得不使用不能从decision_function产生概率分数的排序。

这是使用predict_proba获取类别vs概率字典或列表的不错模式:

model = svm.SVC(probability=True)
model.fit(X, Y)
results = model.predict_proba(test_data)[0]

# gets a dictionary of {'class_name': probability}
prob_per_class_dictionary = dict(zip(model.classes_, results))

# gets a list of ['most_probable_class', 'second_most_probable_class', ..., 'least_class']
results_ordered_by_probability = map(lambda x: x[0], sorted(zip(model.classes_, results), key=lambda x: x[1], reverse=True))

很棒的写作。 - Cerin

21
使用clf.predict_proba([fv])可以获得一个包含每个类别预测概率的列表。然而,并非所有分类器都提供此函数。
关于您的评论,请考虑以下内容:
>> prob = [ 0.01357713, 0.00662571, 0.00782155, 0.3841413, 0.07487401, 0.09861277, 0.00644468, 0.40790285]
>> sum(prob)
1.0

概率之和为1.0,因此乘以100可得百分比。

14

它返回预测值数组 "[[ 0.01357713 0.00662571 0.00782155 0.3841413 0.07487401 0.09861277 0.00644468 0.40790285]]",而不是概率,例如:类别8:80%,类别4:40%。 - postgres
4
这正是您在寻找的内容:7班得到40%的分数(如果第一班是“0班”的话),3班得到38%的分数,5班得到10%的分数,4班得到7%的分数。 - ogrisel

2
为了更清晰地回答问题,我再次发布来自scikit-learn的有关svm的信息。
毫无疑问,在大型数据集上涉及Platt缩放的交叉验证是一项昂贵的操作。此外,概率估计可能与分数不一致,即分数的“argmax”可能不是概率的argmax。(例如,在二元分类中,样本可能被预测为属于一个类,但根据predict_proba的结果,其概率小于½。)Platt方法也已知存在理论问题。如果需要置信度得分,但这些得分不必是概率,则建议将probability设置为False,并使用decision_function而不是predict_proba。
对于其他分类器,如随机森林、AdaBoost和Gradient Boosting,在scikit-learn中使用predict函数应该是可以的。

0

这是一种获取概率的方法

svc = SVC(probability=True)

preds_svc = svc.fit(X_train, y_train).predict(X_test)

probs_svc = svc.decision_function(X_test)#决策函数告诉我们分类器生成的超平面在哪一侧(以及我们离它有多远)。

probs_svc = (probs_svc - probs_svc.min()) / (probs_svc.max() - probs_svc.min())


probs_svc.min()和probs_svc.max()在每次推断中都会不断变化,因此计算得出的概率分数不是一致的。建议固定一个最小和最大值,然后以此方式计算分数。 - Argho Chatterjee

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