2015-01-12 28 views
2

我正在尝试使用自定义评分函数来计算具有ground truth和predict_proba y数组的多类日志丢失。有没有办法让GridSearchCV使用这种评分功能?使用自定义分数函数时,GridSearchCV可以使用predict_proba吗?

def multiclass_log_loss(y_true, y_pred): 
Parameters 
---------- 
y_true : array, shape = [n_samples] 
     true class, intergers in [0, n_classes - 1) 
y_pred : array, shape = [n_samples, n_classes] 

Returns 
------- 
loss : float 
""" 
eps=1e-15 
predictions = np.clip(y_pred, eps, 1 - eps) 

# normalize row sums to 1 
predictions /= predictions.sum(axis=1)[:, np.newaxis] 

actual = np.zeros(y_pred.shape) 
n_samples = actual.shape[0] 
actual[np.arange(n_samples), y_true.astype(int)] = 1 
vectsum = np.sum(actual * np.log(predictions)) 
loss = -1.0/n_samples * vectsum 
return loss 

我看到有多个选项,score_func,loss_func和make_scorer。我尝试使用make_scorer with greater_is_better = False,并尝试使用loss_func参数,但它似乎仍然使用.predict方法。我怎样才能解决这个问题?

更新 - 如果我设置needs_threshold = True我得到一个多类错误。我正确地理解这种情况下不支持多类吗?如果是的话,有人可以提出解决方法吗?

谢谢。

+1

你可以简单地使用''scoring =“log_loss”''并且不需要打扰所有这些。不过,应该在这里支持多类。 –

+0

谢谢安德烈亚斯。我没有看到log_loss作为文档中的得分选项,所以并不认为它是内置的。但是知道这很棒!虽然我无法使用多种类来使用自定义函数。在制作记分员时,我们是否通过说need_threshold = true来打开predict_proba? – shankarmsy

+0

是的。所有内置损失函数的列表在这里:http://scikit-learn.org/dev/modules/model_evaluation.html#common-cases-predefined-values –

回答

0

顶端回答这个问题: Pass estimator to custom score function via sklearn.metrics.make_scorer

可能有你需要的。人们可以定义一个记分器,该记分器将分类器clf,特性数组X和目标y_true作为参数,并将clf.predict_proba()方法的结果提供给返回错误的评分函数。作为一个提示,对于二元分类,你可能需要使用

clf.predict_proba(X)[:,1]

这个工作对我的需要(归一化的基尼分数)。出于某种原因,我无法使sklearn的metrics.make_scorer与我需要概率的自定义函数一起工作。

相关问题