我正在实现LightGBM分类器(LGBMClassifier
),其超参数由RandomizedSearchCV
交叉验证(sklearn
库)选择。
我为param_distributions
和fit_params
使用了一些任意值,但是我应该如何选择它们呢?
就我而言,我正在使用遗传数据,并且我有一个包含2,504行和220,001列的数据集。我想知道是否可以使用任何算法/计算来选择每个可测试参数的范围?
这是我从this Kaggle kernel借来的代码段:
fit_params = {"early_stopping_rounds" : 50, # TODO: Isn't it too low for GWAS?
"eval_metric" : 'binary',
"eval_set" : [(X_test,y_test)],
'eval_names': ['valid'],
'verbose': 0,
'categorical_feature': 'auto'}
param_test = {'learning_rate' : [0.01, 0.02, 0.03, 0.04, 0.05, 0.08, 0.1, 0.2, 0.3, 0.4],
'n_estimators' : [100, 200, 300, 400, 500, 600, 800, 1000, 1500, 2000, 3000, 5000],
'num_leaves': sp_randint(6, 50),
'min_child_samples': sp_randint(100, 500),
'min_child_weight': [1e-5, 1e-3, 1e-2, 1e-1, 1, 1e1, 1e2, 1e3, 1e4],
'subsample': sp_uniform(loc=0.2, scale=0.8),
'max_depth': [-1, 1, 2, 3, 4, 5, 6, 7],
'colsample_bytree': sp_uniform(loc=0.4, scale=0.6),
'reg_alpha': [0, 1e-1, 1, 2, 5, 7, 10, 50, 100],
'reg_lambda': [0, 1e-1, 1, 5, 10, 20, 50, 100]}
#number of combinations
n_iter = 200 #(replace 2 by 200, 90 minutes)
#intialize lgbm and lunch the search
lgbm_clf = lgbm.LGBMClassifier(random_state=random_state, silent=True, metric='None', n_jobs=4)
grid_search = RandomizedSearchCV(
estimator=lgbm_clf, param_distributions=param_test,
n_iter=n_iter,
scoring='accuracy',
cv=5,
refit=True,
random_state=random_state,
verbose=True)
使问题更加集中,例如,我如何选择early_stopping_rounds
和n_iter
需要多少次迭代?
RandomizedSearchCV将为每个参数返回输入数组的最佳选择,例如:如果0.4
数组的最后一个元素最适合,它将从'learning_rate' : [0.01, 0.02, 0.03, 0.04, 0.05, 0.08, 0.1, 0.2, 0.3, 0.4]
返回learning_rate
。 n_iter
是整数,不能通过传递数组来选择,因此您必须自己进行grid_search。
“我已经为param_distributions和fit_params使用了一些任意值,但是我应该如何选择它们?”。我的建议是采用sklearn定义的默认值附近的值。实际上,根据问题和使用的算法,您可以尝试一些有指导的猜测。例如,有一些研究工作表明,当100 <= n_estimators <= 500时,随机森林通常会提供更好的结果。您可以通过这种方式开始,但是如果您确实需要找到(次)最优参数,则可以使用优化算法(例如遗传算法),这些算法从随机值开始,然后尝试朝着最优值收敛。
而不是手动定义它们,您可以以编程方式创建发行版,例如使用
params = {
'n_estimators': numpy.linspace(start=100, stop=1000, num=10),
'min_child_weight': numpy.logspace(start=-4, stop=5, num=10)
}
对于估计量,您生成了十个元素的分布,例如[100,200,...,1000],对于最小子体重,生成了诸如[1e-4,1e-3,...]的分布。] >
然后,RandomizedSearchCV
将为每个参数随机选取一些以训练模型。