如何利用SHAP值实现EEG生物标志物的分组特征重要性分析?
求助:EEG生物标志物的SHAP值分组汇总问题
背景
- 基于不同机器学习算法+预处理步骤组合训练EEG生物标志物模型,所有模型采用StratifiedGroupKFold进行6折训练,每折模型以
joblib格式存储 - EEG每个频段的生物标志物由全部电极信号组成,单个生物标志物的特征不可拆分,必须保留所有电极数据
需求
初始用全量生物标志物训练模型,现在需要通过SHAP分析特征重要性,筛选可剔除的生物标志物,要求针对每个预处理步骤和模型单独分析。目前无法正确对单个生物标志物下的所有电极通道SHAP值进行汇总。
已完成工作与问题
- 已参考论文实现跨折的SHAP值汇总,代码如下:
for r, fold_file in enumerate(fold_files): model = joblib.load(fold_file) fold_splits = list(sgkf.split(X, y, groups)) for train_index, test_index in fold_splits: X_train, X_test = X.iloc[train_index], X.iloc[test_index] y_train, y_test = y.iloc[train_index], y.iloc[test_index] explainer = shap.Explainer(model, X_train) train_shap_values = explainer(X_train) test_shap_values = explainer(X_test) for i in range(len(train_index)): train_folds_shap_values[train_index[i]] += train_shap_values.values[i] / (len(fold_splits) - 1) for i in range(len(test_index)): test_folds_shap_values[test_index[i]] += test_shap_values.values[i] average_train_folds_shap_values = train_folds_shap_values / R average_test_folds_shap_values = test_folds_shap_values / R train_shap_df = pd.DataFrame(average_train_folds_shap_values, columns=columns) test_shap_df = pd.DataFrame(average_test_folds_shap_values, columns=columns)
- 尝试按生物标志物分组汇总SHAP值,代码如下:
grouped_features = group_features(columns, biomarker_names, bands) def aggregate_shap_values(shap_df, grouped_features): aggregated_shap_values = pd.DataFrame() for group, features in grouped_features.items(): aggregated_shap_values[group] = shap_df[features].sum(axis=1) return aggregated_shap_values train_aggregated_shap_df = aggregate_shap_values(train_shap_df, grouped_features) test_aggregated_shap_df = aggregate_shap_values(test_shap_df, grouped_features) shap.summary_plot(train_aggregated_shap_df.values, feature_names=train_aggregated_shap_df.columns.tolist())
- 当前问题:分组后的SHAP可视化无法体现不同生物标志物的重要性差异,与未分组的可视化效果差距明显:
- 分组后可视化:

- 未分组可视化:

恳请各位提供正确的生物标志物SHAP值分组汇总方法,让可视化能有效区分不同生物标志物的重要性。
内容的提问来源于stack exchange,提问作者Zachai
相关产品推荐
相关产品推荐

