corr()方法可快速计算数值特征间皮尔逊相关系数,返回对称矩阵,自动跳过非数值列和含NaN行;需先用select_dtypes提取数值列,再设阈值(如|r|>0.8)识别强相关特征对。

用 corr() 快速计算数值特征相关系数
直接调用 Pandas DataFrame 的 corr() 方法是最省力的起点,它默认用皮尔逊(Pearson)法计算两两数值列之间的线性相关性,返回一个对称矩阵。注意:它会自动跳过非数值列(如字符串、时间戳),也忽略含 NaN 的行对——这点容易被忽略,导致样本量缩水却不自知。
常见错误是直接对原始数据跑 corr(),结果发现某些列“消失”了,其实是它们被 Pandas 当作非数值类型过滤掉了。可先用 df.dtypes 检查,再用 df.select_dtypes(include=['number']) 显式提取数值列。
示例:
num_df = df.select_dtypes(include=['number']) corr_matrix = num_df.corr(method='pearson') # method 可选 'spearman' 或 'kendall'
设定阈值并定位高相关特征对
相关系数绝对值 > 0.8 或 0.9 常被视作强相关,但阈值没有银弹——得看业务场景。比如金融风控中 0.6 就可能需干预;而图像特征提取后常有大量弱相关(|r|
立即学习“Python免费学习笔记(深入)”;
关键不是只看单个值,而是找出「成对」的高相关组合,并避免重复(A-B 和 B-A 是同一对)。推荐用 np.triu() 掩掉上三角,再用布尔索引提取:
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
- 用
np.triu(np.ones(corr_matrix.shape), k=1)构造上三角掩码 -
corr_matrix.where(mask).stack().abs().sort_values(ascending=False)得到降序排列的特征对 - 结果是
MultiIndex Series,索引为(feature_a, feature_b),值为 |r|
剔除策略:保留业务意义强或缺失更少的那个
不能只按字母顺序或出现顺序删——这会让模型失去解释性或稳定性。实际操作中优先保留:feature 名更贴近业务定义的(如 loan_amount 比 log_loan_amount 更基础),或 df[feature].isna().sum() 缺失值更少的,或方差更大的(df[feature].var())。
还有一个易踩坑点:别在原始训练集上一次性剔除所有高相关列。如果后续要部署,必须把剔除逻辑固化为预处理步骤(例如封装进 ColumnTransformer 或自定义 Transformer),否则线上 inference 时列不一致会直接报错 KeyError。
注意非线性关系和分类特征
corr() 只抓线性关系。若散点图呈抛物线或分段趋势,corr() 可能接近 0,但实际有强关联——这时该看 sns.scatterplot() 或计算 sklearn.feature_selection.mutual_info_regression()。
对于分类特征(如 city, product_type),不能硬套 corr()。应先做独热编码(pd.get_dummies())再算相关性,或改用 sklearn.feature_selection.mutual_info_classif()(分类目标)或 chi2()(卡方检验,要求特征也离散化)。
真正麻烦的是混合类型:一个数值特征和一个高基数分类特征(如用户 ID)之间,相关性指标本身意义不大——这时候更该怀疑是否引入了数据泄露,而不是纠结相关系数大小。

















