如何从 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 可以以某种方式显示这些信息,但我不知道如何。
我的第一反应是查看xgboost
的predict_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) 以计算每个输入项的优势比,例如 sex
和 age
。
我在这个网站上发现了一个类似的问题,但答案对我没有帮助:
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_
没有告诉我如何找出哪些输入类别,例如age
或sex
有什么概率。
如何将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 的优势比?的主要内容,如果未能解决你的问题,请参考以下文章
从结构到性能,一文概述XGBoostLight GBM和CatBoost的同与不同