随机森林二分类模型使用TreeSHAP计算SHAP值时出现Kernel停止错误的解决求助
随机森林二分类模型使用TreeSHAP计算SHAP值时出现Kernel停止错误的解决求助
大家好,我现在遇到一个特别诡异的问题,折腾了好几天都没头绪,想请社区的朋友们帮忙分析下怎么解决:
我正在用约9500条样本数据做二分类预测,特征数量在36-37个之间。模型用的是scikit-learn的随机森林,先做了80/20的训练测试划分,用GridSearchCV调参后,想用TreeSHAP计算特征的SHAP值做可解释性分析。
问题核心
- 当特征数是37个时,TreeSHAP的计算完全正常,所有SHAP图(summary、beeswarm、force、waterfall、dependency)都能顺利生成,没有任何问题
- 但不管删掉哪一个特征,只要特征数降到36个,计算SHAP值的时候就会直接触发内核崩溃,提示
Kernel stopped. Rebooting...,Spyder和JupyterLab里都会出现同样的问题
我排查了各种可能的原因,实在找不到突破口,想请大家给点思路。
环境与特征情况
- 系统:Windows 11
- 依赖版本:Python 3.11.11,Scikit-learn 1.5.1,shap 0.46.0(通过Anaconda 3安装)
- 特征类型:仅1个数值型变量,其余全是类别型(名义/有序)变量
关键代码片段
from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler, OneHotEncoder from sklearn.compose import make_column_transformer from sklearn.pipeline import make_pipeline from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import GridSearchCV import shap import numpy as np # 数据划分 X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42, test_size=0.2) # 训练集大小:7516,测试集大小:1880 # 预处理管道 num_tuple = (StandardScaler(), num_clms) # num_clms为数值特征列 cat_tuple = (OneHotEncoder(), cat_clms) # cat_clms为类别特征列 preprocessor = make_column_transformer( num_tuple, cat_tuple, sparse_threshold=0, verbose_feature_names_out=False ) # 随机森林模型与调参 rf = RandomForestClassifier() rf_pipe = make_pipeline(preprocessor, rf) rf_pipe.fit(X_train, y_train) # GridSearchCV调参 param_grid = { 'randomforestclassifier__class_weight': ['balanced'], 'randomforestclassifier__max_depth': [10, 100, 1000], 'randomforestclassifier__max_leaf_nodes': [10, 100, 1000], 'randomforestclassifier__n_estimators': [10, 100] } rf_gs = GridSearchCV(rf_pipe, param_grid, verbose=2) rf_gs.fit(X_train, y_train) best_rf_gs = rf_gs.best_estimator_ best_rf_gs.fit(X_train, y_train) # 提取模型计算SHAP值(崩溃触发点) rf_classifier = best_rf_gs.named_steps['randomforestclassifier'] explainer = shap.TreeExplainer(rf_classifier) try: shap_values = explainer(X_test, check_additivity=False) # 内核在这里突然停止 except Exception as e: import traceback traceback.print_exc() # 后续SHAP绘图代码(37特征时可正常运行) clustering = shap.utils.hclust(X_test, y_test) shap.plots.bar(shap_values[:,:,0], max_display=40, clustering=clustering, clustering_cutoff=0.5 )
已尝试的解决方法(均无效)
- 添加异常处理、用Spyder调试,但只能定位到崩溃发生在SHAP库内部,没有更多错误细节
- 更新shap、scikit-learn、Python到最新版本,问题依然存在
- 减半样本数量、把特征减少到30/20个,还是会触发内核崩溃
- 任务管理器监控内存,没有明显的内存不足情况(37特征时能正常运行,说明不是单纯内存问题)
- 反复检查代码逻辑,因为37特征时能正常执行,所以排除简单代码错误的可能
请问有没有人遇到过类似的问题?或者有什么其他排查方向可以尝试?
备注:内容来源于stack exchange,提问作者user29244078
相关产品推荐
相关产品推荐

