使用 Scikit-Learn 进行特征选择

Machine LearningMachine LearningBeginner
立即练习

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

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

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

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

虚拟机使用提示

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

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

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/DataPreprocessingandFeatureEngineeringGroup(["Data Preprocessing and Feature Engineering"]) sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/ensemble("Ensemble Methods") sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/svm("Support Vector Machines") sklearn/DataPreprocessingandFeatureEngineeringGroup -.-> sklearn/feature_selection("Feature Selection") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/ensemble -.-> lab-71110{{"使用 Scikit-Learn 进行特征选择"}} sklearn/svm -.-> lab-71110{{"使用 Scikit-Learn 进行特征选择"}} sklearn/feature_selection -.-> lab-71110{{"使用 Scikit-Learn 进行特征选择"}} sklearn/datasets -.-> lab-71110{{"使用 Scikit-Learn 进行特征选择"}} ml/sklearn -.-> lab-71110{{"使用 Scikit-Learn 进行特征选择"}} end

去除低方差特征

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进行特征选择。这些技术有助于选择最相关的特征并降低数据集的维度,从而提高模型性能。