使用np.corrcoef筛选与标签y最优关联特征的实现及优化问题
高相关性最优特征列筛选的代码优化
现有代码的核心问题
- 遍历范围逻辑错误:原代码以样本量
len(data_y)作为列遍历的上限,但实际特征列数为data_x.shape[1],当特征列数小于样本数时,后续循环遍历会直接触发列索引越界报错 - 计算效率偏低:逐列单独调用
np.corrcoef计算相关系数,在大特征量场景下会产生不必要的重复运算开销,没有发挥numpy矩阵批量计算的优势
高效实现方案
利用np.corrcoef的批量计算能力,一次性完成所有特征与标签的相关系数计算,既从根源上避免越界问题,又能把循环级的计算耗时降到矩阵运算的水平:
import numpy as np data_x = np.array([[0.885, 0.330, 9.100],[0.725, 0.390, 10.900],[0.560, 0.500, 9.400],[0.735, 0.570, 9.800],[0.610, 0.630, 8.400],[0.260, 0.630, 11.800],[0.500, 0.680, 10.500],[0.320, 0.780, 10.000]]) data_y = np.array([4.000, 5.000, 6.000, 5.000, 3.000, 8.000, 7.000, 6.000]) # 拼接矩阵:将特征转置为「每行一个特征」,最后一行拼接标签y input_matrix = np.vstack([data_x.T, data_y]) # 批量计算所有变量的互相关矩阵 corr_matrix = np.corrcoef(input_matrix) # 提取标签与所有特征的相关系数,取绝对值后定位最大值对应的列索引 corr_scores = np.abs(corr_matrix[-1, :-1]) splitXi = int(np.argmax(corr_scores))
实现说明
- 计算结果与原逻辑完全一致:测试样例下得到的相关系数数组为
[0.73117578 0.40620284 0.82562664],最终定位的最优特征列索引为2,和原方法的预期输出完全匹配 - 如果保留逐列循环的实现方式,必须将循环范围从
range(0, len(data_y))修改为range(0, data_x.shape[1]),从逻辑上匹配特征列的遍历范围,杜绝越界问题 - 相关系数取绝对值的逻辑保留,可同时匹配强正相关、强负相关两种高关联场景的筛选需求
内容的提问来源于stack exchange,提问作者Stefania Axo
相关产品推荐
相关产品推荐

