所以我正在使用Scikit-Learn搞乱三个结果数据框。我更倾向于预测准确的概率,而不是预测正确的结果。因此我使用predict_proba而不是预测,然后我可以输出每个测试实例的所有概率为a,b或c,这是平滑的!
有没有办法以与precision_score(y_predictions,y_test)相同的方式进行“概率分数”?那么我得到它归因于每个正确结果的平均概率?
我可以通过将其复制到Excel或类似程序来手动执行此操作,但这需要花费很多时间..
谢谢!
编辑 - 这就是predict_proba输出的内容:
A B C
1 [ 0.6 0.3 0.1]
2 [ 0.4 0.1 0.5]
3 [ 0.4 0.3 0.3]
4 [ 0.3 0.1 0.6]
...
现在,假设实例1和2的结果是A,实例3的结果是C,实例4的结果是B,这将给我的模型“正确结果的平均概率”(0.6 + 0.4 + 0.3 + 0.1)/实例数(在这种情况下为4),其为0.35或35%。
我有准确的结果存储在y_test中(当然)所以我希望能够在我的测试集中的~500个实例周围快速获得正确结果的平均概率。
答案 0 :(得分:2)
假设您在y_test
中有整数编码标签:
import numpy as np
probas = np.array([[0.6, 0.3, 0.1], [0.4, 0.1, 0.5], [0.4, 0.3, 0.3], [0.3, 0.1, 0.6]])
y_test = np.array([[0], [0], [2], [1]])
print(y_test)
[[0]
[0]
[2]
[1]]
要获得所需的结果,您可以使用真实标签从您感兴趣的probas
的每一行中选择值,然后取平均值。
y_probas = np.choose(y_test.T, probas.T)
print(y_probas)
[[ 0.6 0.4 0.3 0.1]]
avg_proba = np.mean(y_probas)
print(avg_proba)
0.35
但是,请考虑使用Log Loss,这是预测概率的更标准损失指标:
from sklearn.metrics import log_loss
log_loss(y_test, probas)
1.2334185632400319
答案 1 :(得分:0)
您可以编写自定义python函数来执行此操作。
import pandas as pd
prob = pd.DataFrame([[ 0.6 ,0.3,0.1],[ 0.4 ,0.1,0.5],[ 0.4 ,0.3,0.3],[ 0.3
,0.1,0.6]],columns=['A','B','C'])
true = pd.Series(["A","A","C","B"])
def avg_prob(true,prob):
sum = 0
for i,p in enumerate(true):
sum += prob.loc[i,p]
return sum/len(true)
avg_prob(true,prob)
同时研究概率校准(http://scikit-learn.org/stable/modules/calibration.html),以获得更好校准的类概率