📜  带有Python的ML-数据功能选择

📅  最后修改于: 2020-12-10 05:33:27             🧑  作者: Mango


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

数据特征选择的重要性

机器学习模型的性能与用于训练它的数据特征成正比。如果提供给它的数据特征不相关,则ML模型的性能将受到负面影响。另一方面,使用相关数据功能可以提高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作为前三个最佳功能。它们在输出中标记为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]

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