带有 Python 数据特征选择的机器学习
在上一章中,我们详细了解了如何为机器学习预处理和准备数据。在本章中,让我们详细了解数据特征选择及其涉及的各个方面。
数据特征选择的重要性
机器学习模型的性能与用于训练它的数据特征成正比。如果提供给它的数据特征不相关,ML 模型的性能将受到负面影响。另一方面,使用相关数据特征可以提高机器学习模型的准确性,尤其是线性回归和逻辑回归。
现在问题出现了,什么是自动特征选择?它可以定义为帮助我们在数据中选择与我们感兴趣的输出或预测变量最相关的那些特征的过程。也称为属性选择。
以下是数据建模前自动特征选择的一些好处:
-
在数据建模之前执行特征选择将减少过拟合。
-
在数据建模之前执行特征选择将提高 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]
从输出中,我们可以观察到每个属性都有分数。分数越高,该属性的重要性就越高。