如何为交叉验证的param_distributions和fit_params选择最佳值以适合模型?

问题描述 投票:-1回答:2

我正在实现LightGBM分类器(LGBMClassifier),其超参数由RandomizedSearchCV交叉验证(sklearn库)选择。

我为param_distributionsfit_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_roundsn_iter需要多少次迭代?

python machine-learning scikit-learn cross-validation lightgbm
2个回答
0
投票

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_raten_iter是整数,不能通过传递数组来选择,因此您必须自己进行grid_search。


0
投票

“我已经为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将为每个参数随机选取一些以训练模型。

© www.soinside.com 2019 - 2024. All rights reserved.