You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

随机森林二分类模型使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 14:23:06