数据特征的选定方法

数据是数据分析的基础,因此选择合适的数据进行分析,会提高数据分析的效率及准确性。常用的数据特征选择方法有以下四种。

  • 单变量特征选定
  • 递归特征消除
  • 主要成分分析
  • 特征的重要性

单变量特征选定

统计分析可以用来分析选择对结果影响最大的数据特征。scikit-learn中提供了SelectKBest类,可以使用一系列统计方法来选定数据特征,从而实现卡方检验。

所谓卡方检验是指,统计样本的实际观测值理论推断值之间的偏离程度,实际观测值与理论推断值之间的偏离程度就决定卡方值的大小,卡方值越大,越不符合;卡方值越小,偏差越小,越趋于符合,若两个值完全相等时,卡方值就为0,表明理论值完全符合。

使用单变量特征选定的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#导入必要的类库
from pandas import read_csv
from numpy import set_printoptions
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
#设置分析的文件名
filename="pima.csv"
#设置数据标题
names=['preg','plas','pres','skin','test','mass','pedi','age','class']
#读入数据
data=read_csv(filename,names=names)
#将数据值赋给array数组
array=data.values
#分解数据,将1-7列内容放到X中
X=array[:,0:8]
#分解数据,将第8列内容放到Y中
Y=array[:,8]
#设置特征选定条件
test=SelectKBest(score_func=chi2,k=4)
#fit方法中,X是训练的数据样本,Y是目标值
fit=test.fit(X,Y)
set_printoptions(precision=3)
print(fit.scores_)
features=fit.transform(X)
print(features)

SelectKBest更多使用方法,可以参见documentation for scikit-learn

递归特征消除

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

使用递归特征消除代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#导入必要的类库
……
from sklearn.linear_model import LogisticRegression
from sklearn.feature_selection import RFE
……
model=LogisticRegression()
#设置特征个数
rfe=RFE(model,3)
fit=rfe.fit(X,Y)
print("特征个数:")
print(fit.n_features_)
print("被选定的特征:")
print(fit.support_)
print("特征排名:")
print(fit.ranking_)

在上述代码中,使用到了LogisticRegression这个逻辑回归模型。所谓逻辑回归,是一种分类方法,即将对象分为两类,目标即因变量,其值为“是”与“否”,而其他的自变量值就可以包括很多了。这些值可以是连续的,也可以是分类的。通过logistic回归分析,可以得到自变量的权重,从而可以大致了解到哪些因素是导致目标值的关键因素。具体可以参见:IBM-Logistic回归 scikit-learn

主成分分析

在多元统计分析中,主成分分析(英语:Principal components analysis,PCA)是一种分析、简化数据集的技术。主成分分析经常用于减少数据集的维数,同时保持数据集中的对方差贡献最大的特征。这是通过保留低阶主成分,忽略高阶主成分做到的。这样低阶成分往往能够保留住数据的最重要方面。但是,这也不是一定的,要视具体应用而定。由于主成分分析依赖所给数据,所以数据的准确性对分析结果影响很大。

PCA算法

设有m条n维数据。
1)将原始数据按列组成n行m列矩阵X
2)将X的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值
3)求出协方差矩阵$C=1/m(XX^T)$
4)求出协方差矩阵的特征值及对应的特征向量
5)将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P
6)Y=PX即为降维到k维后的数据

使用主成分分析代码如下:

1
2
3
4
5
6
7
8
#导入必要的类库
……
from sklearn.feature_selection import PCA
……
pca=PCA(n_components=3)
fit=pca.fit(X)
print("解释方差:%s" % fit.explained_Variance_ratio_)
print(fit.components_)

声明:该系列读书笔记所引用知识点均出于《机器学习,Python实践》