Python - 带有 GridSearchCV 的 LightGBM,永远是 运行
Python - LightGBM with GridSearchCV, is running forever
最近,我正在做多个实验来比较 Python XgBoost 和 LightGBM。看来这个 LightGBM 是一个新的算法,人们说它在速度和准确性上都比 XGBoost 更好。
这是LightGBM GitHub。
这是 LightGBM python API documents,在这里你会找到 python 个你可以调用的函数。可以在LightGBM模型中直接调用,也可以通过LightGBM scikit-learn调用。
这是我用的XGBoost Python API。可以看到,它的数据结构和上面的LightGBMpythonAPI非常相似。
这是我尝试过的:
- 如果您在 XGBoost 和 LightGBM 中都使用
train()
方法,是的,lightGBM 工作得更快并且具有更高的准确性。但是这个方法,没有交叉验证。
- 如果你在两种算法中尝试
cv()
方法,它是为了交叉验证。但是,我没有找到使用它的方法return一组最佳参数。
- 如果您使用 LGBMClassifier 和 XGBClassifer 尝试 scikit-learn
GridSearchCV()
。它适用于 XGBClassifer,但对于 LGBClassifier,它永远是 运行。
以下是我对两个分类器使用 GridSearchCV()
时的代码示例:
XGBClassifier with 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 条记录。
我有两个问题:
- 如果我们只使用
cv()
方法,有没有办法调整最佳参数集?
- 你知道为什么
GridSearchCV()
不能很好地与 LightGBM 配合使用吗?我想知道这是否只发生在我身上,其他人也会发生吗?
尝试使用 n_jobs = 1
看看是否有效。
一般来说,如果您使用 n_jobs = -1
或 n_jobs > 1
,那么您应该使用 if __name__=='__main__':
来保护您的脚本:
简单示例:
import ...
if __name__=='__main__':
data= pd.read_csv('Prior Decompo2.csv', header=None)
X, y = data.iloc[0:, 0:26].values, data.iloc[0:,26].values
param_grid = {'C' : [0.01, 0.1, 1, 10], 'kernel': ('rbf', 'linear')}
classifier = SVC()
grid_search = GridSearchCV(estimator=classifier, param_grid=param_grid, scoring='accuracy', n_jobs=-1, verbose=42)
grid_search.fit(X,y)
最后,您能否尝试 运行 您的代码使用 n_jobs = -1
并包括 if __name__=='__main__':
,如我所解释的,看看它是否有效?
最初的问题是由于 lightgbm
和 GridSearchCV
启动了太多线程(即超过机器上可用的线程)。如果这些的乘积(或总和?这取决于 GridSearchCV
的实现方式)仍在机器能力范围内,那么它将 运行。如果线程太多,它们会发生冲突,并且 lightgbm
停止执行一些我不清楚但开发人员知道的原因。
最近,我正在做多个实验来比较 Python XgBoost 和 LightGBM。看来这个 LightGBM 是一个新的算法,人们说它在速度和准确性上都比 XGBoost 更好。
这是LightGBM GitHub。 这是 LightGBM python API documents,在这里你会找到 python 个你可以调用的函数。可以在LightGBM模型中直接调用,也可以通过LightGBM scikit-learn调用。
这是我用的XGBoost Python API。可以看到,它的数据结构和上面的LightGBMpythonAPI非常相似。
这是我尝试过的:
- 如果您在 XGBoost 和 LightGBM 中都使用
train()
方法,是的,lightGBM 工作得更快并且具有更高的准确性。但是这个方法,没有交叉验证。 - 如果你在两种算法中尝试
cv()
方法,它是为了交叉验证。但是,我没有找到使用它的方法return一组最佳参数。 - 如果您使用 LGBMClassifier 和 XGBClassifer 尝试 scikit-learn
GridSearchCV()
。它适用于 XGBClassifer,但对于 LGBClassifier,它永远是 运行。
以下是我对两个分类器使用 GridSearchCV()
时的代码示例:
XGBClassifier with 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 条记录。
我有两个问题:
- 如果我们只使用
cv()
方法,有没有办法调整最佳参数集? - 你知道为什么
GridSearchCV()
不能很好地与 LightGBM 配合使用吗?我想知道这是否只发生在我身上,其他人也会发生吗?
尝试使用 n_jobs = 1
看看是否有效。
一般来说,如果您使用 n_jobs = -1
或 n_jobs > 1
,那么您应该使用 if __name__=='__main__':
来保护您的脚本:
简单示例:
import ...
if __name__=='__main__':
data= pd.read_csv('Prior Decompo2.csv', header=None)
X, y = data.iloc[0:, 0:26].values, data.iloc[0:,26].values
param_grid = {'C' : [0.01, 0.1, 1, 10], 'kernel': ('rbf', 'linear')}
classifier = SVC()
grid_search = GridSearchCV(estimator=classifier, param_grid=param_grid, scoring='accuracy', n_jobs=-1, verbose=42)
grid_search.fit(X,y)
最后,您能否尝试 运行 您的代码使用 n_jobs = -1
并包括 if __name__=='__main__':
,如我所解释的,看看它是否有效?
最初的问题是由于 lightgbm
和 GridSearchCV
启动了太多线程(即超过机器上可用的线程)。如果这些的乘积(或总和?这取决于 GridSearchCV
的实现方式)仍在机器能力范围内,那么它将 运行。如果线程太多,它们会发生冲突,并且 lightgbm
停止执行一些我不清楚但开发人员知道的原因。