如何在“GridSearchCV”中使用“log_loss”和 Scikit-Learn(sklearn)中的多类标签?

Posted

技术标签:

【中文标题】如何在“GridSearchCV”中使用“log_loss”和 Scikit-Learn(sklearn)中的多类标签?【英文标题】:How to use `log_loss` in `GridSearchCV` with multi-class labels in Scikit-Learn (sklearn)? 【发布时间】:2017-09-08 16:27:52 【问题描述】:

我正在尝试使用GridSearchCVscoring 参数中的log_loss 参数来调整这个多类(6 类)分类器。我不明白如何给它一个label 参数。即使我给了它sklearn.metrics.log_loss,它也会随着交叉验证中的每次迭代而改变,所以我不明白如何给它labels 参数?

我正在使用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.

更新: 只需使用它来制作基于@Grr 的得分手

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

【问题讨论】:

在这里打印您的Se_targets。还有看看scikit-learn.org/stable/modules/… @O.rka:标签=排序(np.unique(y))。这里 y 包含训练集中条目的标签,对吧?或者它是否包含数据集中所有条目的标签? 【参考方案1】:

我的假设是,不知何故,您的数据拆分在 y_true 中只有一个类标签。虽然根据您发布的发行版这似乎不太可能,但我想这是可能的。虽然我之前没有遇到过这个问题,但似乎在[sklearn.metrics.log_loss](http://scikit-learn.org/stable/modules/generated/sklearn.metrics.log_loss.html) 中,如果标签都相同,则需要标签参数。如果未通过labels,则文档这一部分的措辞也使该方法看起来好像是二元分类。

现在您正确地假设您应该将log_loss 传递为scorer=sklearn.metrics.log_loss(labels=your_labels)

【讨论】:

我的标签会和“y_true”一样吗? 我相信你会通过你的课程列表,即[1,2,3,4,5,6]。看起来 labels= kwarg 使用 LabelBinarizer 创建标签类,然后对 y_true 值进行二值化。查看源代码here TypeError: log_loss() missing 2 required positional arguments: 'y_true' and 'y_pred' 该方法采用 2 个默认参数,这些参数将在交叉验证期间更改。 您可能必须使用make_scorer【参考方案2】:

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

【讨论】:

以上是关于如何在“GridSearchCV”中使用“log_loss”和 Scikit-Learn(sklearn)中的多类标签?的主要内容,如果未能解决你的问题,请参考以下文章

在 GridSearchCV 中使用精度作为评分时如何指定正标签

如何在 cv 中使用多个值运行 GridSearchCV

如何使用 GridSearchCV 确定的最优参数

如果我使用 GridsearchCV,如何在 Xgboost 中使用 model.evals_result()?

如何在 GridSearchCV 中输入预定义的 k 折叠

如何实现 sklearn 的 Estimator 接口以在 GridSearchCV 管道中使用?