如何从 xgboost 获得类似 glm 的优势比?

Posted

技术标签:

【中文标题】如何从 xgboost 获得类似 glm 的优势比?【英文标题】:How to get glm-like odds ratios from xgboost? 【发布时间】:2021-06-02 11:13:55 【问题描述】:

我已经在 Python 3.8.5 上使用 xgboost 成功运行了机器学习算法,但在解释结果方面遇到了困难。

输出/目标是二进制的,已故或未死。

我自己和我的观众都非常了解来自 R 的 glm 的赔率比,而且我确信 xgboost 可以以某种方式显示这些信息,但我不知道如何。

我的第一反应是查看xgboostpredict_proba 的输出

但是当我这样做时,我得到了

>>> deceased.pp.view()
array([[0.5828363 , 0.4171637 ],
       [0.89795643, 0.10204358],
       [0.5828363 , 0.4171637 ],
       [0.89795643, 0.10204358]], dtype=float32)

假设这些是 p 将进入公式 1/(1-p) 以计算每个输入项的优势比,例如 sexage

我在这个网站上发现了一个类似的问题,但答案对我没有帮助:

xgboost predict_proba : How to do the mapping between the probabilities and the labels

所以根据那里的答案,我使用.classes_ 得到这个

>>> deceased.xg_clf.classes_
array([False,  True])

事实上,我什至不确定 xgboost 能否提供类似 glm 的优势比,最接近的似乎是 feature_importances。

但是,特征重要性并不能提供与优势比相同的信息。

但是.classes_ 没有告诉我如何找出哪些输入类别,例如agesex有什么概率。

如何将classes_ 与输入类别相关联? 或者,如果这不正确或不可能,我还能如何计算 xgboost 中每个输入变量的优势比

【问题讨论】:

【参考方案1】:

同意 XGBoost 并不真正适合提供优势比之类的东西。对于更复杂的模型(如 XGBoost),您是否查看过其他形式的模型可解释性?例如,shap 是一个库,可以提供类似类型的分析,但更适合这些类型的模型。

【讨论】:

【参考方案2】:

我还能如何计算 xgboost 中每个输入变量的优势比?

关于这个问题:我有一个二元解释变量的解决方案。

我是这个论坛的新手,所以如果我错了,请随时纠正我的答案。如果您想在 XGBoost 模型中显示系数,DoubleML 是一个可用于 R 和 Python 的包。该软件包基于 Chernozhukov et al. (2018) 的结果构建,用于分析 ML 模型中解释变量的影响。

您可以使用包中的 DoubleMLIRM 模型来解释论文所描述的平均治疗效果(论文的第 5 章):

θ0 = ?[g0(1,X) - g(0,X)]

正如他们所说,其中 θ 是平均治疗效果。换句话说:二元解释变量对因变量的影响。

g0(1,X) 描述因变量依赖于控制变量X,感兴趣的二元解释变量D=1,0。但是 g0 不采用函数形式。因此,您可以应用 XGBoost。

这个模型的好处是可以为您提供置信区间,以便您能够对系数值进行推断。

【讨论】:

以上是关于如何从 xgboost 获得类似 glm 的优势比?的主要内容,如果未能解决你的问题,请参考以下文章

XGBoost VS 深度学习

当提供轴和四元数时,我如何获得 GLM 的角度?

R:计算和解释逻辑回归中的优势比

如何将输入传递到用户定义函数中的命名列表

如何缩放使用 glm::lookat() 获得的矩阵?

机器学习--xgboost从初识到应用