
10 Python 一行代码搞定特征选择
图片来源:编辑 | Midjourney
在许多**数据分析**过程中,包括**机器学习**,数据预处理是在进一步分析或模型训练和评估之前的关键阶段。作为数据预处理的一部分,特征选择在提高分析质量或模型性能方面起着至关重要的作用,它专注于处理与当前问题真正相关且有用的数据。特征选择过程可能因所操作数据集的性质和复杂性而异。
本文将带您实际了解 10 个 Python 一行代码——能够高效简洁地完成有意义任务的代码行——特别是介绍**10 个通常且实用的代码行,您可以将其保存在笔记本中,用于在各种数据集中执行特征选择**。
在开始之前,有必要导入一些我们将要使用的重要的 Python 库和模块。特别是,为了说明以下示例,我们将导入 scikit-learn 的 datasets
模块中免费提供的两个数据集:葡萄酒数据集和乳腺癌数据集。
1 2 3 4 5 6 7 8 9 |
import pandas as pd import numpy as np from sklearn.datasets import load_wine, load_breast_cancer from sklearn.feature_selection import SelectKBest, f_classif, mutual_info_classif, RFE from sklearn.ensemble import RandomForestClassifier from sklearn.linear_model import LogisticRegression from sklearn.preprocessing import StandardScaler 从 sklearn.分解 导入 PCA import seaborn as sns |
为了举例说明下面的 10 个一行代码,我们将假设数据集已加载到 Pandas 数据帧中,如下所示:
1 2 |
wine_data = pd.DataFrame(load_wine().data, columns=load_wine().feature_names) bc_data = pd.DataFrame(load_breast_cancer().data, columns=load_breast_cancer().feature_names) |
1. 基于方差阈值的选择
基于方差的特征选择是一种非常常见的特征选择方法,旨在去除方差较低的特征,因此它们可能对机器学习模型来说信息量不足。
此一行代码应用于包含葡萄酒数据集的 Pandas 数据帧 wine_data
的列过滤,以便仅保留方差大于 0.8 的特征(列)。
1 |
X_selected = wine_data.loc[:, wine_data.var() > 0.8] |
结果是,原始 13 个特征中只有 6 个被保留,其他特征被认为信息量较少且接近常数。通过执行 X_selected.head()
和 X_selected.shape
分别可以检查过滤后的数据本身和特征的数量。
2. 基于相关性的特征选择
此一行代码通过乳腺癌数据集进行说明:这是一个已标记的数据集,包含 30 个主要是数值的特征,以及一个二元目标变量——乳腺癌诊断,可以是阳性或阴性——可以通过 load_breast_cancer().target
访问。由于 corrwith()
方法,可以使用基于相关性的特征选择,它包括选择与目标变量具有一定程度相关性的特征,例如,保留与目标标签的绝对相关性大于 0.5 的特征。
1 |
X_selected = bc_data.loc[:, bc_data.columns[abs(bc_data.corrwith(pd.Series(load_breast_cancer().target))) > 0.5].tolist()] |
请注意,此一行代码的结果是一个包含所选特征名称的 Python 列表。您可能希望将其封装在
3. 使用 F 检验选择 K 个最佳特征
F 检验基于 ANOVA,这是一个统计检验,用于检查三个或更多被假定为独立组之间的统计显著差异。ANOVA 的 F 值可用于确定每个特征与目标变量(在葡萄酒数据集中也可以使用 .target()
单独访问)之间的关系。
1 |
X_best = SelectKBest(f_classif, k=5).fit_transform(wine_data, load_wine().target) |
这个示例一行代码识别了与标签关系最强的五个特征。此方法和前一个基于相关性的特征选择方法都有助于训练分类模型,这些模型更有可能更好地捕捉预测特征和待预测目标变量之间的关系,从而在未来未见过的数据上表现更好。
4. 使用互信息选择 K 个最佳特征
基于互信息选择特征的方法可以衡量两个变量之间的统计依赖性,在我们示例中,是衡量每个变量与目标变量之间的依赖性。因此,选择的特征将是对给定实例中目标值高度信息的。
应用此方法的过程与前面的 F 检验方法非常相似,都需要指定要保留的“最佳”特征的数量 K。
1 |
X_best = SelectKBest(mutual_info_classif, k=6).fit_transform(bc_data, load_breast_cancer().target) |
5. 利用随机森林进行特征重要性评估
您知道我们可以利用随机森林集成,特别是其计算的特征重要性,并利用这些信息来进行特征选择吗?这个例子说明了如何做到这一点。
1 |
selected_features = wine_data.columns[np.argsort(RandomForestClassifier(random_state=42).fit(wine_data, load_wine().target).feature_importances_)[-7:]].tolist() |
这行代码似乎涉及了很多内容!让我们来分解一下。
RandomForestClassifier(random_state=42).fit(wine_data, load_wine().target).feature_importances_
这部分使用葡萄酒数据集的特征和目标初始化并训练了一个简单的随机森林分类器,并返回一个包含计算出的特征重要性权重的浮点数值的 numpy 数组。- 这个权重数组被传递给
np.argsort()
,它会排序数组的索引,以便它们关联的权重按升序排列。通过在末尾添加[-7:]
切片操作符,我们选择了与 7 个最高权重相关联的索引,这将有助于我们确定最重要的 7 个特征,并将其作为特征名称列表获取。
6. 通过递归特征消除和逻辑回归选择顶级特征
递归特征消除 (RFE) 是一种技术,它通过一个已训练的逻辑回归模型进行递归地消除特征。它会删除不太重要的特征,直到剩下指定数量的特征(例如八个):所有操作都在一行代码中完成,如下所示。
1 |
X_rfe = RFE(LogisticRegression(max_iter=1000), n_features_to_select=8).fit_transform(StandardScaler().fit_transform(bc_data), load_breast_cancer().target) |
该过程包括特征缩放以获得更好的结果,并训练一个 RFE 对象,该对象接受两个参数:逻辑回归模型和要保留的所需特征数量。
7. 使用主成分分析进行特征选择
主成分分析 (PCA) 是一种著名的降维技术,它选择足够的主成分来解释原始数据的大部分方差(通常约为 90%,如下面的示例一行代码所示)。为此,它对与数据集特征相关的协方差矩阵进行特征分解,并将原始数据投影到主成分上。将 PCA 作为特征选择的一部分也需要进行特征缩放以获得最佳结果。
1 |
X_pca = PCA(n_components=0.9, random_state=42).fit_transform(StandardScaler().fit_transform(wine_data)) |
8. 基于缺失值的特征选择
当我们拥有充满缺失值的数据时,进行特征选择的一个非常常识性的标准是只保留那些大多数值为非缺失值的特征,例如,至少 90% 的值为存在的。
这个一行代码利用 Pandas 的 dropna()
函数在列级别进行此操作。方法如下:
1 |
selected_cols = wine_data.dropna(thresh=len(wine_data)*0.9, axis=1).columns.tolist() |
为了使此示例完美运行,我们建议您从此处加载另一个版本的葡萄酒数据集。
9. 基于 L1 的特征选择
L1 正则化可以与逻辑回归模型结合,以自动执行特征选择。下面的代码行执行以下步骤:
- 在正则化之前标准化数据,并在葡萄酒数据集上训练逻辑回归模型,使用 L1(Lasso)权重惩罚和正则化强度控制级别
C=0.5
。 - 提取前两个类别中的系数(索引 0),以创建具有非零系数的索引列表。
- 基于这些索引,选择仅具有非零系数的特征,并将其作为列名列表返回。
1 |
selected_features = wine_data.columns[np.any(LogisticRegression(penalty='l1', solver='liblinear', C=0.5).fit(StandardScaler().fit_transform(wine_data), load_wine().target).coef_ != 0, axis=0)].tolist() |
10. 移除多重共线性特征
多重共线性是指数据集中特征的预测变量之间存在强相关性或线性依赖性。这个最终的单行代码通过消除冗余特征,有效地移除了乳腺癌数据集中的多重共线性。它系统地分析每个特征并将其与其他特征进行比较,仅保留那些与其他变量没有强相关性(>0.85)的特征。该方法通过所有列迭代应用。
1 |
keep_cols = [col for col in bc_data.columns if not any(bc_data.drop(columns=col).corrwith(bc_data[col]).abs() > 0.85)] |
结论
本文概览了十种有效的 Python 代码行,一旦熟悉了它们,就能极大地加速您从数据中选择相关特征以供进一步分析或机器学习建模任务的过程。
谢谢 Iván!