无法理解 sklearn 的 SVM 的 predict_proba 函数
Having trouble understanding sklearn's SVM's predict_proba function
我在理解 sklearn 的函数时遇到了问题,希望得到一些说明。起初我以为 sklearn 的 SVM 的 predict_proba 函数给出了分类器预测的置信度,但是在我的情绪识别程序中使用它之后,我开始怀疑并觉得我误解了使用和predict_proba 函数是如何工作的。
例如,我的代码设置如下:
# Just finished training and now is splitting data (cross validation)
# and will give an accuracy after testing the accuracy of the test data
features_train, features_test, labels_train, labels_test = cross_validation.train_test_split(main, target, test_size = 0.4)
model = SVC(probability=True)
model.fit(features_train, labels_train)
pred = model.predict(features_test)
accuracy = accuracy_score(labels_test, pred)
print accuracy
# Code that records video of 17 frames and forms matrix know as
# sub_main with features that would be fed into SVM
# Few lines of code later. . .
model.predict(sub_main)
prob = model.predict_proba(sub_main)
prob_s = np.around(prob, decimals=5)
prob_s = prob_s* 100
pred = model.predict(sub_main)
print ''
print 'Prediction: '
print pred
print 'Probability: '
print 'Neutral: ', prob_s[0,0]
print 'Smiling: ', prob_s[0,1]
print 'Shocked: ', prob_s[0,2]
print 'Angry: ', prob_s[0,3]
print ''
当我测试它时,它给了我这样的东西:
Prediction:
['Neutral']
Probability:
Neutral: 66.084
Smiling: 17.875
Shocked: 11.883
Angry: 4.157
它设法有 66% 的置信度认为正确的分类是 "Neutral"。 66 紧挨着 "Neutral",这恰好是最高的数字。最高数字标有实际预测,对此我很高兴。
但最终还是最终。 . .
Prediction:
['Angry']
Probability:
Neutral: 99.309
Smiling: 0.16
Shocked: 0.511
Angry: 0.02
它做出了预测,"Angry"(顺便说一句,这是正确的分类)并且它在 "Neutral" 旁边分配了 99.3% 的置信度。尽管预测完全不同,但最高置信度(最高数字)被分配给中性。
有时它也这样做:
Prediction:
['Smiling']
Probability:
Neutral: 0.0
Smiling: 0.011
Shocked: 0.098
Angry: 99.891
Prediction:
['Angry']
Probability:
Neutral: 99.982
Smiling: 0.0
Shocked: 0.016
Angry: 0.001
我不理解 SVM 的 predict_proba 函数是如何工作的,想了解一下它是如何工作的以及我的代码发生了什么。我的代码中发生了什么?
我不太了解SVC是如何工作的,所以你可以考虑评论中所说的来完成这个答案。
您必须考虑到 predic_proba 将按字典顺序为您提供类别,因为它们出现在 classes_ 属性中。你在 the doc.
中有这个
当你想打印你的结果时,你必须考虑这一点。我们可以在您的示例中看到 Angry 位于第一个索引,因此除了第一个之外,您的结果都很好。
试试这个:
print 'Neutral: ', prob_s[0,1]
print 'Smiling: ', prob_s[0,3]
print 'Shocked: ', prob_s[0,2]
print 'Angry: ', prob_s[0,0]
我在理解 sklearn 的函数时遇到了问题,希望得到一些说明。起初我以为 sklearn 的 SVM 的 predict_proba 函数给出了分类器预测的置信度,但是在我的情绪识别程序中使用它之后,我开始怀疑并觉得我误解了使用和predict_proba 函数是如何工作的。
例如,我的代码设置如下:
# Just finished training and now is splitting data (cross validation)
# and will give an accuracy after testing the accuracy of the test data
features_train, features_test, labels_train, labels_test = cross_validation.train_test_split(main, target, test_size = 0.4)
model = SVC(probability=True)
model.fit(features_train, labels_train)
pred = model.predict(features_test)
accuracy = accuracy_score(labels_test, pred)
print accuracy
# Code that records video of 17 frames and forms matrix know as
# sub_main with features that would be fed into SVM
# Few lines of code later. . .
model.predict(sub_main)
prob = model.predict_proba(sub_main)
prob_s = np.around(prob, decimals=5)
prob_s = prob_s* 100
pred = model.predict(sub_main)
print ''
print 'Prediction: '
print pred
print 'Probability: '
print 'Neutral: ', prob_s[0,0]
print 'Smiling: ', prob_s[0,1]
print 'Shocked: ', prob_s[0,2]
print 'Angry: ', prob_s[0,3]
print ''
当我测试它时,它给了我这样的东西:
Prediction:
['Neutral']
Probability:
Neutral: 66.084
Smiling: 17.875
Shocked: 11.883
Angry: 4.157
它设法有 66% 的置信度认为正确的分类是 "Neutral"。 66 紧挨着 "Neutral",这恰好是最高的数字。最高数字标有实际预测,对此我很高兴。
但最终还是最终。 . .
Prediction:
['Angry']
Probability:
Neutral: 99.309
Smiling: 0.16
Shocked: 0.511
Angry: 0.02
它做出了预测,"Angry"(顺便说一句,这是正确的分类)并且它在 "Neutral" 旁边分配了 99.3% 的置信度。尽管预测完全不同,但最高置信度(最高数字)被分配给中性。
有时它也这样做:
Prediction:
['Smiling']
Probability:
Neutral: 0.0
Smiling: 0.011
Shocked: 0.098
Angry: 99.891
Prediction:
['Angry']
Probability:
Neutral: 99.982
Smiling: 0.0
Shocked: 0.016
Angry: 0.001
我不理解 SVM 的 predict_proba 函数是如何工作的,想了解一下它是如何工作的以及我的代码发生了什么。我的代码中发生了什么?
我不太了解SVC是如何工作的,所以你可以考虑评论中所说的来完成这个答案。
您必须考虑到 predic_proba 将按字典顺序为您提供类别,因为它们出现在 classes_ 属性中。你在 the doc.
中有这个当你想打印你的结果时,你必须考虑这一点。我们可以在您的示例中看到 Angry 位于第一个索引,因此除了第一个之外,您的结果都很好。
试试这个:
print 'Neutral: ', prob_s[0,1]
print 'Smiling: ', prob_s[0,3]
print 'Shocked: ', prob_s[0,2]
print 'Angry: ', prob_s[0,0]