数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。因此,特征过程的本质就是一项工程活动,目的是最大限度地从原始数据中提取合适的特征,以供算法和模型使用。特征处理是特征工程的核心部分,scikit-leam提供了较为完整的特征处理方法,包括数据预处理、特征选择、降维等。以下介绍四个数据特征选择的方法:单变量特征选定、递归特征消除、主要成分分析、特征的重要性。
特征选定是一个流程,能够选择有助于提高预测结果准确度的特征数据,或者有助于发现我们感兴趣的输出结果的特征数据。如果数据中包含无关的特征属性,会降低算法的准确度,对预测新数据造成干扰,尤其是线性相关算法(如线性回归算法和逻辑回归算法)。因此,在开始建立模型之前,执行特征选定有助于:
降低数据的拟合度:较少的冗余数据,会使算法得出结论的机会更大。
提高算法精度:较少的误导数据,能够提高算法的准确度。
减少训练时间:越少的数据,训练模型所需要的时间越少。
scikit-leam的特征选定文档(http://scikit-learn.org/stable/modules/feature_selection.html)
统计分析可以用来分析选择对结果影响最大的数据特征。在scikit-leam中提供了SelectKBest类,可以使用一系列统计方法来选定数据特征,是对卡方检验的实现。经典的卡方检验是检验定性自变量对定性因变量的相关性的方法。假设自变量有N种取值,因变量有M种取值,考虑自变量等于i且因变量等于j的样本频数的观察值与期望值的差距,构建统计量。卡方检验就是统计样本的实际观测值与理论推断值之间的偏离程度,偏离程度决定了卡方值的大小,卡方值越大,越不符合;卡方值越小,偏差越小,越趋于符合;若两个值完全相等,卡方值就为0,表明理论值完全符合。下面的例子是通过卡方检验(chi-squared)的方式来选择四个对结果影响最大的数据特征。
#通过卡方检验选定数据特征
from pandas import read_csv
from nurnpy import set_printoptions
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
#导入数据
filename ='pima_data.csv'
names= ['preg','plas','pres','skin','test','mass','pedi','age','class']
data= read_csv(filename, names=names)
#将数据分为输入数据和输出结果
array = data.values
x = array [ : , 0: 8]
Y = array [:, 8]
#特征选定
test = SelectKBest(score_func=chi2,k=4)
fit = test.fit(X, Y)
set_printoptions(precision=3)
print(fit.scores_)
features = fit.transform(X)
print(features)
执行结束后,得到了卡方检验对每一个数据特征的评分,以及得分最高的四个数据特征。
通过设置Select.KBest的score_func参数,Select.KBest不仅可以执行卡方检验来选择数据特征,还可以通过相关系数、互信息法等统计方法来选定数据特征。
归特征消除(盯E)使用一个基模型来进行多轮训练,每轮训练后消除若干权值系数的特征,再基于新的特征集进行下一轮训练。通过每一个基模型的精度,找到对最的预测结果影响最大的数据特征。面的例子是以逻辑回归算法为基模型,通过递归特征消除来选定对预测结果影响最大的三个数据特征。
#通过递归消除来选定特征
from pandas import read_csv
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
#导入数据
filename ='pima_data.csv'
names= ['preg','plas','pres','skin','test','mass','pedi','age','class']
data= read_csv(filename, names=names)
#将数据分为输入数据和输出结果
array = data.values
x = array [ : , 0: 8]
Y = array [:, 8]
#特征选定
model= LogisticRegression()
rfe = RFE (model, 3)
fit = rfe.fit(X, Y)
print("特征个数2")
print(fit.n_features_)
print("被选定的特征:")
print(fit.support)
print("特征排名:")
print(fit.ranking_)
主要成分分析(PCA)是使用线性代数来转换压缩数据,通常被称作数据降维。常见的降维方法除了主要成分分析(PCA),还有线性判别分析(LDA),它本身也是一个分类模型。PCA和LDA有很多的相似之处,其本质是将原始的样本映射到维度更低的样本空间中,但是PCA和LDA的映射目标不一样:PCA是为了让映射后的样本具有最大的发散性;而LDA是为了让映射后的样本有最好的分类性能。所以说,PCA是一种无监督的降维方法,而LDA是一种有监督的降维方法。在聚类算法中,通常会利用PCA对数据进行降维处理,以利于对数据的简化分析和可视化。详细内容请参考scikit-leam的API文档。
#通过主要成分分析来选定特征
from pandas import read_csv
from sklearn.decomposition import PCA
#导入数据
filename ='pima_data.csv'
names= ['preg','plas','pres','skin','test','mass','pedi','age','class']
data= read_csv(filename, names=names)
#将数据分为输入数据和输出结果
array = data.values
x = array [ : , 0: 8]
Y = array [:, 8]
#特征选定
pea = PCA(n_components=3)
fit = pea.fit(X)
print("解释方差:%s" %s fit.explained_variance_ratio_) print(fit.components_)
袋装决策树算法(Bagged Decision Tress )、随机森林算法和极端随机树算法都可以用来计算数据特征的重要性。这三个算法都是集成算法中的袋装算沽。下面是用ExtraTreesClassifier类进行特征的重要性计算的例子。
#通过决策树计算特征的重要性
from pandas import read_csv
from sklearn.ensemble import ExtraTreesClassifier
#导入数据
filename ='pima_data.csv'
names= ['preg','plas','pres','skin','test','mass','pedi','age','class']
data= read_csv(filename, names=names)
#将数据分为输入数据和输出结果
array = data.values
x = array [ : , 0: 8]
Y = array [:, 8]
#特征选定
model = ExtraTreesClassifier()
fit = model.fit(X, Y)
print(fit.feature_importances_)
执行后,可以看见算法给出了每一个数据特征的得分。