【问题标题】:how to enforce Monotonic Constraints in XGBoost with ScikitLearn?如何使用 Scikit Learn 在 XGBoost 中强制执行单调约束?
【发布时间】:2017-08-21 22:25:08
【问题描述】:

我使用 scikit-learn 构建了一个 XGBoost 模型,我对此非常满意。作为避免过度拟合的微调,我想确保某些特征的单调性,但在那里我开始面临一些困难......

据我所知,scikit-learn 中没有关于 xgboost 的文档(我承认我对此感到非常惊讶 - 知道这种情况会持续几个月)。我找到的唯一文档直接在http://xgboost.readthedocs.io

在这个网站上,我发现可以使用“monotone_constraints”选项来强制执行单调性。 我尝试在 Scikit-Learn 中使用它,但收到一条错误消息“TypeError: init() got an unexpected keyword argument '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)])

【问题讨论】:

    标签: python scikit-learn xgboost


    【解决方案1】:

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

    【讨论】:

    • 从那时起它肯定一直在工作,参见例如LGBMClassifier( 的文档字符串
    【解决方案2】:

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

    如果您使用 XGBregressor 而不是 XGBclassifier 并通过 kwargs 设置 monotone_constraints,此功能似乎从最新的 xgboost / scikit-learn 开始工作。

    语法是这样的:

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

    在此示例中,训练数据中的第 1 列有负约束,第 2 列没有约束,第 3 列有正约束。由您来跟踪哪个是哪个 - 您不能参考按名称,仅按位置到列,并且您必须在约束元组中为训练数据中的每一列指定一个条目。

    【讨论】:

    • 关于 XGBClassifier 不支持单调性的说法是否仍然正确?
    • 是的,我怀疑它永远不会,因为我的回答中所述的原因。
    【解决方案3】:

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

    示例中的这段代码可以去掉:

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

    【讨论】:

    • 然而,单调约束似乎暂时不起作用。我问了关于这个here的问题。 @chapelon 对你有用吗?
    • 此答案现已弃用。看我的回复。 stackoverflow.com/a/53147154/339588
    猜你喜欢
    • 1970-01-01
    • 2011-09-07
    • 2012-12-05
    • 2015-07-13
    • 2016-03-24
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多