【特征选择】相关系数法
·
特征选择最常用:相关系数法|原理+代码+可视化全攻略
相关系数法是机器学习中最简单、最直观、最常用的特征选择方法之一,专门用来删除高度冗余、信息重复的特征。它只看特征之间的线性相关程度,计算快、易解释,是数据预处理必学技能。
一、什么是相关系数法?一句话看懂
相关系数法 = 计算特征之间的相关性 → 删掉高度重复的特征,只留一个。
核心思想:
- 如果两个特征非常像(相关系数接近 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=∑(Xi−Xˉ)2∑(Yi−Yˉ)2∑(Xi−Xˉ)(Yi−Yˉ)
取值范围:-1 ~ +1
- r ≈ 1:强正相关(一起变大)
- r ≈ -1:强负相关(你大我小)
- r ≈ 0:几乎没关系
四、相关系数法怎么做?(4步流程)
- 计算所有特征两两之间的相关系数
- 画热力图,一眼看出谁和谁高度相关
- 设定阈值(常用 0.8 / 0.9)
- 超过阈值 → 删掉其中一个特征
五、为什么要用相关系数法?(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()
九、相关系数法的优点
- 简单直观:热力图一目了然
- 速度极快:不用训练模型
- 有效去冗余:特别适合线性关系强的数据
- 提升模型稳定性:减少多重共线性
十、相关系数法的缺点(必看)
- 只认线性关系:非线性关系发现不了
- 对异常值敏感:极端值会影响相关性
- 不能判断谁更重要:只能删重复,不能判断对目标是否有用
- 只能用于连续特征:类别特征不能直接用
十一、什么时候用相关系数法?
- 特征多、担心冗余
- 特征之间明显是线性关系(如面积、尺寸、长度)
- 快速预处理、快速降维
- 线性模型(回归、逻辑回归、SVM)之前
十二、最简单总结(背诵版)
- 相关系数法 = 删高度相关的冗余特征
- 看热力图 → 超过阈值(0.8/0.9)→ 删一个
- 优点:简单、快、稳
- 缺点:只看线性、对异常值敏感
- 最适合:线性关系明显、特征多、需要快速降维
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)