最近,我做了很多实验来比较Python XgBoost和LightGBM。这种LightGBM似乎是一种新的算法,人们说它在速度和精度上都比XGBoost好。
这是LightGBM GitHub。 这里是LightGBM python API documents,您可以在这里找到可以调用的python函数。它可以直接从LightGBM模型调用,也可以由LightGBM scikit learn调用。
这是我用的XGBoost Python API。如您所见,它的数据结构与上面的LightGBM python API非常相似。
以下是我尝试过的:
train()
方法,那么是的,LightGBM工作得更快,精度更高。但这种方法,没有交叉验证。cv()
方法,则它用于交叉验证。但是,我没有找到使用它返回一组最佳参数的方法。GridSearchCV()
。它适用于XGBClassifier,但对于LGBClassier,它将永远运行。下面是我在两个分类器中使用GridSearchCV()
时的代码示例:
带有GridSearchCV的XGBClassifier
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条记录。
我有两个问题:
cv()
方法,是否还有优化参数集的方法?GridSearchCV()
不能很好地与LightGBM一起工作吗?我想知道这是否只发生在我身上其他人身上?
最初的问题是由于
lightgbm
和GridSearchCV
启动的线程太多(即机器上的线程太多)。如果是产品(或金额?这取决于这些功能的GridSearchCV
是如何实现的,然后它将运行。如果有太多的线程发生冲突,并且lightgbm
由于一些我不清楚的原因而停止执行,但是开发人员知道原因。尝试使用
n_jobs = 1
并查看它是否有效。一般来说,如果您使用
n_jobs = -1
或n_jobs > 1
,那么您应该使用if __name__=='__main__':
来保护您的脚本:简单示例:
最后,你能试着用
n_jobs = -1
来运行你的代码吗,并且像我解释的那样包含if __name__=='__main__':
,看看它是否有效?相关问题 更多 >
编程相关推荐