基于模型和顺序的特征选择

Machine LearningMachine LearningBeginner
立即练习

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

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

简介

本实验展示了两种特征选择方法:基于模型的方法和顺序特征选择方法。目标是从给定数据集中选择最重要的特征。我们使用糖尿病数据集,该数据集包含从 442 名糖尿病患者身上收集的 10 个特征。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签,以访问 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/linear_model("Linear Models") sklearn/DataPreprocessingandFeatureEngineeringGroup -.-> sklearn/feature_selection("Feature Selection") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/linear_model -.-> lab-49279{{"基于模型和顺序的特征选择"}} sklearn/feature_selection -.-> lab-49279{{"基于模型和顺序的特征选择"}} sklearn/datasets -.-> lab-49279{{"基于模型和顺序的特征选择"}} ml/sklearn -.-> lab-49279{{"基于模型和顺序的特征选择"}} end

加载数据

我们从 scikit-learn 中加载糖尿病数据集并打印其描述。

from sklearn.datasets import load_diabetes

diabetes = load_diabetes()
X, y = diabetes.data, diabetes.target
print(diabetes.DESCR)

根据系数确定特征重要性

为了了解特征的重要性,我们使用岭回归交叉验证(RidgeCV)估计器。具有最高绝对 coef_ 值的特征被认为是最重要的。

from sklearn.linear_model import RidgeCV

ridge = RidgeCV(alphas=np.logspace(-6, 6, num=5)).fit(X, y)
importance = np.abs(ridge.coef_)
feature_names = np.array(diabetes.feature_names)
plt.bar(height=importance, x=feature_names)
plt.title("Feature importances via coefficients")
plt.show()

根据重要性选择特征

我们使用 SelectFromModel 根据系数选择最重要的两个特征。SelectFromModel 接受一个 threshold 参数,并将选择重要性(由系数定义)高于此阈值的特征。

from sklearn.feature_selection import SelectFromModel

threshold = np.sort(importance)[-3] + 0.01

sfm = SelectFromModel(ridge, threshold=threshold).fit(X, y)
print(f"Features selected by SelectFromModel: {feature_names[sfm.get_support()]}")

使用顺序特征选择来选择特征

我们使用顺序特征选择器(SFS)来选择特征。SFS 是一种贪心算法,在每次迭代中,我们根据交叉验证分数选择最佳的新特征添加到已选特征中。我们也可以采用相反的方向(反向 SFS),即从所有特征开始,贪心选择要逐个移除的特征。

from sklearn.feature_selection import SequentialFeatureSelector

sfs_forward = SequentialFeatureSelector(ridge, n_features_to_select=2, direction="forward").fit(X, y)
sfs_backward = SequentialFeatureSelector(ridge, n_features_to_select=2, direction="backward").fit(X, y)

print(f"Features selected by forward sequential selection: {feature_names[sfs_forward.get_support()]}")
print(f"Features selected by backward sequential selection: {feature_names[sfs_backward.get_support()]}")

总结

本实验展示了两种特征选择方法:基于模型的方法和顺序特征选择。我们使用岭回归交叉验证(RidgeCV)估计器来获取特征的重要性,并使用基于模型选择(SelectFromModel)根据重要性来选择特征。顺序特征选择器是一种贪心算法,在每次迭代中,我们根据交叉验证分数选择最佳的新特征添加到已选特征中。