无法重现LightGBM的L1分数

当我使用提前停止运行LGBM时,它会给我最佳迭代对应的分数。

当我尝试自己重现这些分数时,得到的数字却不同。

import lightgbm as lgbfrom sklearn.datasets import load_breast_cancerimport pandas as pdfrom sklearn.metrics import mean_absolute_errorfrom sklearn.model_selection import KFolddata = load_breast_cancer()X = pd.DataFrame(data.data)y = pd.Series(data.target)lgb_params =  {'boosting_type': 'dart', 'random_state': 42}folds = KFold(5)for train_idx, val_idx in folds.split(X):    X_train, X_valid = X.iloc[train_idx], X.iloc[val_idx]    y_train, y_valid = y.iloc[train_idx], y.iloc[val_idx]    model = lgb.LGBMRegressor(**lgb_params, n_estimators=10000, n_jobs=-1)    model.fit(X_train, y_train,              eval_set=[(X_valid, y_valid)],              eval_metric='mae', verbose=-1, early_stopping_rounds=200)    y_pred_valid = model.predict(X_valid)    print(mean_absolute_error(y_valid, y_pred_valid))

我期望

valid_0's l1: 0.123608

能与我用mean_absolute_error计算的结果相匹配,但实际上并非如此。实际上,以下是我输出的前部分:

Training until validation scores don't improve for 200 rounds.Early stopping, best iteration is:[631]   valid_0's l2: 0.0515033 valid_0's l1: 0.1236080.16287265537021847

我使用的是lightgbm的’2.2.1’版本。


回答:

如果你更新你的LGBM版本,你会得到

“UserWarning: Early stopping is not available in dart mode”

请参考这个议题了解更多详情。你可以做的就是使用最佳提升轮数重新训练模型。

results = model.evals_result_['valid_0']['l1']best_perf = min(results)num_boost = results.index(best_perf)print('with boost', num_boost, 'perf', best_perf)    model = lgb.LGBMRegressor(**lgb_params, n_estimators=num_boost+1, n_jobs=-1)model.fit(X_train, y_train, verbose=-1)

Related Posts

在使用k近邻算法时,有没有办法获取被使用的“邻居”?

我想找到一种方法来确定在我的knn算法中实际使用了哪些…

Theano在Google Colab上无法启用GPU支持

我在尝试使用Theano库训练一个模型。由于我的电脑内…

准确性评分似乎有误

这里是代码: from sklearn.metrics…

Keras Functional API: “错误检查输入时:期望input_1具有4个维度,但得到形状为(X, Y)的数组”

我在尝试使用Keras的fit_generator来训…

如何使用sklearn.datasets.make_classification在指定范围内生成合成数据?

我想为分类问题创建合成数据。我使用了sklearn.d…

如何处理预测时不在训练集中的标签

已关闭。 此问题与编程或软件开发无关。目前不接受回答。…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注