如何使用ScikitLearn在XGBoost中强制执行Monotonic Constraints?

时间:2017-03-28 17:45:32

标签: python scikit-learn xgboost

我使用scikit-learn构建了一个XGBoost模型,我很高兴。作为微调以避免过度拟合,我想确保某些功能的单调性,但我开始面临一些困难......

据我所知,scikit中没有文档 - 了解xgboost(我承认我真的很惊讶 - 知道这种情况持续了几个月)。我找到的唯一文档直接在http://xgboost.readthedocs.io

在这个网站上,我发现可以使用" monotone_constraints"强制执行单调性。选项。 我试图在Scikit-Learn中使用它,但是我收到了一条错误消息" TypeError: init ()得到了一个意外的关键字参数' monotone_constraints'"

你知道办法吗?

这是我在python中编写的代码(使用spyder):

grid = {'learning_rate' : 0.01, 'subsample' : 0.5, 'colsample_bytree' : 0.5,
    'max_depth' : 6, 'min_child_weight' : 10, 'gamma' : 1, 
    'monotone_constraints' : monotonic_indexes}
#'monotone_constraints' ~ = "(1,-1)"
m07_xgm06 = xgb.XGBClassifier(n_estimators=2000, **grid)
m07_xgm06.fit(X_train_v01_oe, Label_train, early_stopping_rounds=10, eval_metric="logloss", 
    eval_set=[(X_test1_v01_oe, Label_test1)])

3 个答案:

答案 0 :(得分:0)

目前XGBoost Scikit-Learn API(0.6a2)不支持monotone_constraints。您可以改用Python API。看看example

示例中的代码可以删除:

params_constr['updater'] = "grow_monotone_colmaker,prune"

答案 1 :(得分:0)

您如何期望单调约束适用于响应可能超过2个级别的一般分类问题?我见过的与此功能相关的所有示例都是针对回归问题。如果您的分类响应只有2个级别,请尝试切换到指标变量的回归,然后为分类选择合适的分数阈值。

此功能似乎适用于最新的xgboost / scikit-learn,只要您使用XGBregressor而不是XGBclassifier并通过kwargs设置monotone_constraints。

语法如下:

params = {
    'monotone_constraints':'(-1,0,1)'
}

normalised_weighted_poisson_model = XGBRegressor(**params)

在此示例中,训练数据中的第1列存在负面约束,第2列没有约束,第3列存在正约束。由您来跟踪哪个是哪个 - 您无法引用按名称列出,只按位置列,并且必须在约束元组中为训练数据中的每一列指定一个条目。

答案 2 :(得分:0)

为了使用xgboost sklearn API进行此操作,您需要升级到xgboost 0.81。他们修复了在此PR中设置通过kwargs控制的参数的能力: https://github.com/dmlc/xgboost/pull/3791