5、个体条件期望图ICE Plot
个体条件期望图(ICE Plot)计算方法与PDP 类似,个体条件期望图显示的是每一个个体的预测值与单一特征之间的关系。
由于PDP呈现的是特征对于目标变数的平均变化量,容易使得异质效应(heterogeneous effects)相消,导致PD曲线看起来像是一条水平线,进而以为特征X_2对y毫无影响。因此,可以透过ICE Plot改善PDP的缺点:发现资料中的异质效应
5.1 计算原理
训练好一个模型f̂(假设x₁、x₂、x₃、x₄为特征、目标变数为y),假设我们想探讨的是x₁与y之间的关系,ICE的分析步骤如下:
对某一样本个体,保持其他特征不变,置换x₁的值并且输出模型的预测结果。
不断重复第一个步骤直到所有样本皆完成该步骤。
最后绘制所有个体的单一特征变量与预测值之间的关系图。
5.2 结果解释
灰黑色线代表的是每个个体对于目标变数的条件期望,红色线则是所有个体的平均水平(也就是PDP)。由于并不是每个个体都有相同的变化趋势,因此与部分相依图相比个体条件期望图能够更准确地反映特征与目标变数之间的关系。
而个体条件期望图是从不同的预测开始,很难判断个体之间的条件期望曲线(ICE Curve)是否有差异,为了解决上述问题延伸了一个新方法,称作「Centered ICE Plot」。Centered ICE Plot 是将曲线做平移中心化的处理,其目的是为了表示特征在该点时个体间的预测差异。
Centered ICE 曲线则被定义为:
。xᵃ代表的是锚点( the anchor point),通常选择观察值的最小值或最大值做为锚点。
5.3 优缺点汇整
**👍🏻优点: ** 1.容易计算生成 2.解决了PDP资料异质性对结果产生的影响 3.更直观**👎🏻缺点: ** 1.只能展示一个特征与目标变数的关系图 2.具有很强的特征独立性假设 3.如果ICE plot的样本太多会导致折线图看起来非常拥挤凌乱
6 相关工具推荐
6.1 dtreeviz
链接:https://github.com/parrt/dtreeviz
使用demo:
导入所需要的包
from sklearn.datasets import * from sklearn import tree from dtreeviz.trees import *
构建回归树
regr = tree.DecisionTreeRegressor(max_depth=2) boston = load_boston() regr.fit(boston.data, boston.target) viz = dtreeviz(regr, boston.data, boston.target, target_name='price', feature_names=boston.feature_names) viz.view()
构建分类树
classifier = tree.DecisionTreeClassifier(max_depth=2) # limit depth of tree iris = load_iris() classifier.fit(iris.data, iris.target) viz = dtreeviz(classifier, iris.data, iris.target, target_name='variety', feature_names=iris.feature_names, class_names=["setosa", "versicolor", "virginica"] # need class_names for classifier ) viz.view()
查看预测路径
regr = tree.DecisionTreeRegressor(max_depth=2) # limit depth of tree diabetes = load_diabetes() regr.fit(diabetes.data, diabetes.target) X = diabetes.data[np.random.randint(0, len(diabetes.data)),:] # random sample from training viz = dtreeviz(regr, diabetes.data, diabetes.target, target_name='value', orientation ='LR', # left-right orientation feature_names=diabetes.feature_names, X=X) # need to give single observation for prediction viz.view()
更多功能 可以参考官方教程
6.2 shap
https://github.com/slundberg/shap
使用demo
import xgboost import shap # load JS visualization code to notebook shap.initjs() # train XGBoost model X,y = shap.datasets.boston() model = xgboost.train({"learning_rate": 0.01}, xgboost.DMatrix(X, label=y), 100) # explain the model's predictions using SHAP # (same syntax works for LightGBM, CatBoost, scikit-learn and spark models) explainer = shap.TreeExplainer(model) shap_values = explainer.shap_values(X) # visualize the first prediction's explanation (use matplotlib=True to avoid Javascript) shap.force_plot(explainer.expected_value, shap_values[0,:], X.iloc[0,:])
红色代表特征越重要,贡献量越大,蓝色代表特征不重要,贡献量低