如何在 Scikit-Learn (sklearn) 中使用带有多类标签的 `GridSearchCV` 中的 `log_loss`?

O.r*_*rka 5 python optimization machine-learning scikit-learn grid-search

我正在尝试使用log_loss参数中的scoring参数GridSearchCV来调整这个多类(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
Run Code Online (Sandbox Code Playgroud)

我的代码:

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)
Run Code Online (Sandbox Code Playgroud)

这是错误的结尾,完整的在这里https://pastebin.com/1CshpEBN

ValueError: y_true contains only one label (1). Please provide the true labels explicitly through the labels argument.
Run Code Online (Sandbox Code Playgroud)

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

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

Grr*_*Grr 3

我的假设是,不知何故,你的数据分割在 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)

  • `TypeError: log_loss() 缺少 2 个必需的位置参数:'y_true' 和 'y_pred'` 该方法采用 2 个默认参数,这些参数将在交叉验证期间发生变化。 (3认同)