我在使用scikit-learn
中的log_loss
函数进行机器学习分类问题时有一个问题。
from sklearn.ensemble import RandomForestClassifier
classifier = RandomForestClassifier()
classifier.fit(Xtrain, ytrain)
soft = classifier.predict_proba(Xtest)[:,1]
log_loss = log_loss(ytest, soft)
我想计算对数损失,但出现了一个错误:
'numpy.float64' object is not callable
我认为这个问题可能是因为向量soft中有一些0值。但我不知道如何解决这个问题?
s = 0
for x in soft :
if x == 0 :
s+=1
print(s)
>> 17729
提前感谢
回答:
看起来您的问题并不是真的与log_loss
的输入有关,而是与您的变量命名有关。Python中的一切都是对象,因此在以下这行代码中:
log_loss = log_loss(ytest, soft)
您将答案,一个数字(类型为numpy.float64
),赋值给了log_loss
这个变量。所以您的变量遮蔽了函数。随后,当您尝试像调用函数那样使用它时,就会失败。
from sklearn.metrics import log_loss
print(log_loss)
>>> <function log_loss at 0x7f9f692db1b8>
log_loss = log_loss(ytest, soft)
print(log_loss)
>>> 0.11895972559889094
log_loss = log_loss(ytest, soft)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-40-b423b2324b92> in <module>()
----> 1 log_loss = log_loss(ytest, soft)
TypeError: 'numpy.float64' object is not callable
最简单的解决方案是不要将您的变量命名为log_loss
,但更一般地说,您可能会发现某种程度的命名空间有帮助,例如,而不是
from sklearn.metrics import log_loss
...
loss = log_loss(ytest, soft)
您可以使用
from sklearn import metrics
...
loss = metrics.log_loss(ytest, soft)