NGBoost-shap方法回归任务,由斯坦福吴恩达团队提出,属于集成模型的一种2019年提出的,算是比较新的方法了 自带数据集,可以直接运行,对模型采用shap进行分析,所有图所见即所得 python 代码
NGBoost这玩意儿最近在回归任务里挺火,作为吴恩达团队整出来的新活,它最骚的地方在于既能预测数值还能估计不确定性。咱们今天直接上手实操,用自带数据集快速搞个可复现的demo,顺带用SHAP把模型掰开了揉碎了看看。
先装个环境(别问,问就是pip大法好):
pip install ngboost shap上代码直接开整!先加载内置的糖尿病数据集:
from ngboost import NGBRegressor from sklearn.datasets import load_diabetes from sklearn.model_selection import train_test_split X, y = load_diabetes(return_X_y=True) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) ngb = NGBRegressor(Dist=ngboost.distns.Normal, n_estimators=100) ngb.fit(X_train, y_train) # 预测时同时拿到预测值和置信区间 preds = ngb.pred_dist(X_test) print(f"均值预测示例:{preds.params['loc'][:3]}") print(f"标准差示例:{preds.params['scale'][:3]}")这里用了正态分布作为基分布,n_estimators设到100能保证基础学习器足够多。预测结果直接返回分布参数,比普通回归只能输出个数值有意思多了。
接下来用SHAP扒开模型看细节:
import shap # 用TreeExplainer适配树模型结构 explainer = shap.TreeExplainer(ngb) shap_values = explainer.shap_values(X_test) # 特征重要性可视化 shap.summary_plot(shap_values, X_test, feature_names=load_diabetes().feature_names)运行后会跳出两张神图:第一张是特征总体重要性,明显能看到s5(血清检测指标)和age对预测结果影响最大;第二张是特征作用方向图,每个点颜色代表特征值大小,能直观看到高年龄对应的预测值偏移方向。
想具体看单个预测案例?上force_plot:
# 选个有意思的样本观察 sample_idx = 15 shap.force_plot(explainer.expected_value, shap_values[sample_idx], X_test[sample_idx], feature_names=load_diabetes().feature_names)这图看着就很有说服力——基线值在150左右,s5特征硬生生把预测结果拉低了20个点,bmi又给顶上去10个点。这种可视化比看表格里的系数值直观十个Level!
实测中发现NGBoost对参数挺敏感,把Dist换成LogNormal分布,预测区间立马变得右偏。SHAP分析时也会发现特征影响方向发生微妙变化,这说明模型结构的选择会直接影响可解释性结果。建议跑多个分布配置对比着看,特别是当业务场景对不确定性方向有要求时。
最后来个骚操作:把预测分布画出来看不确定性
import matplotlib.pyplot as plt plt.figure(figsize=(10,6)) plt.scatter(y_test, preds.params['loc'], alpha=0.5) plt.errorbar(y_test, preds.params['loc'], yerr=2*preds.params['scale'], fmt='o', alpha=0.3) plt.plot([y.min(), y.max()], [y.min(), y.max()], 'r--')这个误差带可视化直接暴露了模型在极端值区域的预测乏力——当真实值超过250时,预测点明显偏离红色对角线,同时误差带急剧变宽。这种双重可视化把模型优缺点直接拍脸上,比单纯看R²得分带劲多了。
总结下来,NGBoost+SHAP的组合拳特别适合需要量化不确定性的场景(比如金融风控、医疗预测)。代码层面几乎零魔改就能出效果,但要注意分布假设对可解释性的影响。下次遇到产品经理说"我要个能解释的AI",直接甩这个方案过去就完事了。