趋近智
如本章前面所述,过滤方法根据特征的固有属性对其进行评估,不依赖于任何特定的机器学习模型。此类方法中一个常用的技术是相关性分析,专门用于识别并可能移除冗余特征。
当多个特征传达非常相似的信息时,就会出现冗余。例如,如果您有“摄氏温度”和“华氏温度”这两个特征,它们是完全相关的,其中一个就是冗余的。包含高度相关的特征有时会使某些模型(如因多重共线性导致的线性回归)变得不稳定,并增加不必要的复杂性,而无助于提升预测能力。相关性分析可帮助我们发现这些关系。
我们通常使用皮尔逊相关系数(表示为r)来衡量两个数值特征之间的线性关系。该系数的取值范围从-1到+1:
介于0和±1之间的值表示线性关联的强度和方向。一个接近±1的值表明存在强的线性关系,而接近0的值则表示线性关系微弱或不存在。
在Python中,Pandas库使得使用.corr()方法计算DataFrame中所有数值列之间的成对相关性变得简单直接。
import pandas as pd
import numpy as np
# 假设 'df' 是包含数值特征的 DataFrame
# 如果 df 包含混合类型,只选择数值列
numerical_df = df.select_dtypes(include=np.number)
# 计算相关矩阵
correlation_matrix = numerical_df.corr()
# 显示矩阵(可选)
print(correlation_matrix)
结果是一个方阵,行i和列j处的条目是特征i与特征j之间的相关系数。对角线元素总是1(特征与自身的相关性)。
虽然该矩阵包含原始数值,但将其可视化为热图通常能提供更清晰的视图,尤其是在处理大量特征时。我们可以使用Matplotlib或Seaborn等库,或通过Plotly生成交互式图表。
示例相关性热图,呈现四个特征之间线性关系的强度和方向。红色表示正相关,蓝色表示负相关,浅色表示弱相关。
核心思路是识别具有高绝对相关性(例如 ∣r∣>0.8 或 ∣r∣>0.9)的特征对,然后决定移除哪个或哪些特征。
以下是根据阈值查找和收集要剔除特征的编程方法:
import pandas as pd
import numpy as np
# 假设 'correlation_matrix' 已如上计算
# 假设 'threshold' 已定义 (例如, threshold = 0.9)
# 使用绝对相关性
abs_corr_matrix = correlation_matrix.abs()
# 获取相关矩阵的上三角部分(不包括对角线)
upper_triangle = abs_corr_matrix.where(np.triu(np.ones(abs_corr_matrix.shape), k=1).astype(bool))
# 查找相关性高于阈值的特征
to_drop = set() # 使用集合避免重复
for column in upper_triangle.columns:
highly_correlated_with = upper_triangle.index[upper_triangle[column] > threshold].tolist()
if highly_correlated_with:
# 基本策略:如果当前列与任何之前的列高度相关,则将其剔除
# 这里可以实现更复杂的策略
# 为简单起见,如果它与任何已检查的特征(索引 < 列)高度相关,则收集其列名
if any(upper_triangle[column] > threshold):
to_drop.add(column) # 示例:添加特征对中的第二个特征
print(f"考虑剔除的特征(基于阈值 {threshold}):{list(to_drop)}")
# 从原始 DataFrame 中剔除选定的特征
# df_reduced = df.drop(columns=list(to_drop))
# print(f"原始特征数量:{df.shape[1]}")
# print(f"相关性过滤后的特征数量:{df_reduced.shape[1]}")
注意: 决定剔除特征对中哪个特征的逻辑需要仔细考虑。上面的示例使用了一种简单方法;更精细的逻辑可能涉及比较特征与目标的关联性或使用其他指标。请小心,避免因迭代不当而意外地剔除高度相关对中的两个特征。使用上三角有助于避免重复检查和自相关。
尽管相关性分析作为过滤方法很有用,但它存在局限性:
尽管存在这些局限性,但检查并移除高度相关的数值特征是特征选择过程中一个标准且通常有益的步骤,通过减少特征冗余,有助于创建更简单、更稳定的模型。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造