数据集通常包含大量的输入变量。这种情况常常发生在从原始数值、分类和文本数据中进行特征工程,或应用如PCA等变换之后。拥有更多信息看似有利。然而,并非所有特征都同等重要。有些可能与预测任务不相关,有些可能重复(与现有特征高度关联),甚至有些可能引入噪声,从而降低模型性能。此外,使用过多特征会增加计算成本和模型复杂度,有时会导致过拟合(“维度灾难”)。这就是特征选择的用武之地。不同于PCA将特征变换到低维空间,特征选择技术旨在找出并保留原始特征中最相关的子集,针对您的建模任务。统计方法提供了一种常见且通常计算高效的方式来执行此选择,主要通过独立于任何特定机器学习模型来评估每个特征与目标变量之间的关系。这些通常被称为 过滤方法。特征选择的过滤方法过滤方法根据特征与目标变量固有的统计属性来评判其相关性。它们通常比其他选择策略(如包装器方法或嵌入方法)更快,因为它们在选择过程中不涉及训练机器学习模型。它们是有效的预处理步骤,用于筛除不太可能有用的特征。统计检验的选择主要取决于特征和目标变量的数据类型。评估回归任务的特征(连续目标)当您的目标变量是连续型时,您通常需要选择与其显示出强统计关联的特征。皮尔逊相关系数: 它衡量数值特征 ($X$) 与连续目标变量 ($Y$) 之间的线性相关性。相关系数 $r$ 的范围从 -1 到 +1。$r \approx +1$: 强正线性关系。$r \approx -1$: 强负线性关系。$r \approx 0$: 弱或无线性关系。 绝对相关值更高的特征通常被认为更具关联性。您可以使用Pandas轻松计算: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表示独立,而值越高则表示依赖性越大。这使其能够有效捕捉相关性可能遗漏的复杂模式。它需要数值特征,但如果经过适当编码或实现支持(通常需要对连续变量进行离散化),有时也可以使用分类特征。评估分类任务的特征(分类目标)处理分类目标变量时,适合采用不同的统计检验。卡方($\chi^2$)检验: 这种检验(sklearn.feature_selection.chi2)用于判定两个分类变量之间是否存在显著关联。您会在每个分类特征与分类目标之间应用此检验。它将列联表(特征类别与目标类别)中的观察频率与变量独立时应有的期望频率进行比较。较高的$\chi^2$统计量表明该特征与目标类别并非独立,使其可能具有关联性。一个重要的前提是,特征必须包含非负值(计数、频率或经过适当编码的变量,如独热编码特征)。ANOVA F检验(分类): 类似于回归情况,但适用于分类(sklearn.feature_selection.f_classif)。它检验数值特征的平均值在不同目标类别之间是否存在显著差异。如果特征的平均值在类别之间存在显著变化,它很可能是区分这些类别的好预测因子。互信息(分类): 类似于回归版本,sklearn.feature_selection.mutual_info_classif 衡量每个特征(可以是数值或离散型)与分类目标变量之间的相互依赖性。它量化了通过了解特征值可以减少多少关于目标类别的不确定性。值越高表明关联性越大,并且它能有效捕捉非线性关系。使用Scikit-learn实现统计特征选择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。{ "data": [ { "type": "bar", "x": [35.2, 28.1, 25.5, 22.9, 19.3, 15.1, 14.8, 13.2, 12.9, 11.5, 10.2, 9.8], "y": ["feature_13", "feature_3", "feature_17", "feature_1", "feature_7", "feature_18", "feature_0", "feature_9", "feature_15", "feature_6", "feature_4", "feature_10"], "orientation": "h", "marker": {"color": "#1c7ed6"} } ], "layout": { "title": "前12个特征的ANOVA F分数示例", "xaxis": {"title": "F统计量分数"}, "yaxis": {"title": "特征", "autorange": "reversed"}, "margin": {"l": 100, "r": 20, "t": 50, "b": 40} } }SelectKBest使用f_classif计算的F统计量分数示例。在此分类示例场景中,分数较高的特征与目标类别显示出更强的统计关联。选择器会保留对应于前 $k$ 个最高分数的特征。注意事项虽然功能强大,但在使用统计过滤方法时请记住以下几点:独立性假设: 大多数过滤方法独立评估每个特征。它们不考虑特征之间的相互影响或冗余。一个特征可能单独得分较低,但与另一个特征结合时却很有价值。反之,多个高度相关的特征可能都获得高分,导致所选特征集中存在冗余。在选择后分析特征相关性(X_df[selected_features].corr())通常很有用。$k$ 的选择: 确定最佳特征数量 ($k$) 并非总是简单明了。您可以根据期望的维度、领域知识来选择 $k$,或者更系统地通过使用交叉验证评估不同 $k$ 值下的模型性能(尽管这开始与包装器方法的理念有所交叉)。使用SelectPercentile提供了指定特征数量的另一种方式。检验假设: 请留意统计检验的潜在假设(例如,皮尔逊相关性的线性假设,$\chi^2$ 的非负性假设)。缩放: 尽管相关性和互信息敏感度较低,但基于方差的方法(如ANOVA F检验)可能会受到数值特征尺度的影响。在特征选择前应用标准缩放(StandardScaler)通常是这些方法的良好实践。模型依赖性: 过滤方法是模型无关的。选择的特征集可能并非对特定机器学习算法来说是绝对最佳的(例如,基于树的模型处理不相关特征的方式可能与线性模型不同)。包装器方法和嵌入方法可以解决这个问题,但计算成本更高。统计特征选择提供了一系列有价值的技术,通过关注与目标变量具有最强个体关联的特征,从而降低数据集的维度。这是实际数据科学工作流程中重要的一步,有助于简化模型,可能提升性能,缩短计算时间,并为后续建模阶段准备更集中的数据集。