ANN建模样本维度不匹配问题解决及年度特征重要性获取
解决train_test_split样本不匹配报错 + ANN特征重要性获取方案
一、先解决样本数不匹配的问题
你现在的核心问题是数据集维度搞反了:
- 多指标数据集
(22,30)应该是22个指标、30个年度样本,但机器学习模型要求输入X的维度必须是(样本数, 特征数),也就是你得把它转成(30,22),这样才和台风总数的30个样本对应上。
直接上代码修正:
import numpy as np from sklearn.model_selection import train_test_split # 假设你的多指标原始数据是X_raw,维度(22,30) X = X_raw.T # 转置后变成(30,22),30个样本,每个样本22个特征 y = 你的台风总数数组 # 维度保持(30,) # 现在可以正常执行划分 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
二、ANN模型的特征重要性获取方法
ANN属于黑箱模型,没有树模型那样原生的特征重要性,但有三种实用方法:
1. 基于输入层权重的简单分析
全连接ANN的输入层到第一个隐藏层的权重绝对值,能在一定程度上反映特征的初始影响力——权重绝对值越大,特征对模型的初始驱动越强。
# 假设训练好的ANN模型是model input_layer_weights = model.layers[0].get_weights()[0] # 形状(22, 隐藏层神经元数) # 计算每个特征的权重绝对值均值作为重要性评分 feature_importance = np.mean(np.abs(input_layer_weights), axis=1) # 按重要性从高到低排序输出 sorted_idx = np.argsort(feature_importance)[::-1] for idx in sorted_idx: print(f"指标{idx+1} 重要性: {feature_importance[idx]:.4f}")
⚠️ 注意:这种方法只能反映初始层的影响,无法体现后续层的特征交互,适合快速粗略分析。
2. 置换特征重要性(推荐通用方法)
通过随机打乱单个特征的取值,观察模型预测性能的下降幅度——下降越多,说明该特征对模型的实际贡献越大。这是模型无关的方法,适用于任何ML模型。
from sklearn.inspection import permutation_importance # 先确保模型已经训练完成 model.fit(X_train, y_train) # 在测试集上计算置换重要性,n_repeats是重复次数,次数越多结果越稳定 perm_result = permutation_importance(model, X_test, y_test, n_repeats=10, random_state=42) # 排序输出 sorted_idx = perm_result.importances_mean.argsort()[::-1] for idx in sorted_idx: print(f"指标{idx+1} 重要性均值: {perm_result.importances_mean[idx]:.4f} (标准差: {perm_result.importances_std[idx]:.4f})")
3. SHAP值分析(解释性最强)
SHAP基于博弈论,能精确计算每个特征对单个样本预测结果的贡献,也能汇总得到全局特征重要性,是黑箱模型解释的黄金标准。
import shap # 初始化DeepExplainer,用训练集数据作为背景 explainer = shap.DeepExplainer(model, X_train) # 计算测试集的SHAP值 shap_vals = explainer.shap_values(X_test) # 全局重要性:每个特征的SHAP值绝对值的均值 global_importance = np.mean(np.abs(shap_vals), axis=0) # 排序输出 sorted_idx = global_importance.argsort()[::-1] for idx in sorted_idx: print(f"指标{idx+1} 全局重要性: {global_importance[idx]:.4f}") # 还可以用SHAP汇总图可视化,更直观 shap.summary_plot(shap_vals, X_test)
内容的提问来源于stack exchange,提问作者shibashiba
相关产品推荐
相关产品推荐

