使用 Python 进行机器学习 - 数据特征选择


在上一章中,我们详细了解了如何为机器学习预处理和准备数据。在本章中,让我们详细了解数据特征选择及其涉及的各个方面。

数据特征选择的重要性

机器学习模型的性能与用于训练它的数据特征成正比。如果提供给机器学习模型的数据特征不相关,其性能将会受到负面影响。另一方面,使用相关数据特征可以提高 ML 模型的准确性,尤其是线性和逻辑回归。

现在问题来了,什么是自动特征选择?它可以定义为我们在数据中选择与我们感兴趣的输出或预测变量最相关的特征的过程。也称为属性选择。

以下是在数据建模之前自动选择特征的一些好处 -

  • 在数据建模之前进行特征选择将减少过度拟合。

  • 在数据建模之前执行特征选择将提高机器学习模型的准确性。

  • 在数据建模之前执行特征选择将减少训练时间

特征选择技术

以下是我们可以用来在 Python 中对 ML 数据进行建模的自动特征选择技术 -

单变量选择

这种特征选择技术在统计测试的帮助下选择那些与预测变量具有最强关系的特征非常有用。我们可以借助 scikit-learn Python 库的 SelectKBest0class 来实现单变量特征选择技术。

例子

在此示例中,我们将使用 Pima Indians Diabetes 数据集借助卡方统计检验选择具有最佳特征的 4 个属性。

from pandas import read_csv
from numpy import set_printoptions
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(path, names=names)
array = dataframe.values

接下来,我们将数组分为输入和输出组件 -

X = array[:,0:8]
Y = array[:,8]

以下代码行将从数据集中选择最佳特征 -

test = SelectKBest(score_func=chi2, k=4)
fit = test.fit(X,Y)

我们还可以根据我们的选择汇总输出数据。在这里,我们将精度设置为 2,并显示具有最佳特征的 4 个数据属性以及每个属性的最佳得分 -

set_printoptions(precision=2)
print(fit.scores_)
featured_data = fit.transform(X)
print ("\nFeatured data:\n", featured_data[0:4])

输出

[ 111.52 1411.89 17.61 53.11 2175.57 127.67 5.39 181.3 ]
Featured data:
[
   [148. 0.  33.6 50. ]
   [ 85. 0.  26.6 31. ]
   [183. 0.  23.3 32. ]
   [ 89. 94. 28.1 21. ]
]

递归特征消除

顾名思义,RFE(递归特征消除)特征选择技术递归地删除属性并使用剩余属性构建模型。我们可以借助 scikit-learn Python 库的 RFE 类来实现 RFE 特征选择技术。

例子

在此示例中,我们将使用 RFE 和逻辑回归算法从 Pima Indians Diabetes 数据集中选择具有最佳特征的最佳 3 个属性。

from pandas import read_csv
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(path, names=names)
array = dataframe.values

接下来,我们将数组分为输入和输出组件 -

X = array[:,0:8]
Y = array[:,8]

以下代码行将从数据集中选择最佳特征 -

model = LogisticRegression()
rfe = RFE(model, 3)
fit = rfe.fit(X, Y)
print("Number of Features: %d")
print("Selected Features: %s")
print("Feature Ranking: %s")

输出

Number of Features: 3
Selected Features: [ True False False False False True True False]
Feature Ranking: [1 2 3 5 6 1 1 4]

我们可以在上面的输出中看到,RFE 选择 preg、mass 和 pedi 作为前 3 个最佳特征。它们在输出中标记为 1。

主成分分析(PCA)

PCA,通常称为数据缩减技术,是非常有用的特征选择技术,因为它使用线性代数将数据集转换为压缩形式。我们可以借助 scikit-learn Python 库的 PCA 类来实现 PCA 特征选择技术。我们可以选择输出中主成分的数量。

例子

在此示例中,我们将使用 PCA 从 Pima Indians Diabetes 数据集中选择最佳 3 个主成分。

from pandas import read_csv
from sklearn.decomposition import PCA
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(path, names=names)
array = dataframe.values

接下来,我们将数组分为输入和输出组件 -

X = array[:,0:8]
Y = array[:,8]

以下代码行将从数据集中提取特征 -

pca = PCA(n_components=3)
fit = pca.fit(X)
print("Explained Variance: %s") % fit.explained_variance_ratio_
print(fit.components_)

输出

Explained Variance: [ 0.88854663 0.06159078 0.02579012]
[
   [ 
      -2.02176587e-03 9.78115765e-02 1.60930503e-02 6.07566861e-02 
      9.93110844e-01 1.40108085e-02 5.37167919e-04 -3.56474430e-03
   ]
   [ 
      2.26488861e-02 9.72210040e-01 1.41909330e-01 -5.78614699e-02 
      -9.46266913e-02 4.69729766e-02 8.16804621e-04 1.40168181e-01
   ]
   [ 
      -2.24649003e-02 1.43428710e-01 -9.22467192e-01 -3.07013055e-01 
      2.09773019e-02 -1.32444542e-01 -6.39983017e-04 -1.25454310e-01
   ]
]

从上面的输出中我们可以看出,3 个主成分与源数据几乎没有相似之处。

特征重要性

顾名思义,特征重要性技术用于选择重要性特征。它基本上使用经过训练的监督分类器来选择特征。我们可以借助 scikit-learn Python 库的 ExtraTreeClassifier 类来实现这种特征选择技术。

例子

在此示例中,我们将使用 ExtraTreeClassifier 从 Pima Indians Diabetes 数据集中选择特征。

from pandas import read_csv
from sklearn.ensemble import ExtraTreesClassifier
path = r'C:\Desktop\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(data, names=names)
array = dataframe.values

接下来,我们将数组分为输入和输出组件 -

X = array[:,0:8]
Y = array[:,8]

以下代码行将从数据集中提取特征 -

model = ExtraTreesClassifier()
model.fit(X, Y)
print(model.feature_importances_)

输出

[ 0.11070069 0.2213717 0.08824115 0.08068703 0.07281761 0.14548537 0.12654214 0.15415431]

从输出中,我们可以观察到每个属性都有分数。分数越高,该属性的重要性越高。