zoukankan      html  css  js  c++  java
  • 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.]]

  • 相关阅读:
    [转]TOP 1比不加TOP慢的疑惑
    .ETL构建数据仓库五步法
    MySQL与Oracle的语法区别
    MySQL的表分区
    ORACLE分区表的使用和管理
    Oracle与MySQL的几点区别
    数据仓库超级大表分区方式改变
    Windows平台下MySQL常用操作与命令
    PowerDesigner使用教程 —— 概念数据模型
    MYSQL千万级数据量的优化方法积累
  • 原文地址:https://www.cnblogs.com/yuzaihuan/p/12296324.html
Copyright © 2011-2022 走看看