首页 > 解决方案 > 使用 LightGBM 回归的网格搜索

问题描述

我想使用 Light GBM 训练回归模型,以下代码可以正常工作:

import lightgbm as lgb

d_train = lgb.Dataset(X_train, label=y_train)
params = {}
params['learning_rate'] = 0.1
params['boosting_type'] = 'gbdt'
params['objective'] = 'gamma'
params['metric'] = 'l1'
params['sub_feature'] = 0.5
params['num_leaves'] = 40
params['min_data'] = 50
params['max_depth'] = 30

lgb_model = lgb.train(params, d_train, 1000)

#Prediction
y_pred=lgb_model.predict(X_test)
mae_error = mean_absolute_error(y_test,y_pred)

print(mae_error)

但是当我继续使用 GridSearchCV 时,我遇到了问题。我不完全确定如何正确设置。我找到了有用的资源,例如这里,但它们似乎正在使用分类器。

第一次尝试:

from sklearn.metrics import make_scorer
score_func = make_scorer(mean_absolute_error, greater_is_better=False)

model = lgb.LGBMClassifier( 
    boosting_type="gbdt",
    objective='regression',
    is_unbalance=True, 
    random_state=10, 
    n_estimators=50,
    num_leaves=30, 
    max_depth=8,
    feature_fraction=0.5,  
    bagging_fraction=0.8, 
    bagging_freq=15, 
    learning_rate=0.01,    
)

params_opt = {'n_estimators':range(200, 600, 80), 'num_leaves':range(20,60,10)}
gridSearchCV = GridSearchCV(estimator = model, 
    param_grid = params_opt, 
    scoring=score_func)
gridSearchCV.fit(X_train,y_train)
gridSearchCV.grid_scores_, gridSearchCV.best_params_, gridSearchCV.best_score_

,之前给了我一堆错误:

“ValueError:未知标签类型:'连续'”

更新:我使代码运行与 LGBMModel 切换 LGBMClassifier。我是否也应该尝试使用 LGBMRegressor,或者这无关紧要?(来源:https ://lightgbm.readthedocs.io/en/latest/_modules/lightgbm/sklearn.html )

标签: pythongrid-searchlightgbm

解决方案


首先,不清楚数据的性质是什么,因此哪种模型更适合。你使用 L1 度量,所以我假设你有某种回归问题。如果不是,请纠正我并详细说明您为什么使用 L1 度量标准。如果是,那么根本不清楚你为什么要使用LGBMClassifier,因为它服务于分类问题(正如@bakka 已经指出的那样)。

请注意,实际上LGBMModelLGBMRegressor(您可以在代码中看到它)相同。但是,不能保证这种情况在长期的未来会保持不变。因此,如果您想编写良好且可维护的代码 - 不要使用基类LGBMModel,除非您非常清楚自己在做什么,为什么以及后果是什么。

关于参数范围:在 github 上查看这个答案


推荐阅读