特诊选择是困难耗时的,也需要对需求的理解和专业知识的掌握。在机器学习的应用开发中,最基础的是特征工程。(吴恩达)
数据预处理需要根据数据本身的特征进行,有不同的格式和不同的要求,有缺失的值要填,有无效的数据要剔除,有冗余维的要选,这些步骤都和数据本身的特性紧密相关。数据预处理大致分为三个步骤:数据准备、数据转换、数据输出。
数据处理是系统工程的基本环节,也是提高算法准确度的有效手段。
接下来介绍几种数据转换方法:
- 调整数据尺度(Rescale Data)
- 正态化数据(Standardize Data)
- 标准化数据(Normalize Data)
- 二值化数据(Binarize Data)
在开始机器学习的模型训练之前,需要对数据进行预处理,这是一个必需的过程。需要注意的是,不同的算法对数据有不同的假定,需要按照不同的方式转换数据。当然,如果按照算法的规则来准备数据,算法就可以产生一个准确度比较高的模型。
接下来会介绍4种不同的方法来格式化数据。这四种方法都会按照统一的流程来处理数据:
- 导入数据
- 按照算法的输入输出整理数据
- 格式化输入数据
- 总结显示数据的变化
scikit-learn提供了两种标准的格式化数据的方法,每一种方法都有适用的算法。利用这两种方法整理的数据,可以直接用来训练算法模型。在Scikit-learn的说明文档中,也有对这两种方法的详细说明:
- 适合和多重变换(Fit and Multiple Transform)
- 适合和变换组合(Cobined Fit-and-Transform)
推荐优先选择适合和多重变换方法。首先调用fit()函数来准备数据转换的参数,然后调用transform()函数来做数据的预处理。适合和变换组合对绘图或汇总处理具有非常好的效果。
如果数据的各个属性按照不同的方式度量数据,那么通过调整数据的尺度让所有的属性按照相同的尺度来度量数据,就会给机器学习的算法模型的训练带来极大的方便。这个方法通常会将数据的所有属性标准化,并将数据转换成0和1之间的值,这对于梯度下降算法是非常有用的,对于回归算法,神经网络算法和K近邻算法的准确度提高也起到很重要的作用。
在统计学中,按照对事物描述的精确度,对所采用的尺度从低级到高级分成4个层次:定类尺度、定序尺度、定距尺度、定比尺度。
定类尺度:对事物类别属性的一种测量,按照事物进行分组或分类。
定序尺度:对事物之间的等级或顺序的一种测量,可以标胶优劣或排序。
定距尺度和定比尺度:对事物类别或次序之间间距的测量,定距尺度的特点是其不仅能将事物区分为不同的类型并进行排序,而且可以准确的指出类别之间的差距。而定比尺度则更进一步,它和定距尺度差别在于它有一个固定的绝对零点。由于这两种测量尺度在绝大多数统计分析中没有本质区别,所以很多时候都没有严格的区别。
尺度调整:在Scikit-learn中,可以通过minMaxScalar类来调整数据尺度。将不同计量单位的数据统一成相同的尺度,利于对事物的分类或分组。实际上,MinMaxScalar是将属性缩放到一个指定的范围,或者对数据进行标准化并将数据都聚集到0附近,方差为1.数据尺度的统一,通常能够提高与距离相关的算法的准确度(如K近邻)。
下面给出一个对数据进行缩放的例子:
1 #调准数据中尺度(0..) 2 from pandas import read_csv 3 from numpy import set_printoptions 4 from sklearn.preprocessing import MinMaxScaler 5 6 filename='/home/aistudio/work/pima_data1.csv' 7 names=['preg','plas','pres','skin','test','mass','pedi','age','class'] 8 data=read_csv(filename,names=names) 9 #将数据分为输入数据和输出数据 10 array=data.values 11 x=array[:,0:8] 12 y=array[:,8] 13 transformer=MinMaxScaler(feature_range=(0,1)) 14 #数据转换 15 newx=transformer.fit_transform(x) 16 #设定数据的打印格式 17 set_printoptions(precision=3) 18 print(newx)
[[0.353 0.744 0.59 ... 0.501 0.234 0.483] [0.059 0.427 0.541 ... 0.396 0.117 0.167] [0.471 0.92 0.525 ... 0.347 0.254 0.183] ... [0.294 0.608 0.59 ... 0.39 0.071 0.15 ] [0.059 0.633 0.492 ... 0.449 0.116 0.433] [0.059 0.467 0.574 ... 0.453 0.101 0.033]]
调整完数据的尺度后,所有的数据都按照设定的分布区间进行分布。
正态化数据(standardize Data)是有效的处理符合高斯分布的数据的手段,输出结果以0为中位数,方差为1,并作为假定数据符合高斯分布的算法的输入。这些算法有线性回归、逻辑回归、线性判别分析等。
在这里通过scikit-learn提供的StandardScaler类来进行正态化数据处理。代码如下:
1 #正太化数据 2 from pandas import read_csv 3 from numpy import set_printoptions 4 from sklearn.preprocessing import StandardScaler 5 6 filename='/home/aistudio/work/pima_data1.csv' 7 names=['preg','plas','pres','skin','test','mass','pedi','age','class'] 8 data=read_csv(filename,names=names) 9 #将数据分为输入数据和输出数据 10 array=data.values 11 x=array[:,0:8] 12 y=array[:,8] 13 transformer=StandardScaler().fit(x) 14 #数据转换 15 newx=transformer.transform(x) 16 #设定数据的打印格式 17 set_printoptions(precision=3) 18 print(newx)
[[ 0.64 0.848 0.15 ... 0.204 0.468 1.426] [-0.845 -1.123 -0.161 ... -0.684 -0.365 -0.191] [ 1.234 1.944 -0.264 ... -1.103 0.604 -0.106] ... [ 0.343 0.003 0.15 ... -0.735 -0.685 -0.276] [-0.845 0.16 -0.471 ... -0.24 -0.371 1.171] [-0.845 -0.873 0.046 ... -0.202 -0.474 -0.871]]
标准化数据(Normalize Data)处理是将每一行数据的距离处理成1(在线性代数中矢量距离为1)的数据又叫做归一元处理,适合处理稀疏数据(具有很多0的数据)。归一元处理的数据对使用权重输入的神经网络和使用距离的K近邻算法的准确度提升有显著作用。
使用scikit-learn中的Normalizer类实现。
1 #标准化数据 2 from pandas import read_csv 3 from numpy import set_printoptions 4 from sklearn.preprocessing import Normalizer 5 6 filename='/home/aistudio/work/pima_data1.csv' 7 names=['preg','plas','pres','skin','test','mass','pedi','age','class'] 8 data=read_csv(filename,names=names) 9 #将数据分为输入数据和输出数据 10 array=data.values 11 x=array[:,0:8] 12 y=array[:,8] 13 transformer=Normalizer().fit(x) 14 #数据转换 15 newx=transformer.transform(x) 16 #设定数据的打印格式 17 set_printoptions(precision=3) 18 print(newx)
[[0.034 0.828 0.403 ... 0.188 0.004 0.28 ] [0.008 0.716 0.556 ... 0.224 0.003 0.261] [0.04 0.924 0.323 ... 0.118 0.003 0.162] ... [0.027 0.651 0.388 ... 0.141 0.001 0.161] [0.007 0.838 0.399 ... 0.2 0.002 0.313] [0.008 0.736 0.554 ... 0.241 0.002 0.182]]
二值数据(Binarize Data)是使用值将数据转化为二值,大于阈值设为1,小于阈值设置为0.这个过程叫做二分数据或阈值转换。在生成明确值或特征工程增加属性的时候使用,使用scikit-learn中的Binarizer类来实现。
1 #二值数据 2 from pandas import read_csv 3 from numpy import set_printoptions 4 from sklearn.preprocessing import Binarizer 5 6 filename='/home/aistudio/work/pima_data1.csv' 7 names=['preg','plas','pres','skin','test','mass','pedi','age','class'] 8 data=read_csv(filename,names=names) 9 #将数据分为输入数据和输出数据 10 array=data.values 11 x=array[:,0:8] 12 y=array[:,8] 13 transformer=Binarizer(threshold=0.0).fit(x) 14 #数据转换 15 newx=transformer.transform(x) 16 #设定数据的打印格式 17 set_printoptions(precision=3) 18 print(newx)
[[1. 1. 1. ... 1. 1. 1.] [1. 1. 1. ... 1. 1. 1.] [1. 1. 1. ... 1. 1. 1.] ... [1. 1. 1. ... 1. 1. 1.] [1. 1. 1. ... 1. 1. 1.] [1. 1. 1. ... 1. 1. 1.]]