最近,我正在进行多个实验来比较Python的XgBoost和LightGBM。似乎这个LightGBM是一种新的算法,人们说它在速度和准确性方面比XGBoost表现更好。
这是LightGBM GitHub。 这是LightGBM python API documents,这里你会找到可以调用的Python函数。它可以直接从LightGBM模型中调用,也可以通过LightGBM scikit-learn调用。
这是我使用的XGBoost Python API。正如你所看到的,它与上面的LightGBM Python API具有非常相似的数据结构。
下面是我尝试过的内容:
- 如果您在XGBoost和LightGBM中都使用了
train()
方法,那么是的,lightGBM的速度更快、准确率更高。但是这种方法没有交叉验证。 - 如果您尝试在这两种算法中使用
cv()
方法,它就是用于交叉验证的。然而,我没有找到一种方法来使用它返回一组最优参数。 - 如果您尝试使用LGBMClassifier和XGBClassifer的scikit-learn
GridSearchCV()
,它对于XGBClassifer来说是有效的,但对于LGBClassifier来说,它会运行很长时间。
下面是我在使用GridSearchCV()
时两个分类器的代码示例:
XGBClassifier与GridSearchCV
param_set = {
'n_estimators':[50, 100, 500, 1000]
}
gsearch = GridSearchCV(estimator = XGBClassifier( learning_rate =0.1,
n_estimators=100, max_depth=5,
min_child_weight=1, gamma=0, subsample=0.8, colsample_bytree=0.8,
nthread=7,
objective= 'binary:logistic', scale_pos_weight=1, seed=410),
param_grid = param_set, scoring='roc_auc',n_jobs=7,iid=False, cv=10)
xgb_model2 = gsearch.fit(features_train, label_train)
xgb_model2.grid_scores_, xgb_model2.best_params_, xgb_model2.best_score_
这对于XGBoost非常有效,仅用了几秒钟的时间。 使用GridSearchCV的LightGBM
param_set = {
'n_estimators':[20, 50]
}
gsearch = GridSearchCV(estimator = LGBMClassifier( boosting_type='gbdt', num_leaves=30, max_depth=5, learning_rate=0.1, n_estimators=50, max_bin=225,
subsample_for_bin=0.8, objective=None, min_split_gain=0,
min_child_weight=5,
min_child_samples=10, subsample=1, subsample_freq=1,
colsample_bytree=1,
reg_alpha=1, reg_lambda=0, seed=410, nthread=7, silent=True),
param_grid = param_set, scoring='roc_auc',n_jobs=7,iid=False, cv=10)
lgb_model2 = gsearch.fit(features_train, label_train)
lgb_model2.grid_scores_, lgb_model2.best_params_, lgb_model2.best_score_
然而,使用这种方法对于LightGBM来说,今天整个上午都在运行,但仍未生成任何内容。
我正在使用相同的数据集,一个包含30000条记录的数据集。
我有2个问题:
- 如果我们只使用
cv()
方法,是否有任何方法来调整最佳参数集? - 您知道为什么
GridSearchCV()
与LightGBM不兼容吗? 我想知道这是否只发生在我身上还是其他人也遇到过类似情况?