你应该知道的Scikit-Learn的5种特征选择方法

2025年1月4日 | 阅读 11 分钟

特征选择是提高算法性能的重要组成部分,通过消除冗余和不相关的特征来实现。机器学习算法会受到维度灾难的影响,尤其是在处理高维数据集时。降维技术通过在保持准确性的同时减少特征空间来解决这个问题。冗余特征会对模型的解释性和计算效率产生负面影响。特征选择方法包括过滤法和包裹法,这些方法对于选择非冗余特征子集非常有效。特征选择是一种自动选择相关特征的方法,其中为特定任务选择与预测变量最相关的特征。模型准确性会因许多与预测无关的特征而降低。在算法对数据进行训练之前实施特征选择有三个优点。

  • 减少过拟合:如果特征较少且相关性较低,则基于这些特征进行决策的可能性较低。
  • 提高准确性:特征选择有助于提高算法的准确性。
  • 减少训练时间:如果数据中的特征较少,算法训练速度会更快。

Scikit-Learn 的特征选择方法

Scikit-learn 是一个 Python 库,它内置了用于训练机器学习算法以及执行数据预处理(如特征选择和特征提取)的函数。以下是 scikit-learn 提供的 5 种特征选择方法。

递归特征消除

递归特征消除 (RFE) 是一种特征选择方法,它通过反复删除不重要的特征并专注于能提高机器学习算法预测准确性的特征来选择特征。RFE 包括构建一个模型,该模型使用在删除最不重要的特征后剩余的特征,直到选择出所需数量的相关特征。递归特征消除 (RFE) 可以与监督学习技术(如支持向量机)一起使用。

递归特征消除算法的工作原理

  • 特征根据其重要性进行排序,重要性通过 RFE 机器学习算法进行评估。
  • 算法认为最重要的特征被消除。
  • 使用剩余的特征构建模型。
  • 重复步骤 1-3,直到选择出相关的特征。

假设我们有一个包含 9 个变量(包括目标变量)的糖尿病患者数据集。我们想通过输入变量来了解哪些患者患有糖尿病。让我们使用递归特征消除技术,从糖尿病患者数据中选择三个最佳特征来构建模型。

代码

输出

 
   Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin   BMI  \
0            6      148             72             35        0  33.6   
1            1       85             66             29        0  26.6   
2            8      183             64              0        0  23.3   
3            1       89             66             23       94  28.1   
4            0      137             40             35      168  43.1   

   DiabetesPedigreeFunction  Age  Outcome  
0                     0.627   50        1  
1                     0.351   31        0  
2                     0.672   32        1  
3                     0.167   21        0  
4                     2.288   33        1  
Nums Features: 4
Selected Features: [ True  True False False False  True  True False]
Feature Rankings: [1 1 3 5 4 1 1 2]   

说明

在上面的代码中,导入了所需的库,导入了 RFE 用于特征选择,并从 Kaggle 获取了糖尿病数据。打印了数据的五行,结果是判断患者是否患有糖尿病的类别变量。数据被分为 X 和 y 变量,分别作为输入和输出变量。使用逻辑回归模型来训练模型。将模型传递给 RFE 函数,并选择四个特征来训练算法。X 和 y 数据被拟合以训练模型。有四个特征,并打印了选定的特征,这是一个布尔数组(True/False);还打印了特征排名,它告诉我们该特征对预测的重要性。

单变量选择

单变量选择是一种统计特征选择方法,其中借助统计检验来选择相关特征。与预测值具有强相关性的特征被选为最相关的特征。Python 在 scikit-learn 中提供了一个类 SelectKBest(),用于实现此特征选择技术。

假设我们有一个包含 9 个变量(包括目标变量)的糖尿病患者数据集。我们想通过输入变量来了解哪些患者患有糖尿病。让我们使用 SelectKBest() 特征选择技术,从糖尿病患者数据中选择三个最佳特征来构建模型。

代码

输出

 
   Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin   BMI  \
0            6      148             72             35        0  33.6   
1            1       85             66             29        0  26.6   
2            8      183             64              0        0  23.3   
3            1       89             66             23       94  28.1   
4            0      137             40             35      168  43.1   
5            5      116             74              0        0  25.6   
6            3       78             50             32       88  31.0   
7           10      115              0              0        0  35.3   
8            2      197             70             45      543  30.5   
9            8      125             96              0        0   0.0   

   DiabetesPedigreeFunction  Age  Outcome  
0                     0.627   50        1  
1                     0.351   31        0  
2                     0.672   32        1  
3                     0.167   21        0  
4                     2.288   33        1  
5                     0.201   30        0  
6                     0.248   26        1  
7                     0.134   29        0  
8                     0.158   53        1  
9                     0.232   54        1  
[ 111.52 1411.89   17.61   53.11 2175.57  127.67    5.39  181.3 ]   

说明

在上面的代码中,导入了所需的库。Pandas 用于数据操作,NumPy 用于数值运算,SelectKBest 和 chi2 用于选择特征。加载了数据并从 Kaggle 获取,打印了数据的前 10 行以快速了解数据。数据已准备好进行特征选择。首先,将数据转换为 NumPy 数组,并从行中提取所有特征,目标变量存储在 y 变量中。SelectKBest 对象使用 chi2 得分函数进行初始化,并选择 4 个特征。然后,将 SelectKBest 模型拟合到数据 X 和 y,并计算每个特征的分数。打印 NumPy 数组的精度设置为 2 位小数,并打印每个特征的分数。这个分数告诉我们每个特征在卡方检验基础上的重要性。

主成分分析

主成分分析 (PCA) 是一种降维方法,用于将大量变量的数据转换为较小的数据集,同时保留数据的信息。PCA 利用线性代数在输出中选择主成分(或特征)的数量,将数据转换成压缩形式。借助 PCA,可以使用 scikit-learn Python 库提供的 PCA 类来执行特征选择技术。

为了使用 PCA 实现特征选择,从 Kaggle 获取了糖尿病数据集,该数据集包含 9 个变量,包括目标变量。我们想通过输入变量来了解哪些患者患有糖尿病。

让我们来实现一种 PCA 特征选择技术。

代码

输出

 
   Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin   BMI  \
0            6      148             72             35        0  33.6   
1            1       85             66             29        0  26.6   
2            8      183             64              0        0  23.3   
3            1       89             66             23       94  28.1   
4            0      137             40             35      168  43.1   
5            5      116             74              0        0  25.6   
6            3       78             50             32       88  31.0   
7           10      115              0              0        0  35.3   
8            2      197             70             45      543  30.5   
9            8      125             96              0        0   0.0   

   DiabetesPedigreeFunction  Age  Outcome  
0                     0.627   50        1  
1                     0.351   31        0  
2                     0.672   32        1  
3                     0.167   21        0  
4                     2.288   33        1  
5                     0.201   30        0  
6                     0.248   26        1  
7                     0.134   29        0  
8                     0.158   53        1  
9                     0.232   54        1  
Explained Variance : [0.89 0.06 0.03 0.01]
All components : [[-2.02e-03  9.78e-02  1.61e-02  6.08e-02  9.93e-01  1.40e-02  5.37e-04
  -3.56e-03]
 [-2.26e-02 -9.72e-01 -1.42e-01  5.79e-02  9.46e-02 -4.70e-02 -8.17e-04
  -1.40e-01]
 [-2.25e-02  1.43e-01 -9.22e-01 -3.07e-01  2.10e-02 -1.32e-01 -6.40e-04
  -1.25e-01]
 [-4.90e-02  1.20e-01 -2.63e-01  8.84e-01 -6.56e-02  1.93e-01  2.70e-03
  -3.01e-01]]   

说明

在上面的代码中,导入了所需的模块和库;使用 panda 库进行数据操作,一个函数用于控制浮点输出的精度。从 scikit-learn 库中导入 PCA 类来实现主成分分析。加载了数据,并打印了数据的 10 行以快速查看数据。将数据值转换为 NumPy 数组,并从数组中提取所有行和前 8 列作为特征,从数组中提取第 9 列作为目标变量。PCA 对象被初始化以将数据减少到 4 个主成分。将数据拟合到 PCA 对象,并计算主成分。explained_variance_ratio_ 属性打印了所选成分解释的数据集方差比例。principal_components 属性打印了主成分。每个成分都是一个权重向量,表示原始特征的线性组合。

上面的代码对数据集执行了 PCA,用于将 4 个主成分的维度降低。加载了数据集,分离了特征和目标变量,并应用了 PCA 算法来评估主成分。方差比显示每个主成分提取了多少总方差。值越高表示该成分提取的方差越多。

基于树的模型中的特征重要性

基于树的模型中的特征重要性有助于理解每个特征在预测值时的影响。基于树的模型,例如决策树、随机森林和梯度提升机,提供了一种根据特征分裂数据的显著程度来评估特征重要性的方法。

考虑糖尿病数据集,该数据集包含 9 个特征,包括目标变量。让我们应用基于树的模型从数据集中提取或选择重要的特征。

代码

输出

 
  Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin   BMI  \
0            6      148             72             35        0  33.6   
1            1       85             66             29        0  26.6   
2            8      183             64              0        0  23.3   
3            1       89             66             23       94  28.1   
4            0      137             40             35      168  43.1   
5            5      116             74              0        0  25.6   
6            3       78             50             32       88  31.0   
7           10      115              0              0        0  35.3   
8            2      197             70             45      543  30.5   
9            8      125             96              0        0   0.0   

   DiabetesPedigreeFunction  Age  Outcome  
0                     0.627   50        1  
1                     0.351   31        0  
2                     0.672   32        1  
3                     0.167   21        0  
4                     2.288   33        1  
5                     0.201   30        0  
6                     0.248   26        1  
7                     0.134   29        0  
8                     0.158   53        1  
9                     0.232   54        1  
Glucose                     0.267142
BMI                         0.168769
Age                         0.131567
DiabetesPedigreeFunction    0.122695
BloodPressure               0.088660
Pregnancies                 0.085017
Insulin                     0.071547
SkinThickness               0.064604
dtype: float64   

5 Feature Selection Method from Scikit-Learn You Should Know

说明

在上面的代码中,导入了所需的库和模块,并读取了 CSV 文件。该文件从 Kaggle 获取,包含糖尿病数据集,通过 Pandas DataFrame 读取。特征变量和目标变量分别从数据中提取为 X 和 y。初始化了随机森林分类器并将其拟合到数据中。从训练好的模型中检索并排序特征重要性,并使用水平条形图可视化特征重要性。特征重要性分数有助于识别哪些特征对模型做出预测贡献最大,为选择特征和解释模型提供了宝贵的见解。

基于 L1 的特征选择(Lasso 回归)

基于 L1 的特征选择,也称为 L1 正则化,使用 Lasso(最小绝对收缩和选择算子)回归方法,该方法通过实现 L1 正则化进行评估。L1 正则化添加了一个惩罚项,该惩罚项等于系数绝对值的大小。此惩罚导致某些系数变为零,从而有效地执行特征选择。

代码

输出

 
   Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin   BMI  \
0            6      148             72             35        0  33.6   
1            1       85             66             29        0  26.6   
2            8      183             64              0        0  23.3   
3            1       89             66             23       94  28.1   
4            0      137             40             35      168  43.1   
5            5      116             74              0        0  25.6   
6            3       78             50             32       88  31.0   
7           10      115              0              0        0  35.3   
8            2      197             70             45      543  30.5   
9            8      125             96              0        0   0.0   

   DiabetesPedigreeFunction  Age  Outcome  
0                     0.627   50        1  
1                     0.351   31        0  
2                     0.672   32        1  
3                     0.167   21        0  
4                     2.288   33        1  
5                     0.201   30        0  
6                     0.248   26        1  
7                     0.134   29        0  
8                     0.158   53        1  
9                     0.232   54        1  
Glucose                     0.119498
BMI                         0.013093
Pregnancies                 0.000000
BloodPressure               0.000000
SkinThickness               0.000000
Insulin                     0.000000
DiabetesPedigreeFunction    0.000000
Age                         0.000000
dtype: float64   

5 Feature Selection Method from Scikit-Learn You Should Know

说明

在上面的代码中,加载了数据集,并分离了 X 和 y 变量(特征和目标)。X 特征变量使用标准缩放器进行标准化,以确保所有特征都在同一尺度上。使用 scikit-learn 库提供的 Lasso 回归模型将 L1 正则化应用于数据。从 Lasso 回归模型中提取、排序并打印了重要的特征。使用 Seaborn 进行可视化,绘制了特征重要性图。

结论

特征选择是一种机器学习技术,用于通过移除冗余和不相关的特征来提高算法性能,解决维度灾难,并提高模型性能。关键的特征选择方法包括递归特征消除 (RFE)、单变量选择、主成分分析 (PCA)、基于树的特征重要性,以及基于 L1 的特征选择(借助 Lasso 回归)。这种特征选择技术可以减少过拟合问题,提高模型准确性,并缩短算法的训练时间。借助 Python 机器学习库 scikit-learn 实现这些方法,可以证明它们的有效性。例如,一个糖尿病数据集代表了每种技术的应用和好处,突出了其在调整机器学习算法中的作用,并确认了高效准确的预测。