scikit-learn 的 svm predict_proba 的令人困惑的概率
Confusing probabilities of the predict_proba of scikit-learn's svm
我的目的是根据特定 class 每个样本的排序概率绘制 PR 曲线。但是,我发现当我使用两个不同的标准数据集时,svm 的 predict_proba() 获得的概率有两种不同的行为:虹膜和数字。
第一种情况用下面python代码的"iris"情况进行评估,合理的工作是class获得最高概率。
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]
接下来,它会产生如下输出。显然,每个样本的最高概率与 predict() 的输出匹配:样本 #1 的 0.97181088 和样本 #2 的 0.96961523。
(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]]
然而,当我使用以下代码将数据集更改为 "digits" 时,概率揭示了一个相反的现象,即每个样本的最低概率以 0.00190932 的概率支配 predict() 的输出标签样本 #1 和样本 #2 的 0.00220549。
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() 的解决方案。但是,由于我的任务,我仍然必须专注于 SVM 的卡方核。
有什么解决办法吗?
与 documentation states 一样,无法保证 predict_proba
和 predict
会在 SVC 上给出一致的结果。
您可以简单地使用 decision_function
。对于线性和核 SVM 都是如此。
我的目的是根据特定 class 每个样本的排序概率绘制 PR 曲线。但是,我发现当我使用两个不同的标准数据集时,svm 的 predict_proba() 获得的概率有两种不同的行为:虹膜和数字。
第一种情况用下面python代码的"iris"情况进行评估,合理的工作是class获得最高概率。
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]
接下来,它会产生如下输出。显然,每个样本的最高概率与 predict() 的输出匹配:样本 #1 的 0.97181088 和样本 #2 的 0.96961523。
(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]]
然而,当我使用以下代码将数据集更改为 "digits" 时,概率揭示了一个相反的现象,即每个样本的最低概率以 0.00190932 的概率支配 predict() 的输出标签样本 #1 和样本 #2 的 0.00220549。
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() 的解决方案。但是,由于我的任务,我仍然必须专注于 SVM 的卡方核。
有什么解决办法吗?
与 documentation states 一样,无法保证 predict_proba
和 predict
会在 SVC 上给出一致的结果。
您可以简单地使用 decision_function
。对于线性和核 SVM 都是如此。