sklearn log_loss不同的类数

时间:2015-11-09 18:52:04

标签: python scikit-learn

我正在使用log_loss和sklearn

<p>

我有以下错误:

from sklearn.metrics import log_loss
print log_loss(true, pred,normalize=False)

这对我来说真的很奇怪,因为数组看起来很有效:

ValueError: y_true and y_pred have different number of classes 38, 2

log_loss有什么问题?为什么会抛出错误?

示例数据:

print pred.shape
print np.unique(pred)
print np.unique(pred).size
(19191L,)
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
 25 26 27 28 29 30 31 32 33 34 35 36 37]
38

print true.shape
print np.unique(true)
print np.unique(true).size
(19191L,)
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
 25 26 27 28 29 30 31 32 33 34 35 36 37]
38

3 个答案:

答案 0 :(得分:9)

很简单,您使用的是预测而不是预测的概率。您的 pred 变量包含

[ 1 2 1 3 .... ] #Classes : 1, 2 or 3

但要使用 log_loss ,它应包含类似:

的内容
 [[ 0.1, 0.8, 0.1] [ 0.0, 0.79 , 0.21] .... ] #each element is an array with probability of each class

要获得这些概率,请使用函数predict_proba

pred = model.predict_proba(x_test)
eval = log_loss(y_true,pred) 

答案 1 :(得分:1)

在log_loss方法中,true数组适合并由LabelBinarizer转换,LabelBinarizer会更改其尺寸。因此,检查true和pred具有相似的维度并不意味着log_loss方法将起作用,因为真实的维度会发生变化。如果您只有二进制类,我建议您将此log_loss成本函数用于多个类,此方法不起作用。

答案 2 :(得分:1)

来自log_loss文档:

  

y_pred :类似float,shape =(n_samples,n_classes)或(n_samples,)

     

预测概率,由分类器的predict_proba方法返回。如果y_pred.shape =(n_samples,),则假定提供的概率是正类的概率。 y_pred中的标签假定按字母顺序排序,如预处理.LabelBinarizer。

您需要传递概率而不是预测标签。