MachineLearning入门-9(数据准备)

特诊选择是困难耗时的,也需要对需求的理解和专业知识的掌握。在机器学习的应用开发中,最基础的是特征工程。(吴恩达)

数据预处理需要根据数据本身的特征进行,有不同的格式和不同的要求,有缺失的值要填,有无效的数据要剔除,有冗余维的要选,这些步骤都和数据本身的特性紧密相关。数据预处理大致分为三个步骤:数据准备、数据转换、数据输出。

数据处理是系统工程的基本环节,也是提高算法准确度的有效手段。

接下来介绍几种数据转换方法:

  • 调整数据尺度(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.]]

原文地址:https://www.cnblogs.com/yuzaihuan/p/12296324.html