使用 Scikit-Learn 进行特征选择

Beginner

This tutorial is from open-source community. Access the source code

简介

特征选择是机器学习中的一个重要步骤。它涉及从数据集中选择最相关的特征,以提高模型的准确性和性能。在 scikit-learn 中,sklearn.feature_selection模块提供了各种特征选择和降维方法。

本实验将指导你使用 scikit-learn 进行特征选择的过程。我们将介绍诸如去除低方差特征、单变量特征选择、递归特征消除以及使用 SelectFromModel 进行特征选择等技术。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到笔记本标签页,以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们将立即为你解决问题。

去除低方差特征

scikit-learn 中的VarianceThreshold类可用于去除低方差特征。低方差特征通常无法为模型提供太多信息。我们将演示如何使用VarianceThreshold去除零方差特征。

from sklearn.feature_selection import VarianceThreshold

X = [[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 1, 1], [0, 1, 0], [0, 1, 1]]

## 使用 80% 的可变性阈值初始化 VarianceThreshold
sel = VarianceThreshold(threshold=(.8 * (1 -.8)))

## 选择具有高可变性的特征
X_selected = sel.fit_transform(X)

print("原始 X 的形状:", X.shape)
print("选择特征后的 X 形状:", X_selected.shape)
print("选择的特征:", sel.get_support(indices=True))

这段代码片段演示了如何使用VarianceThreshold从数据集中去除零方差特征。输出将显示数据集的原始形状以及选择具有高可变性特征后的形状。

单变量特征选择

单变量特征选择通过基于单变量统计检验选择最佳特征来工作。在 scikit-learn 中,有几个类实现了单变量特征选择:

  • SelectKBest:选择得分最高的前 k 个特征
  • SelectPercentile:选择用户指定百分比的得分最高的特征
  • SelectFpr:基于误报率选择特征
  • SelectFdr:基于错误发现率选择特征
  • SelectFwe:基于族误差率选择特征
  • GenericUnivariateSelect:允许使用可配置策略进行选择

以下是使用SelectKBest从鸢尾花数据集(Iris dataset)中选择两个最佳特征的示例:

from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import f_classif

## 加载鸢尾花数据集
X, y = load_iris(return_X_y=True)

## 使用 f_classif 评分函数和 k=2 初始化 SelectKBest
selector = SelectKBest(f_classif, k=2)

## 选择最佳特征
X_selected = selector.fit_transform(X, y)

print("原始 X 的形状:", X.shape)
print("选择特征后的 X 形状:", X_selected.shape)
print("选择的特征:", selector.get_support(indices=True))

在这个示例中,我们使用f_classif评分函数并从鸢尾花数据集中选择两个最佳特征。输出将显示数据集的原始形状以及选择最佳特征后的形状。

递归特征消除

递归特征消除(RFE)是一种特征选择方法,它通过递归地考虑越来越小的特征集来选择最重要的特征。其工作原理是使用分配给特征的权重训练一个外部估计器,并修剪最不重要的特征。

from sklearn.svm import SVC
from sklearn.datasets import load_iris
from sklearn.feature_selection import RFE

## 加载鸢尾花数据集
X, y = load_iris(return_X_y=True)

## 将支持向量分类器(SVC)初始化为外部估计器
estimator = SVC(kernel="linear")

## 使用外部估计器初始化 RFE 并选择 2 个特征
selector = RFE(estimator, n_features_to_select=2)

## 选择最佳特征
X_selected = selector.fit_transform(X, y)

print("原始 X 的形状:", X.shape)
print("选择特征后的 X 形状:", X_selected.shape)
print("选择的特征:", selector.get_support(indices=True))

在这个示例中,我们使用支持向量分类器(SVC)作为外部估计器,并从鸢尾花数据集中选择两个最佳特征。输出将显示数据集的原始形状以及选择最佳特征后的形状。

使用 SelectFromModel 进行特征选择

SelectFromModel类是一个元变换器,可与任何为每个特征分配重要性的估计器一起使用。它根据特征的重要性进行选择,并移除低于指定阈值的特征。

from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectFromModel

## 加载鸢尾花数据集
X, y = load_iris(return_X_y=True)

## 将随机森林分类器(RandomForestClassifier)初始化为估计器
estimator = RandomForestClassifier()

## 使用估计器和“均值”阈值初始化 SelectFromModel
selector = SelectFromModel(estimator, threshold="mean")

## 选择最佳特征
X_selected = selector.fit_transform(X, y)

print("原始 X 的形状:", X.shape)
print("选择特征后的 X 形状:", X_selected.shape)
print("选择的特征:", selector.get_support(indices=True))

在这个示例中,我们使用随机森林分类器作为估计器,并选择重要性大于平均重要性的特征。输出将显示数据集的原始形状以及选择最佳特征后的形状。

总结

特征选择是机器学习中提高模型准确性和性能的关键步骤。在本实验中,我们介绍了多种技术,如去除低方差特征、单变量特征选择、递归特征消除以及使用 SelectFromModel 进行特征选择。这些技术有助于选择最相关的特征并降低数据集的维度,从而提高模型性能。