【问题标题】:How to choose the best values for the param_distributions and fit_params of a cross-validation to fit a model?如何为交叉验证的 param_distributions 和 fit_params 选择最佳值以拟合模型?
【发布时间】:2020-07-02 01:11:16
【问题描述】:

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

我为param_distributionsfit_params 使用了一些任意值,但我应该如何选择它们呢?

就我而言,我正在处理遗传数据,我有一个包含 2,504 行和 220,001 列的数据集。我想知道是否有任何算法/计算可以用来选择每个可测试参数的范围?

这是我从this Kaggle kernel借来的代码sn-p:

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


    【解决方案1】:

    RandomizedSearchCV 将返回每个参数的最佳输入数组选择,例如:如果learning_rate 数组的最后一个元素最合适,它将从'learning_rate' : [0.01, 0.02, 0.03, 0.04, 0.05, 0.08, 0.1, 0.2, 0.3, 0.4] 返回0.4n_iter 是一个整数,不能通过传递数组来选择,所以你必须自己做grid_search。

    【讨论】:

    • early_stopping_rounds 怎么样?和n_inter的想法一样吗?我是否必须使用任意数字并查看哪个更好?我想知道是否有办法计算它。你能否详细说明“自己做 grid_search”?感谢您的帮助!
    • 顺便说一句-数组的值很清楚,我在这一点上的问题是,如何选择要测试的数组中应该包含哪些值。
    • 从小值开始并递增,然后尝试其他数组从第一个数组的结束值开始,依此类推,直到找到最佳值来选择。是的,早期停止也是如此。
    【解决方案2】:

    “我为 param_distributions 和 fit_params 使用了一些任意值,但我应该如何选择它们?”。 我的建议是采用 sklearn 定义的默认值。实际上,根据问题和您使用的算法,您可以尝试一些引导猜测。例如,有一些研究表明,当 100

    【讨论】:

      猜你喜欢
      • 2020-03-26
      • 2021-02-06
      • 2021-02-20
      • 2016-05-26
      • 2019-09-17
      • 2018-04-02
      • 2020-10-04
      • 1970-01-01
      • 2021-03-09
      相关资源
      最近更新 更多