如何删除乳腺癌数据集中与目标相关性较低的高相关特征
乳腺癌数据集高相关特征筛选实现
1. 加载数据集
使用scikit-learn内置的乳腺癌数据集,加载代码如下:
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from sklearn.datasets import load_breast_cancer data = load_breast_cancer() df = pd.DataFrame(data.data, columns=data.feature_names) df['target'] = data.target df['target'] = df['target'].map({0:'malignant', 1:'benign'})
2. 绘制特征相关性热力图
通过以下代码计算特征间的相关性并绘制热力图:
corr_mat = df.corr() mask = np.triu(np.ones_like(corr_mat, dtype=bool)) heatmap = sns.heatmap(corr_mat, vmin=-1, vmax=1, mask=mask, cmap='BrBG')

3. 实现高相关特征筛选逻辑
设定相关性绝对值大于0.7为高相关阈值,对于每对高相关特征,删除与目标变量df['target']相关性较低的那个。完整实现代码如下:
# 计算每个特征与目标变量的相关性绝对值 target_corr = df.corr()['target'].abs() # 用集合存储待删除的特征,避免重复操作 cols_to_drop = set() corr_mat = df.corr() for i in range(len(corr_mat.columns)): for j in range(i): col_i = corr_mat.columns[i] col_j = corr_mat.columns[j] # 跳过目标列以及已标记要删除的列 if col_i == 'target' or col_j == 'target' or col_i in cols_to_drop or col_j in cols_to_drop: continue # 判断特征对是否高度相关 if abs(corr_mat.iloc[i, j]) > 0.7: # 比较两个特征与目标变量的相关性,删除相关性更低的那个 if target_corr[col_i] < target_corr[col_j]: cols_to_drop.add(col_i) else: cols_to_drop.add(col_j) # 执行删除操作,得到筛选后的数据集 df_filtered = df.drop(cols_to_drop, axis=1)
代码说明
- 先预计算所有特征与目标变量的相关性绝对值,简化后续比较步骤
- 使用集合存储待删除列,避免重复删除同一特征
- 遍历特征对时跳过目标列和已标记删除的列,减少无效计算
- 对高相关特征对,始终保留与目标变量相关性更高的特征,确保筛选后的特征更具预测价值
内容的提问来源于stack exchange,提问作者Amina Umar
相关产品推荐
相关产品推荐

