趋近智
数据集通常包含大量的输入变量。这种情况常常发生在从原始数值、分类和文本数据中进行特征工程,或应用如PCA等变换之后。拥有更多信息看似有利。然而,并非所有特征都同等重要。有些可能与预测任务不相关,有些可能重复(与现有特征高度关联),甚至有些可能引入噪声,从而降低模型性能。此外,使用过多特征会增加计算成本和模型复杂度,有时会导致过拟合(“维度灾难”)。
这就是特征选择的用武之地。不同于PCA将特征变换到低维空间,特征选择技术旨在找出并保留原始特征中最相关的子集,针对您的建模任务。统计方法提供了一种常见且通常计算高效的方式来执行此选择,主要通过独立于任何特定机器学习模型来评估每个特征与目标变量之间的关系。这些通常被称为 过滤方法。
过滤方法根据特征与目标变量固有的统计属性来评判其相关性。它们通常比其他选择策略(如包装器方法或嵌入方法)更快,因为它们在选择过程中不涉及训练机器学习模型。它们是有效的预处理步骤,用于筛除不太可能有用的特征。
统计检验的选择主要取决于特征和目标变量的数据类型。
当您的目标变量是连续型时,您通常需要选择与其显示出强统计关联的特征。
皮尔逊相关系数: 它衡量数值特征 (X) 与连续目标变量 (Y) 之间的线性相关性。相关系数 r 的范围从 -1 到 +1。
df.corr()['target_variable'].abs().sort_values(ascending=False)。然而,请记住,皮尔逊相关性仅捕捉线性依赖关系。一个特征可能与目标存在强非线性关系,但皮尔逊相关分数较低。ANOVA F检验(回归): 这种统计检验(sklearn.feature_selection.f_regression)计算F统计量,以判定数值特征与连续目标变量之间是否存在显著线性关系。它主要分析特征所能解释的方差。F统计量越高(相应的p值越低),表明关系越强。它与单特征的线性回归和皮尔逊相关性有着根本的联系。
互信息(回归): 互信息(sklearn.feature_selection.mutual_info_regression)是一种非参数方法,源于信息论。它通过观察另一个变量(特征)来衡量关于一个变量(目标)获得的信息量。它可以捕捉任意关系(不限于线性),并以“纳特”(或有时是“比特”)为单位衡量。分数为0表示独立,而值越高则表示依赖性越大。这使其能够有效捕捉相关性可能遗漏的复杂模式。它需要数值特征,但如果经过适当编码或实现支持(通常需要对连续变量进行离散化),有时也可以使用分类特征。
处理分类目标变量时,适合采用不同的统计检验。
卡方(χ2)检验: 这种检验(sklearn.feature_selection.chi2)用于判定两个分类变量之间是否存在显著关联。您会在每个分类特征与分类目标之间应用此检验。它将列联表(特征类别与目标类别)中的观察频率与变量独立时应有的期望频率进行比较。较高的χ2统计量表明该特征与目标类别并非独立,使其可能具有关联性。一个重要的前提是,特征必须包含非负值(计数、频率或经过适当编码的变量,如独热编码特征)。
ANOVA F检验(分类): 类似于回归情况,但适用于分类(sklearn.feature_selection.f_classif)。它检验数值特征的平均值在不同目标类别之间是否存在显著差异。如果特征的平均值在类别之间存在显著变化,它很可能是区分这些类别的好预测因子。
互信息(分类): 类似于回归版本,sklearn.feature_selection.mutual_info_classif 衡量每个特征(可以是数值或离散型)与分类目标变量之间的相互依赖性。它量化了通过了解特征值可以减少多少关于目标类别的不确定性。值越高表明关联性越大,并且它能有效捕捉非线性关系。
Scikit-learn的sklearn.feature_selection模块提供了应用这些统计检验的便捷工具。常用的选择器包括SelectKBest(根据分数选择前 k 个特征)和SelectPercentile(根据百分位数阈值选择顶部特征)。
以下是在分类问题中如何使用SelectKBest结合ANOVA F检验的示例:
import pandas as pd
from sklearn.datasets import make_classification
from sklearn.feature_selection import SelectKBest, f_classif
# 生成合成分类数据
# 10个信息量大的特征,10个冗余/噪声特征
X, y = make_classification(n_samples=200, n_features=20, n_informative=10,
n_redundant=5, n_classes=3, random_state=42)
X_df = pd.DataFrame(X, columns=[f'feature_{i}' for i in range(20)])
print("原始特征数量:", X_df.shape[1])
# 根据ANOVA F检验分数选择前12个特征
k_best = 12
selector = SelectKBest(score_func=f_classif, k=k_best)
# 将选择器拟合到数据并变换X
X_new = selector.fit_transform(X_df, y)
# 获取分数和p值
scores = selector.scores_
p_values = selector.pvalues_
# 获取所选特征的索引
selected_indices = selector.get_support(indices=True)
# 获取所选特征的名称
selected_features = X_df.columns[selected_indices]
print(f"已选择前 {k_best} 个特征:", selected_features.tolist())
print("选择后数据的形状:", X_new.shape)
# 可选:显示所选特征的分数
# selected_scores = pd.Series(scores[selected_indices], index=selected_features)
# print("\n所选特征的分数(F统计量):")
# print(selected_scores.sort_values(ascending=False))
这段代码片段演示了:
f_classif作为评分函数,并指定 k=12,初始化SelectKBest。X_df,y)。X_new)。您可以类似地根据您的特征类型和任务(分类/回归),使用chi2(针对非负分类特征)、mutual_info_classif、f_regression或mutual_info_regression作为score_func。
SelectKBest使用f_classif计算的F统计量分数示例。在此分类示例场景中,分数较高的特征与目标类别显示出更强的统计关联。选择器会保留对应于前 k 个最高分数的特征。
虽然功能强大,但在使用统计过滤方法时请记住以下几点:
X_df[selected_features].corr())通常很有用。SelectPercentile提供了指定特征数量的另一种方式。StandardScaler)通常是这些方法的良好实践。统计特征选择提供了一系列有价值的技术,通过关注与目标变量具有最强个体关联的特征,从而降低数据集的维度。这是实际数据科学工作流程中重要的一步,有助于简化模型,可能提升性能,缩短计算时间,并为后续建模阶段准备更集中的数据集。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造