30

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

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

有什么功能吗?

4

4 回答 4

35

一定要阅读文档的这一部分,因为其中涉及一些微妙之处。另见Scikit-learn predict_proba 给出错误答案

基本上,如果您有一个包含大量数据的多类问题,predict_proba 就像之前建议的那样效果很好。否则,您可能不得不使用不会从决策函数中产生概率分数的排序。

这是使用 predict_proba 获取字典或类别与概率列表的一个很好的主题:

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))
于 2013-12-26T03:44:53.353 回答
19

使用 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 得到百分比。

于 2013-02-22T07:30:05.817 回答
13

在创建 SVC 类以通过设置计算概率估计时probability=True

http://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html

然后fit像往常一样打电话,然后predict_proba([fv])

于 2013-02-22T08:26:45.880 回答
2

为了更清楚的答案,我再次发布来自 scikit-learn for svm 的信息。

不用说,Platt 缩放中涉及的交叉验证对于大型数据集来说是一项昂贵的操作。此外,概率估计可能与分数不一致,因为分数的“argmax”可能不是概率的argmax。(例如,在二元分类中,根据 predict_proba,可以通过 predict 将样本标记为属于概率 < 1/2 的类别。) Platt 的方法也存在理论问题。如果需要置信度分数,但不一定是概率,则建议设置probability=False 并使用decision_function 而不是predict_proba。

对于随机森林、AdaBoost、Gradient Boosting 等其他分类器,在 scikit-learn 中使用 predict 函数应该没问题。

于 2018-03-29T03:44:53.970 回答