数据预处理与数据特征选定

  特征工程是建立高准确度机器学习算法的基础,使用正确的特征来构建正确的模型,以完成既定的任务。数据预处理需要根据数据本身的特性进行,有不同的格式和不同的要求,有缺失值要填,有无效数据的要剔除,有冗余维的要选,这些步骤都和数据本身的特性紧密相关。数据预处理大致分为三个步骤:数据的准备,数据的转换,数据的输出。数据处理是系统工程的基本环节,也是提高算法准确度的有效手段。因此,为了提高算法模型的准确度,在机器学习中也要根据算法的特征和数据的特征对数据进行转换。
  数据转换方法:
  1.调整数据尺度
  2.正态化数据
  3.标准化数据
  4.二值数据

  这四种方法都会按照统一的流程来处理数据:
  1.导入数据
  2.按照算法的输入和输出整理数据
  3.格式化输入数据
  4.总结显示数据的变化
  scikit-learn提供了两种标准的格式化数据的方法,分别为适合和多重变化,适合和变换组合。适合和多重变换方法,首先调用fit()函数来准备数据转换的参数,然后调用transform()函数来做数据的预处理。适合和变换组合对绘图或汇总处理具有非常好的效果。

  1.调整数据尺度
  如果数据的各个属性按照不同的方法度量数据,那么通过调整数据的尺度让所有的属性按照相同的尺度来度量数据,就会给机器学习的算法模型训练带来极大的方便。这个方法通常会将数据的所有属性标准化,并给数据转换成0和1之间的值。这对于梯度下降等算法是非常有用的。对于回归算法,神经网络算法和K近邻算法的准确度提高也起到了很重要的作用。
  在统计学中,按照对事物描述的准确度,对所采用的尺度从低级到高级分为四个层次:定类尺度,定序尺度,定距尺度和定比尺度。定类尺度是对事物类别属性的一种测度,按照事物的属性进行分组或分类。定序尺度是对事物之间的等级或顺序的一种测度,可以比较优劣或排序。定距尺度和定比尺度是对事物类别或次序之间间距的测量,定距尺度的特点是其不仅能将事物区分为不同的类型并进行排序,而且可以准确地指出类别之间的差距。而定比尺度则更近一步,它和定距尺度地差别在于它有一个固定的绝对“零”点。由于这两种测量尺度在绝大多数统计分析中没有本质的差别,所以很多时候都没有严格的区分。
  在scikit-learn中,可以通过MinMaxScaler类来调整数据尺度。将不同计量单位地数据统一成相同的尺度,利于对事物地分类或分组。实际上,MinMaxScaler是将属性缩放到一个指定范围,或者对数据进行标准化并将数据都聚集到0附近,方差为1。数据尺度的统一,通常能够提高与距离有关的算法的准确度(如K近邻算法)。

#调整数据尺度
from pandas import read_csv
from numpy import set_printoptions
from sklearn.preprocessing import MinMaxScaler
#导入数据
filename = '/home/hadoop/DataSet/pima indians.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]
transformer = MinMaxScaler(feature_range=(0,1))
#数据转换
newX = transformer.fit_transform(X)
#设定数据的打印格式
set_printoptions(precision=3)#小数点后精度第3位
print(newX)

  2.正态化数据
  正态化数据是有效的处理符合高斯分布的数据的手段,输出结果以0为中位数,方差为1,并作为假定数据符合高斯分布的算法的输入。这些算法有线性回归,逻辑回归和线性判别分析等。可通过scikit-learn提供的StandardScaler类来进行正态化数据处理。

#正态化数据
from pandas import read_csv
from numpy import set_printoptions
from sklearn.preprocessing import StandardScaler
#导入数据
filename = '/home/hadoop/DataSet/pima indians.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]
transformer = StandardScaler().fit(X)
#数据转换
newX = transformer.transform(X)
set_printoptions(precision=3)
print(newX)

  3.标准化数据
  标准化数据处理是将每一行的数据的距离处理为1(在线性代数中矢量距离为1)的数据又叫做“归一元”处理,适合处理稀疏数据(具有很多为0的数据),归一元处理的数据对使用权重输入的神经网络和使用距离的K近邻算法的准确度的提升有显著作用。使用scikit-learn中的Normalizer类实现。

#标准化数据
from pandas import read_csv
from numpy import set_printoptions
from sklearn.preprocessing import Normalizer
#导入数据
filename = '/home/hadoop/DataSet/pima indians.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]
transformer = Normalizer().fit(X)
#数据转换
newX = transformer.transform(X)
#设定数据的打印格式
set_printoptions(precision=3)
print(newX)

  4.二值数据
  二值数据是使用值将数据转化为二值,大于阈值设置为1,小于阈值设置为0。这个过程被叫做二分数据或阈值转换。在生成明确值或特征工程增加属性时候使用,使用scikit-learn中的Binarizer类实现。

#二值数据
from pandas import read_csv
from numpy import set_printoptions
from sklearn.preprocessing import Binarizer
#导入数据
filename = '/home/hadoop/DataSet/pima indians.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]
transformer = Binarizer(threshold=10.0).fit(X)#设定阈值
#数据转换
newX = transformer.transform(X)
#设定数据的打印格式
set_printoptions(precision=3)
print(newX)

  在做数据挖掘和数据分析时,数据是所有问题的基础,并且会影响整个项目的进程。相较于使用一些复杂的算法,灵活地处理数据经常会取到意想不到的效果。而处理数据不可避免的会使用到特征工程。数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。因此,特征过程的本质就是一项工程活动,目的是最大限度地从原始数据中提取合适的特征,以供算法和模型使用。特征处理是特征工程的核心部分,scikit-learn提供了较为完整的特征处理方法,包括数据预处理,特征选择,降维等。
  四个数据特征选择的方法:
  1.单变量特征选定
  2.递归特征消除
  3.主要成分分析
  4.特征的重要性

  1.特征选定
  特征选定是一个流程,能够选择有助于提高预测结果准确度的特征数据,或者有助于发现我们感兴趣的输出结果的特征数据。如果数据中包含无关的特征属性,会降低算法的准确度,对预测新数据造成干扰,尤其是线性相关算法(如线性回归算法和逻辑回归算法)。因此,在开始建立模型之前,执行特征选定有助于:
1.降低数据的拟合度:较少的冗余数据,会使算法得出结论的机会更大
2.提高算法精度:较少的误导数据,能够提高算法的准确度
3.减少训练时间:越少的数据,训练模型所需要的时间越少

  2.单变量特征选定
  统计分析可以用来分析选择对结果影响最大的数据特征。在scikit-learn中提供了SelectBest类,可以使用一系列统计方法来选定数据特征,是对卡方检验的实现。经典的卡方检验是检验定性自变量对定性因变量的相关性的方法。假设自变量有N种取值,因变量有M种取值,考虑自变量等于i且因变量等于j的样本频数的观察值与期望值的差距,构建统计量。卡方检验就是统计样本的实际观测值与理论推断值之间的偏离程度,偏离程度决定了卡方值的大小,卡方值越大,越不符合;卡方值越小,偏差越小,越趋于符合;若两个值完全相等,卡方值就为0,表示理论值完全符合。下面的例子是通过卡方检验的方式来选择四个对结果影响最大的数据特征。

#通过卡方检验选定数据特征
from pandas import read_csv
from numpy import set_printoptions
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
#导入数据
filename = '/home/hadoop/DataSet/pima indians.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)#score_func参数为chi2的时候即为卡方检验,还可以通过相关系数,互信息法等统计方法来选定数据特征
fit = test.fit(X,Y)
set_printoptions(precision=3)
print(fit.scores_)
features = fit.transform(X)
print(features)

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

#通过递归消除来选定特征
from pandas import read_csv
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
#导入数据
filename = '/home/hadoop/DataSet/pima indians.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("特征个数:")
print(fit.n_features_)
print("被选定的特征:")
print(fit.support_)
print("特征排名:")
print(fit.ranking_)

  4.主要成分分析
  主要成分分析(PCA)是使用线性代数来转换压缩数据,通常被称作数据降维。常见的降维方法除了主要成分分析(PCA),还有线性判别分析(LDA),它本身也是一个分类模型。PCA和LDA有很多的相似之处,其本质是将原始的样本映射到维度耕地的样本空间中,但是PCA和LDA的映射目标不一样:PCA是为了让映射后的样本具有更大的发散性;而LDA是为了让映射后的样本有更好的分类性能。所以说,PCA是一种无监督的降维方法,而LDA是一种有监督的降维方法。在聚类算法中,通常会利用PCA来对数据进行降维处理,以利于对数据的简化分析和可视化。

#通过主要成分分析选定数据特征
from pandas import read_csv
from sklearn.decomposition import PCA
#导入数据
filename = '/home/hadoop/DataSet/pima indians.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]
#特征选定
pca = PCA(n_components=3)
fit = pca.fit(X)
print("解释方差:%s"% fit.explained_variance_ratio_)
print(fit.components_)

  5.特征重要性
  袋装决策树算法,随机森林算法和极端随机数算法都可以用来计算数据特征的重要性。这三个算法都是集成算法中的袋装算法。

#通过决策树计算特征的重要性
from pandas import read_csv
from sklearn.ensemble import ExtraTreesClassifier
#导入数据
filename = '/home/hadoop/DataSet/pima indians.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_)

猜你喜欢

转载自blog.csdn.net/heloiselt/article/details/80868288
今日推荐