1

我试图使用scoring参数GridSearchCV中的参数log_loss来调整此多类(6类)分类器。我不明白如何给它一个label参数。即使我给它sklearn.metrics.log_loss,它会改变交叉验证的每个迭代,所以我不知道如何给它labels参数?如何在Scikit-Learn(sklearn)中使用`GridSearchCV`中的`log_loss`和多类标签?

我使用Python v3.6Scikit-Learn v0.18.1

如何使用GridSearchCVlog_loss多级车型调整?

我班表示:

1 31 
2 18 
3 28 
4 19 
5 17 
6 22 
Name: encoding, dtype: int64 

我的代码:

param_test = {"criterion": ["friedman_mse", "mse", "mae"]} 
gsearch_gbc = GridSearchCV(estimator = GradientBoostingClassifier(n_estimators=10), 
         param_grid = param_test, scoring="log_loss", n_jobs=1, iid=False, cv=cv_indices) 
gsearch_gbc.fit(df_attr, Se_targets) 

这里的误差和满一个的尾部是在这里https://pastebin.com/1CshpEBN

ValueError: y_true contains only one label (1). Please provide the true labels explicitly through the labels argument. 

UPDATE : 只需使用这使基于基于@Grr

log_loss_build = lambda y: metrics.make_scorer(metrics.log_loss, greater_is_better=False, needs_proba=True, labels=sorted(np.unique(y))) 
+0

在这里打印你的'Se_targets'。还可以看一下http://scikit-learn.org/stable/modules/model_evaluation.html#multilabel-ranking-metrics –

回答

2

射手我的假设是,不知何故你的数据拆分中只有一个y_true类的标签。虽然这似乎不太可能基于你发布的发行版,我想这是可能的。虽然我没有遇到过这似乎[sklearn.metrics.log_loss](http://scikit-learn.org/stable/modules/generated/sklearn.metrics.log_loss.html)标签参数预计如果标签都是相同的。如果labels未被通过,文档的这一部分的措词也使得该方法看起来好像是将二进制分类归类。

现在,当你正确地认为你应该通过log_lossscorer=sklearn.metrics.log_loss(labels=your_labels)

+0

我的标签是否与“y_true”相同? –

+0

我相信你会通过你的类列表,即'[1,2,3,4,5,6]'。它看起来像'labels ='kwarg使用'LabelBinarizer'来创建标签类,然后二进制化y_true值。请查看源代码[here](https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/metrics/classification.py#L1557-L1677) – Grr

+0

'TypeError:log_loss()missing 2个需要的位置参数:'y_true'和'y_pred''该方法需要2个默认参数,这些参数在交叉验证期间会改变。 –

1

你可以简单地指定“neg_log_loss_scorer”(或“log_loss_scorer”)在旧版本将使用负对数损失。

+0

很好理解!谢谢 –

相关问题