Scikit学习 - 输出正确选择的平均概率

时间:2017-12-22 14:34:21

标签: python pandas scikit-learn

所以我正在使用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个实例周围快速获得正确结果的平均概率。

2 个答案:

答案 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),以获得更好校准的类概率