在做数据挖掘和数据分析时,数据是所有问题的基础,并且会影响整个项目的进程。
相较于使用一些复杂的算法,灵活的处理数据经常会取到意想不到的效果。而处理数据不可避免会使用到特征工程。
数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。因此,特征过程的本质就是一项工程活动,目的是最大限度地从原始数据中提取合适的特征,以供算法和模型使用。特征处理是特征工程的核心部分,scikit-leanr提供了较为完善的特征处理方法,包括数据预处理、特征选择、降维等。
接下来通过Scikit-learn来自动选择用于建立机器学习模型的数据特征方法。
特征选定
是一个流程,能够选择有助于提高预测结果准确度的特征数据,或者有助于发现我们感兴趣的输出结果的特征数据。如果数据中包含无关的特征属性,会降低算法的准确度,对预测新数据造成干扰,尤其是线性相关算法(如线性回归算法和逻辑回归算法)。因此,在开始建立模型之前,执行特征选定有助于:
降低数据的拟合度:较少的冗余数据,会使算法得出结论的机会更大。
提高算法精度:较少的误导数据,能够提高算法的准确度。
减少训练时间:越少的数据,训练模型所需要的时间越少。
单变量特征选定
统计分析可以用来分析选择对结果影响最大的数据特征。
在Scikit-learn中提供了SelectKBest类,可以使用一系列统计方法来选定数据特征,是对卡方检验的实现。经典的卡方检验是检验定性自变量对定性因变量的相关性的方法。假设自变量有N种取值,因变量有M种取值,考虑自变量等于i且因变量等于j的样本频数的观察值与期望值的差距,构建统计量。卡方检验就是统计样本的实际观测值与理论推断值之间的偏离程度,偏离程度决定了卡方值的大小,卡方值越大,越不符合;卡方值越小,偏差越小,越趋于符合;若两个值完全相等,卡方值就是0,表明理论值完全符合。
下面的例子是通过卡方检验(chi-squared)的方式来选择四个对结果影响最大的数据特征。
1 #通过卡方检验选定数据 2 from pandas import read_csv 3 from numpy import set_printoptions 4 from sklearn.feature_selection import SelectKBest 5 from sklearn.feature_selection import chi2 6 7 filename=‘/home/aistudio/work/pima_data1.csv‘ 8 names=[‘preg‘,‘plas‘,‘pres‘,‘skin‘,‘test‘,‘mass‘,‘pedi‘,‘age‘,‘class‘] 9 data=read_csv(filename,names=names) 10 #将数据分为输入数据和输出数据 11 array=data.values 12 x=array[:,0:8] 13 y=array[:,8] 14 15 #特征选定 16 test=SelectKBest(score_func=chi2,k=4) 17 fit=test.fit(x,y) 18 #设定数据的打印格式 19 set_printoptions(precision=3) 20 print(fit.scores_) 21 features=fit.transform(x) 22 print(features)
[ 111.52 1411.887 17.605 53.108 2175.565 127.669 5.393 181.304] [[148. 0. 33.6 50. ] [ 85. 0. 26.6 31. ] [183. 0. 23.3 32. ] ... [121. 112. 26.2 30. ] [126. 0. 30.1 47. ] [ 93. 0. 30.4 23. ]]
执行结束后,得到卡方检验对每个数据特征的评分,以及得分最高的四个数据特征。
通过设置SelectKBest的score_func参数,SelectKBest不仅可以执行卡方检验来选择数据特征,还可以通过相关系数/互信息法等统计方法来选定数据特征。
递归特征消除
递归特征消除(RFE)使用一个基模型来进行多轮训练,每轮训练后消除若干权值系数的特征,再基于新的特征集进行下一轮训练。通过每一个基模型的精度,找到对最终的预测结果影响最大的数据特征。
下面的例子是以逻辑回归算法为基模型,通过递归特征消除来选定对预测结果影响最大的三个数据特征。代码如下:
1 #通过递归消除特征选定 2 from pandas import read_csv 3 from numpy import set_printoptions 4 from sklearn.feature_selection import RFE 5 from sklearn.linear_model import LogisticRegression 6 7 filename=‘/home/aistudio/work/pima_data1.csv‘ 8 names=[‘preg‘,‘plas‘,‘pres‘,‘skin‘,‘test‘,‘mass‘,‘pedi‘,‘age‘,‘class‘] 9 data=read_csv(filename,names=names) 10 #将数据分为输入数据和输出数据 11 array=data.values 12 x=array[:,0:8] 13 y=array[:,8] 14 15 #特征选定 16 model=LogisticRegression() 17 rfe=RFE(model,3) 18 fit=rfe.fit(x,y) 19 print(‘特征个数:‘) 20 print(fit.n_features_) 21 print(‘被选定的特征:‘) 22 print(fit.support_) 23 print(‘特征排名:‘) 24 print(fit.ranking_)
特征个数: 3 被选定的特征: [ True False False False False True True False] 特征排名: [1 2 3 5 6 1 1 4]
执行后,可以看到RFE选定了preg,mass,pedi三个数据特征,他们在support_中被标记为True,在rangking_中被标记为1.
主要成分分析
主要成分分析(PCA)是使用线性代数来转换压缩数据,通常被称作数据降维。
常见的降维方法除了主要成分分析(PCA),还有线性判别分析(LDA),它本身也是一个分类模型。
PCA和LDA有很多相似之处,其本质是将原始的样本映射到维度更低的样本空间中,但是PCA和LDA的映射目标不一样:PCA是为了让映射后的样本具有最大的发散性;而LDA是为了让映射后的样本有最好的分类性能。所以说,PCA是一种无监督的降维方法,而LDA是一种有监督的
降维方法。
在聚类算法中,通常会利用PCA对数据进行降维处理,以利于对数据的简化分析和可视化。
1 #通过主要成分分析选定数据特征 2 from pandas import read_csv 3 #from numpy import set_printoptions 4 #from sklearn.feature_selection import RFE 5 from sklearn.decomposition import PCA 6 7 filename=‘/home/aistudio/work/pima_data1.csv‘ 8 names=[‘preg‘,‘plas‘,‘pres‘,‘skin‘,‘test‘,‘mass‘,‘pedi‘,‘age‘,‘class‘] 9 data=read_csv(filename,names=names) 10 #将数据分为输入数据和输出数据 11 array=data.values 12 x=array[:,0:8] 13 y=array[:,8] 14 15 #特征选定 16 pca=PCA(n_components=3) 17 fit=pca.fit(x) 18 print(‘解释方差:%s‘ % fit.explained_variance_ratio_) 19 print(fit.components_)
解释方差:[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]]
特征重要性
袋装决策树算法(Bagged Decision Trees)、随机森林算法和极端随机树算法都可以用来计算数据特征。
这三种算法都是集成算法中的袋装算法中。
下面给出一个使用ExtraTreesClassifier类进行特征的重要性计算的例子。
1 #通过主要成分分析选定数据特征 2 from pandas import read_csv 3 #from numpy import set_printoptions 4 #from sklearn.feature_selection import RFE 5 from sklearn.ensemble import ExtraTreesClassifier 6 7 filename=‘/home/aistudio/work/pima_data1.csv‘ 8 names=[‘preg‘,‘plas‘,‘pres‘,‘skin‘,‘test‘,‘mass‘,‘pedi‘,‘age‘,‘class‘] 9 data=read_csv(filename,names=names) 10 #将数据分为输入数据和输出数据 11 array=data.values 12 x=array[:,0:8] 13 y=array[:,8] 14 15 #特征选定 16 model=ExtraTreesClassifier() 17 fit=model.fit(x,y) 18 #print(‘解释方差:%s‘ % fit.explained_variance_ratio_) 19 print(fit.feature_importances_)
[0.11096135 0.22398194 0.09147738 0.08164259 0.07800569 0.14279681 0.11434977 0.15678447]
上面就是代码执行后每一个数据特征的得分。
原文:https://www.cnblogs.com/yuzaihuan/p/12296423.html