互相关特征筛选:基于目标变量相关性保留唯一特征的实现方法
你可以按以下逻辑实现自动筛选:
核心逻辑
- 提前存储每个特征和Target的相关系数绝对值,方便后续对比优先级
- 只处理特征相关矩阵的上三角区域,避免重复处理同一对特征(比如A和B、B和A视为同一对)
- 对每对互相关超过阈值的特征,直接剔除和Target相关绝对值更低的那个
- 最终保留Target+未被剔除的特征即可
完整实现代码
import pandas as pd import numpy as np # 假设你已经计算好相关矩阵corr corr = df.corr(method='pearson') threshold = 0.5 # 提取所有非Target的特征,以及它们和Target的相关绝对值 feature_target_abs_corr = abs(corr['Target']).drop('Target') all_features = feature_target_abs_corr.index.tolist() # 生成特征间相关矩阵的上三角,过滤对角线(自身相关系数为1,无意义)和下半区重复对 feature_corr_matrix = corr.loc[all_features, all_features] upper_triangle = feature_corr_matrix.where(np.triu(np.ones(feature_corr_matrix.shape), k=1).astype(bool)) # 收集待剔除的特征 drop_features = set() for col in upper_triangle.columns: for row in upper_triangle.index: corr_val = abs(upper_triangle.loc[row, col]) if corr_val > threshold: # 对比两个特征和Target的相关绝对值,剔除更低的 if feature_target_abs_corr[row] > feature_target_abs_corr[col]: drop_features.add(col) else: drop_features.add(row) # 生成最终数据集 keep_features = [f for f in all_features if f not in drop_features] final_df = df[['Target'] + keep_features]
运行结果说明
拿你给出的示例数据运行上述代码,会识别到Medicine和School的互相关系数0.76超过阈值,对比两者和Target的相关绝对值:Medicine是0.08、School是0.04,因此School会被加入待剔除列表,最终得到的final_df包含的列就是你需要的Target、Politics、Medicine、Hospital、Domestic。
如果遇到两个特征和Target的相关绝对值完全相等的情况,你可以根据需求自行调整规则,比如优先保留业务含义更重要的特征,或者随机剔除其一即可。
内容的提问来源于stack exchange,提问作者LdM
相关产品推荐
相关产品推荐

