【问题标题】:understanding python xgboost cv了解python xgboost cv
【发布时间】:2016-03-31 20:35:02
【问题描述】:

我想使用 xgboost cv 函数为我的训练数据集找到最佳参数。我对api感到困惑。如何找到最佳参数?这和sklearn的grid_search交叉验证功能类似吗?如何找到max_depth 参数 ([2,4,6]) 的哪些选项被确定为最佳?

from sklearn.datasets import load_iris
import xgboost as xgb
iris = load_iris()
DTrain = xgb.DMatrix(iris.data, iris.target)
x_parameters = {"max_depth":[2,4,6]}
xgb.cv(x_parameters, DTrain)
...
Out[6]: 
   test-rmse-mean  test-rmse-std  train-rmse-mean  train-rmse-std
0        0.888435       0.059403         0.888052        0.022942
1        0.854170       0.053118         0.851958        0.017982
2        0.837200       0.046986         0.833532        0.015613
3        0.829001       0.041960         0.824270        0.014501
4        0.825132       0.038176         0.819654        0.013975
5        0.823357       0.035454         0.817363        0.013722
6        0.822580       0.033540         0.816229        0.013598
7        0.822265       0.032209         0.815667        0.013538
8        0.822158       0.031287         0.815390        0.013508
9        0.822140       0.030647         0.815252        0.013494

【问题讨论】:

  • 这个问题的表述非常笼统。尝试指定您的问题。

标签: python cross-validation xgboost


【解决方案1】:

您可以通过 xgboost sklearn API 将 GridSearchCV 与 xgboost 一起使用

如下定义你的分类器:

from xgboost.sklearn import XGBClassifier
from sklearn.grid_search import GridSearchCV 

xgb_model = XGBClassifier(other_params)

test_params = {
 'max_depth':[4,8,12]
}

model = GridSearchCV(estimator = xgb_model,param_grid = test_params)
model.fit(train,target)
print model.best_params_

【讨论】:

  • 对我来说 GridSearchCV 在这里 from sklearn.model_selection import GridSearchCV
【解决方案2】:

如果您正在寻找参数调整,Sklearn GridSearchCV 应该是一种方法。您只需将 xgb 分类器传递给 GridSearchCV 并评估最佳 CV 分数。

这里有一个很好的教程,可以帮助您开始参数调整:http://www.analyticsvidhya.com/blog/2016/03/complete-guide-parameter-tuning-xgboost-with-codes-python/

【讨论】:

    【解决方案3】:

    Cross-validation 用于估计一组参数在不可见数据上的性能。

    Grid-search 评估具有不同参数的模型,以找到这些参数的最佳组合。

    sklearn docs 讲了很多CV,可以组合使用,但各自的用途却大不相同。

    您也许可以将 xgboost 安装到 sklearn 的网格搜索功能中。查看 xgboost 的 sklearn 接口以获得最流畅的应用程序。

    【讨论】:

    • 我有一个问题:这里的“参数”意味着两件事:(1)超参数,例如Lasso中的正则化lambda,它也是模型的输入; (2) 权重参数,例如 Lasso 中的线性系数,由模型自动生成。那么 CV 是用于估计超参数在未见数据上的性能吗?网格搜索用于找到这些(超参数?)的最佳组合,在什么意义上最好?最好的简历分数?如果是真的,那为什么我不能只使用网格搜索来选择最好的超参数呢?
    • 网格搜索会根据您定义的指标评估具有多组超参数的模型。返回表现最好的一组超参数。报告的一组超参数可能会过度拟合您的数据。为了解决这个问题,您可以对每组超参数进行 CV,而不是按原样计算指标。这更有可能避免过度拟合。
    • GridSearch 中有一个选项cv,我一直使用它。所以我想我实现了你所说的。然后我相信,在那之后,具有最佳超参数集的模型(通过带有 cv 的 GridSearch 获得)应该优于同一类中的其他模型,但我在全新的独立测试中搜索了不同的超参数集来自与训练数据集相同分布的数据集,对吗?
    【解决方案4】:

    我会选择hyperOpt

    https://github.com/hyperopt/hyperopt

    开源并为我工作得很好。 如果你确实选择了这个并且需要帮助,我可以详细说明。

    当您要求查看 "max_depth":[2,4,6] 时,您可以天真地通过运行 3 个模型来解决这个问题,每个模型都有您想要的最大深度,然后查看哪个模型产生更好的结果。

    但“max_depth”并不是您应该考虑调整的唯一超参数。还有很多其他的超参数,比如:eta (learning rate), gamma, min_child_weight, subsample等等。有些是连续的,有些是离散的。 (假设你知道你的目标函数和评估指标)

    您可以在这里阅读所有这些内容https://github.com/dmlc/xgboost/blob/master/doc/parameter.md

    当您查看所有这些“参数”以及它们创建的维度大小时,它是巨大的。您无法手动搜索(“专家”也无法为您提供最佳论据)。

    因此,hyperOpt 为您提供了一个简洁的解决方案,并为您构建了一个不完全随机也不网格的搜索空间。您需要做的就是定义参数及其范围。

    您可以在此处找到代码示例:https://github.com/bamine/Kaggle-stuff/blob/master/otto/hyperopt_xgboost.py

    我可以根据我自己的经验告诉你,它在我的模型上比贝叶斯优化效果更好。给它几个小时/几天的反复试验,如果遇到无法解决的问题,请与我联系。

    祝你好运!

    【讨论】:

    • 好的,我选择了这个,需要帮助。你现在能详细说明一下吗?
    • "kilojoules" 很抱歉回复时间很长,因为我的工作量很大。告诉我你的进展。
    猜你喜欢
    • 2017-08-17
    • 2016-10-20
    • 2017-03-22
    • 2018-02-04
    • 1970-01-01
    • 2021-09-06
    • 2017-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多