特征选择最常用:相关系数法|原理+代码+可视化全攻略

相关系数法是机器学习中最简单、最直观、最常用的特征选择方法之一,专门用来删除高度冗余、信息重复的特征。它只看特征之间的线性相关程度,计算快、易解释,是数据预处理必学技能。


一、什么是相关系数法?一句话看懂

相关系数法 = 计算特征之间的相关性 → 删掉高度重复的特征,只留一个。

核心思想:

  • 如果两个特征非常像(相关系数接近 1 或 -1)
  • 它们就是重复信息
  • 只留一个,删掉另一个,减少冗余、提速、防过拟合

二、最通俗的比喻:删双胞胎

你有10个特征:

  • 面积、房间数、房龄、位置、距离市中心…

如果“面积”和“房间数”几乎总是一起变大变小,像双胞胎,信息几乎一样。
相关系数法就是:删掉一个双胞胎,留一个就行


三、皮尔逊相关系数(最核心)

用来衡量两个连续变量的线性关系强弱

公式(看懂就行):
r=∑(Xi−Xˉ)(Yi−Yˉ)∑(Xi−Xˉ)2∑(Yi−Yˉ)2 r=\frac{\sum\left(X_{i}-\bar{X}\right)\left(Y_{i}-\bar{Y}\right)}{\sqrt{\sum\left(X_{i}-\bar{X}\right)^{2} \sum\left(Y_{i}-\bar{Y}\right)^{2}}} r=(XiXˉ)2(YiYˉ)2 (XiXˉ)(YiYˉ)

取值范围:-1 ~ +1

  • r ≈ 1:强正相关(一起变大)
  • r ≈ -1:强负相关(你大我小)
  • r ≈ 0:几乎没关系

四、相关系数法怎么做?(4步流程)

  1. 计算所有特征两两之间的相关系数
  2. 画热力图,一眼看出谁和谁高度相关
  3. 设定阈值(常用 0.8 / 0.9
  4. 超过阈值 → 删掉其中一个特征

五、为什么要用相关系数法?(4大好处)

  1. 超级简单:会看热力图就会用
  2. 计算飞快:不训练模型,直接统计
  3. 删除冗余:减少重复信息,模型更稳
  4. 防过拟合:特征越少,模型越不容易乱学

六、Python 完整实战(房价预测)

直接复制可运行!

1. 导入库

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression, Lasso
from sklearn.metrics import mean_squared_error, r2_score

2. 生成模拟房价数据

np.random.seed(42)
n = 1000

area = np.random.normal(1500, 500, n)
rooms = np.random.normal(4, 1, n)
age = np.random.normal(20, 10, n)
location = np.random.choice([1,2,3,4], n)
distance = np.random.normal(5, 2, n)

# 目标:房价
price = 20000 + 100*area + 2000*rooms - 500*age - 3000*distance + np.random.normal(0,5000,n)

df = pd.DataFrame({
    'Area': area,
    'Rooms': rooms,
    'Age': age,
    'Location': location,
    'Distance_to_Center': distance,
    'Price': price
})

df.head()

3. 计算相关矩阵 + 热力图(关键)

# 计算相关系数
corr = df.corr()

# 画热力图
plt.figure(figsize=(10,8))
sns.heatmap(corr, annot=True, cmap='coolwarm', fmt='.2f', linewidths=0.5)
plt.title('特征相关系数热力图', fontsize=14)
plt.show()

看图就能直接删特征!


七、开始特征选择(删冗余)

# 设定阈值:超过0.8就算高度相关
threshold = 0.8

# 找出高度相关的特征对
high_corr = []
for i in range(len(corr.columns)):
    for j in range(i):
        if abs(corr.iloc[i, j]) > threshold:
            high_corr.append((corr.columns[i], corr.columns[j], corr.iloc[i, j]))

print("高度相关特征对:")
for item in high_corr:
    print(item)

假设我们发现 Area 和 Rooms 高度相关,我们删除 Rooms。

# 最终选择的特征
selected = ['Area', 'Age', 'Location', 'Distance_to_Center']

X = df[selected]
y = df['Price']

八、建模看看效果(筛选前后对比)

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

# 线性回归
model = LinearRegression()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)

print('===== 模型效果 =====')
print('MSE:', mean_squared_error(y_test, y_pred).round(2))
print('R2:', r2_score(y_test, y_pred).round(2))

可视化:真实值 vs 预测值

plt.figure(figsize=(10,6))
sns.scatterplot(x=y_test, y=y_pred, alpha=0.7)
plt.plot([y.min(), y.max()], [y.min(), y.max()], 'r--')
plt.title('真实价格 vs 预测价格')
plt.xlabel('真实')
plt.ylabel('预测')
plt.show()

九、相关系数法的优点

  1. 简单直观:热力图一目了然
  2. 速度极快:不用训练模型
  3. 有效去冗余:特别适合线性关系强的数据
  4. 提升模型稳定性:减少多重共线性

十、相关系数法的缺点(必看)

  1. 只认线性关系:非线性关系发现不了
  2. 对异常值敏感:极端值会影响相关性
  3. 不能判断谁更重要:只能删重复,不能判断对目标是否有用
  4. 只能用于连续特征:类别特征不能直接用

十一、什么时候用相关系数法?

  • 特征多、担心冗余
  • 特征之间明显是线性关系(如面积、尺寸、长度)
  • 快速预处理、快速降维
  • 线性模型(回归、逻辑回归、SVM)之前

十二、最简单总结(背诵版)

  • 相关系数法 = 删高度相关的冗余特征
  • 看热力图 → 超过阈值(0.8/0.9)→ 删一个
  • 优点:简单、快、稳
  • 缺点:只看线性、对异常值敏感
  • 最适合:线性关系明显、特征多、需要快速降维
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐