如何用Python互信息分析筛选RNN能源分解建模的高影响力输入特征
RNN能源分解任务的互信息特征筛选Python实现
做能源分解这类任务时,特征和目标值之间普遍存在非线性关联,用互信息做特征筛选比皮尔逊相关系数这类只能捕捉线性关系的方法更适配,能有效找出对预测目标贡献最高的输入变量。
核心逻辑
互信息衡量的是两个变量之间共享的信息量,取值范围为[0, +∞):
- 得分越接近0,说明特征和目标值越独立,对预测几乎没有贡献
- 得分越高,说明特征能为目标值预测提供的有效信息越多
因为你要预测的是数值型目标,属于回归任务,直接用适配回归场景的互信息估计算法即可。
完整实现代码
首先确保已经安装需要的依赖:pandas、numpy、scikit-learn、matplotlib,然后按步骤运行即可。
import pandas as pd import numpy as np from sklearn.feature_selection import mutual_info_regression import matplotlib.pyplot as plt # 1. 加载数据、拆分特征与目标 df = pd.read_csv("你的能源数据集路径.csv") # 替换成你要预测的那1列的字段名 target_column = "待预测的目标列名" # 24个候选特征为除目标列外的所有字段 X = df.drop(columns=[target_column]) y = df[target_column] # 2. 基础数据清洗:处理空值/无穷值,互信息计算不允许输入存在缺失 X = X.replace([np.inf, -np.inf], np.nan).fillna(X.mean()) y = y.replace([np.inf, -np.inf], np.nan).fillna(y.mean()) # 3. 计算所有候选特征的互信息得分 # 固定random_state保证结果可复现,因为互信息估计用到了近邻采样 mi_scores = mutual_info_regression(X, y, random_state=42) # 整理成可排序的结构 mi_result = pd.Series(mi_scores, index=X.columns, name="互信息得分").sort_values(ascending=False) # 4. 筛选有效特征,两种方案二选一即可 # 方案A:按阈值筛选,比如保留得分大于所有特征平均得分的项 score_threshold = mi_result.mean() selected_features = mi_result[mi_result > score_threshold].index.tolist() # 方案B:固定保留TopN个最高得分特征,适合明确知道要控制输入维度的场景 # top_k = 15 # selected_features = mi_result.head(top_k).index.tolist() print(f"筛选得到{len(selected_features)}个有效输入特征:\n", selected_features) # 可选:可视化所有特征的得分,方便人工判断阈值 plt.figure(figsize=(10, 7)) mi_result.plot(kind="bar") plt.title("候选特征与目标列互信息得分排序") plt.ylabel("MI Score") plt.tight_layout() plt.show()
任务适配注意事项
- 互信息默认计算的是原始字段的静态关联,你做RNN任务一般需要构造时序滑窗特征(比如历史N步的滞后值、窗口内的均值/方差等统计量),建议先把所有时序衍生特征构造完成后,再跑互信息筛选,结果会更贴合RNN的输入场景。
- 不要盲目留高分特征:如果两个高分特征本身的相关性极强(比如总功率和分相功率、室外温度和室外体感温度),只留一个即可,冗余输入会拖慢RNN训练速度,还容易引发过拟合。
- 别把互信息结果当唯一判断标准:静态互信息抓不住条件依赖关系,比如有些特征只有在特定设备启动时才和目标强相关,平时波动很小,这类特征算出来的得分可能很低,但实际对分解精度影响不小。筛完可以拿2-3个低分特征做对照实验,看加入后模型验证集的RMSE、MAE有没有下降,比纯统计判断靠谱。
- 不用特意给特征做归一化/标准化:互信息是基于变量的概率分布计算的,对特征数值尺度不敏感,只要把空值、异常值处理干净就能出稳定结果。
内容的提问来源于stack exchange,提问作者Amin Hosseini
相关产品推荐
相关产品推荐

