先来点实在的,咱们今天用糖尿病数据集实操一把Stacking模型和SHAP分析的组合拳。直接上代码不废话,关键处会穿插接地气的解读

张开发
2026/4/12 3:24:39 15 分钟阅读

分享文章

先来点实在的,咱们今天用糖尿病数据集实操一把Stacking模型和SHAP分析的组合拳。直接上代码不废话,关键处会穿插接地气的解读
stacking二分类模型加shap完整 python实现 配合二分类模型全套使用效果更佳 1.通过模型超参数优化得到每个子模型的最优模型 2.选择性能排行前top5的模型作为stacking模型的子模型 3.分别对子模型作shap特征分析以不同特征分析不同子模型 将各个子模型输出作为父模型输入作shap分析以评估不同子模型对最终输出的影响 5.对整个stacking模型作shap分析以评估特征对staking模型的影响 6.建立单个特征的shap依赖图来更加清晰的表现不同特征或不同模型输出对最终staking结果的影响 案例数据使用糖尿病数据集 可替换其他数据集使用先搞五个能打的基模型from sklearn.ensemble import RandomForestClassifier from xgboost import XGBClassifier from lightgbm import LGBMClassifier from sklearn.svm import SVC from sklearn.linear_model import LogisticRegression # 这里偷懒用默认参数占位实际记得用网格搜索 base_models [ (rf, RandomForestClassifier(n_estimators100)), (xgb, XGBClassifier()), (lgb, LGBMClassifier()), (svm, SVC(probabilityTrue)), (lr, LogisticRegression()) ]调参这活儿虽然枯燥但必须得做举个栗子给SVM调参svm_params { C: [0.1, 1, 10], kernel: [linear, rbf] } grid GridSearchCV(SVC(), svm_params, cv5) grid.fit(X_train, y_train) best_svm grid.best_estimator_调完参后按AUC排序选前五假设我们选出了随机森林、XGBoost、LightGBM、SVM和逻辑回归。接下来是模型叠罗汉的核心环节from sklearn.ensemble import StackingClassifier stack_model StackingClassifier( estimatorsbase_models, final_estimatorLogisticRegression(), cv5 ) stack_model.fit(X_train, y_train)这里有个小陷阱——用概率输出还是类别输出建议用概率值更有利于元模型学习特征间的关系。SHAP分析环节才是重头戏先看单个模型的特征影响import shap # 拿随机森林开刀 rf_explainer shap.TreeExplainer(stack_model.named_estimators_[rf]) shap_values rf_explainer.shap_values(X_test) shap.summary_plot(shap_values, X_test, plot_typebar)有趣的现象出现了血糖指标在树模型里权重爆表但在SVM里却被年龄特征抢了风头。这说明不同模型捕捉到的特征模式存在显著差异。stacking二分类模型加shap完整 python实现 配合二分类模型全套使用效果更佳 1.通过模型超参数优化得到每个子模型的最优模型 2.选择性能排行前top5的模型作为stacking模型的子模型 3.分别对子模型作shap特征分析以不同特征分析不同子模型 将各个子模型输出作为父模型输入作shap分析以评估不同子模型对最终输出的影响 5.对整个stacking模型作shap分析以评估特征对staking模型的影响 6.建立单个特征的shap依赖图来更加清晰的表现不同特征或不同模型输出对最终staking结果的影响 案例数据使用糖尿病数据集 可替换其他数据集使用元模型的SHAP分析更带劲# 提取各基模型的预测概率作为新特征 meta_features np.column_stack([m.predict_proba(X_test)[:,1] for m in stack_model.estimators_]) # 创建元模型解释器 meta_explainer shap.LinearExplainer(stack_model.final_estimator_, meta_features) meta_shap meta_explainer.shap_values(meta_features) shap.summary_plot(meta_shap, meta_features, feature_names[m[0] for m in base_models])这时候你会看到类似这样的结论XGBoost和LightGBM的预测结果对最终决策起主导作用而SVM的贡献度像个打酱油的——这说明在模型融合时可能存在冗余特征。最后来个特征依赖图压轴shap.dependence_plot( BloodPressure, shap_values[1], X_test, interaction_indexBMI )这张图会告诉你当血压高于140时其对患病风险的贡献呈现指数级增长特别是在BMI大于30的样本中这种效应会被进一步放大。整个流程跑下来大概需要喝两杯咖啡的时间但换来的模型可解释性提升绝对物超所值。想换数据集玩的记得处理好特征缺失和类别编码别让数据坑了模型。

更多文章