Python机器学习之四:特征选择

数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。

本节示例使用数据集:Pima Indian数据集
我们先导入数据,并将特征与目标划分为X,Y:

import pandas as pd
import numpy as np
filename='pima_data.csv'
dataset=pd.read_csv(filename)
#将数据分为输入和输出数据
array=dataset.values
X=array[:,:8]
Y=array[:,8]

如果数据中包含无关的特征属性,会降低算法的准确度,对预测新数据造成干扰,尤其是线性相关算法(如线性回归算法和逻辑回归算法)。特征选择的目的是最大限度地从原始数据中提取合适的特征,以供算法和模型使用。
在开始建立模型之前,执行特征选择有助于:

  • 降低数据的拟合度:较少的冗余数据,会使算法得出结论的机会更大。
  • 提高算法精度:较少的误导数据,能够提高算法的准确度。
  • 减少训练时间:越少的数据,训练模型所需要的时间越少。

本文将会介绍以下四个数据特征选择的方法:
· 统计分析法——SelectKBest
· 递归特征消除——RFE
· 主要成分分析——PCA
· 袋装算法

1.统计分析法(SelectKBest)——卡方、相关系数、互信息

统计分析可以用来分析选择对结果影响最大的数据特征,常见方法包括相关系数法、卡方检验法、互信息法。

经典的卡方检验是检验定性自变量对定性因变量的相关性的方法。卡方检验就是统计样本的实际观测值与理论推断值之间的偏离程度,偏离程度决定了卡方值的大小,卡方值越大,越不符合;卡方值越小,偏差越小,越趋于符合;若两个值完全相等,卡方值就为 0,表明理论值完全符合。

在 scikit-learn 中提供了SelectKBest函数,通过设置SelectKBest的score_func参数,可以使用一系列统计方法来选定数据特征。下面的例子是通过卡方检验(chi-squared)的方式来选择四个对结果影响最大的数据特征。

#单变量特征选定

#通过卡方检验选定数据特征
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2

#特征选定
test=SelectKBest(score_func=chi2,k=4)#修改score_func参数,还通过相关系数、互信息法等统计方法来选定数据特征
fit=test.fit(X,Y)
print(fit.scores_)#卡方检验对每一个数据特征的评分
features=fit.transform(X)
print(features)#得分最高的四个数据特征

2.递归特征消除(RFE)

递归特征消除(RFE,Recursive feature elimination)使用一个基模型来进行多轮训练,每轮训练后消除若干权值系数的特征,再基于新的特征集进行下一轮训练。通过每一个基模型的精度,找到对最终的预测结果影响最大的数据特征。

下面的例子是以逻辑回归算法为基模型,通过递归特征消除来选定对预测结果影响最大的三个数据特征。

#递归特征消除RFE
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
model=LogisticRegression()
rfe=RFE(model,3)
fit=rfe.fit(X,Y)
print(fit.n_features_)#特征个数
print(fit.support_)#被选定的特征
print(fit.ranking_)#特征排名

执行后,我们可以看到RFE选定了preg、mass和pedi三个数据特征,它们在support_中被标记为True,在ranking_中被标记为1。

3.主要成分分析(PCA)与线性判别分析(LDA)

主要成分分析(PCA,Principal Components Analysis)是使用线性代数来转换压缩数据,通常被称作数据降维。
常见的降维方法还有线性判别分析(LDA),它本身也是一个分类模型。

PCA 与 LDA 有很多的相似之处,其本质是将原始的样本映射到维度更低的样本空间中,但是PCA和LDA的映射目标不一样:PCA是为了让映射后的样本具有最大的发散性;而 LDA 是为了让映射后的样本有最好的分类性能。所以说,PCA 是一种无监督的降维方法,而LDA是一种有监督的降维方法。在聚类算法中,通常会利用PCA对数据进行降维处理,以利于对数据的简化分析和可视化。

#主成分分析PCA
from sklearn.decomposition import PCA
pca=PCA(n_components=3)
fit=pca.fit(X)#PCA是无监督学习,不需要传入target
print(fit.components_)
print(fit.explained_variance_ratio_)#解释方差

4.袋装算法

袋装决策树算法(Bagged Decision Tress)、随机森林算法和极端随机树算法都可以用来计算数据特征的重要性。这三个算法都是集成算法中的袋装算法,在后续的集成算法部分会有详细的介绍。

下面给出一个使用ExtraTreesClassifier类进行特征的重要性计算的例子。

#特征重要性
#通过决策树计算特征的重要性
from sklearn.ensemble import ExtraTreesClassifier
model= ExtraTreesClassifier()
fit= model.fit(X,Y)
print(fit.feature_importances_)

执行后,我们可以看见算法给出了每一个数据特征的得分。

[1] 1480. 带你了解sklearn中特征工程的几个使用方法[EB/OL].云+社区, 2019-09-17 https://cloud.tencent.com/developer/article/1507456
[2] 魏贞原. 机器学习:Python实践[M]. 电子工业出版社, 2018-01.

你可能感兴趣的:(机器学习:python实践,算法,机器学习,python)