理解Python XGBoost CV

22

我想使用xgboost的交叉验证函数来寻找最佳的训练参数。但是我对这个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

1
问题表述得非常笼统,请尽量具体说明您的问题。 - Soren
请参见 https://dev59.com/fFsW5IYBdhLWcg3wX2Vz - Ben Reiniger
4个回答

15
你可以通过xgboost的sklearn API使用GridSearchCV。以下是定义分类器的方法:

将分类器定义为:

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在这里 从sklearn.model_selection导入GridSearchCV。 - Dimitar Nentchev
1
请纠正我,GridSearch与交叉验证不同,许多人会因为期望从交叉验证中返回一个模型而感到困惑(您仍然可以使用cross_validate实现这一点),但交叉验证的基本目的是为了在已知/未知数据集上给出一些模型性能的预测/估计。 - Anggi Permana Harianja

13

交叉验证 用于评估一组参数在未见过的数据上的表现。

网格搜索 对具有不同参数的模型进行评估,以找到最佳组合。

sklearn 文档 大量讨论了CV,它们可以结合使用,但它们各自的目的非常不同。

您可能能够将xgboost适配到sklearn的gridsearch功能中。查看sklearn接口以获得最顺畅的应用。


我有一个问题:这里的“参数”指的是两个东西:(1)超参数,例如Lasso中的正则化lambda,它也是模型的输入之一;(2)权重参数,例如Lasso中的线性系数,它是由模型自动生成的。所以CV是用来估计超参数在未见数据上的表现吗?Grid-search用于找到这些(超参数?)的最佳组合,最好的是什么意思?最好的CV分数?如果是这样的话,为什么我不能只使用Grid-search来选择最佳的超参数呢? - KevinKim
1
网格搜索根据您定义的度量标准评估具有许多超参数集的模型。返回最佳表现的超参数集。报告的超参数集可能会过度拟合您的数据。为了解决这个问题,您可以对每组超参数进行交叉验证,而不仅仅是计算指标。这样更有可能避免过度拟合。 - Aske Doerge
1
GridSearch中,有一个选项cv,我总是使用它。所以我认为我实现了你说的。然后我相信,在此之后,具有最佳超参数集(这些超参数是通过带有cvGridSearch获得的)的模型应该在完全独立的测试数据集上表现优于其他具有不同超参数集但属于同一类别的模型,而该测试数据集来自与训练数据集相同的分布,这正确吗? - KevinKim

9

8

我会选择hyperOpt

https://github.com/hyperopt/hyperopt

这是一个开源工具,对我来说非常好用。如果您选择使用它并需要帮助,我可以详细解释。

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

但是,“max_depth”不是您应该考虑调整的唯一超参数。还有许多其他超参数,例如:eta(学习率),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
2
"kilojoules" 对不起,我手头工作很多,回复时间有点长。请告诉我你的进展情况。 - Eran Moshe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接