zoukankan      html  css  js  c++  java
  • 数据预处理

    0 - 引入

      一般通过特征提取或者数据集给出的特征,可能都有如下问题:

    1. 不属于同一个量纲:即不同特征可能由于单位不一致或者分布区间不一致而导致数值上的差异,所以不能直接放在一起进行比较;
    2. 特征信息存在冗余:有可能不同特征实质上描述的是同一个我们想关注的特征,因此对于特定问题可能存在多余的特征;
    3. 定性特征不能直接使用:定性特征最直观的理解就是数据集中用字符串表示的特征(当然这只是一种片面的理解),所以需要将其转换成定量特征进行描述,one-hot编码是一种常用的方法;
    4. 存在缺失值:有可能某些特征的某些个体存在缺失的记录,这时候需要通过分析选择进补全或者舍弃;
    5. 信息利用率低:其实对于不同任务不同模型,特征的选择应该是不同的,换句话说,对于特征的利用程度是不同的,所以可以通过人工筛选、one-hot编码或者定量变量多项式化来提高特征的利用率。

      由于存在上述问题,因此在我们设计算法和模型之前,我们需要相对数据进行预处理,下面通过sklearn中的preprocessing模块并基于iris数据集来介绍不同的数据预处理。

      导入iris数据集。

    from sklearn.datasets import load_iris
    iris = load_iris()

    1 - sklearn方法查询表

      下面给出preprocessing中对应不同数据预处理过程的方法,以便于查询,具体的使用后面部分将详细展开

    类   功能 说明
    StandardScaler 无量纲化 标准化,基于特征矩阵的列,将特征值转换至服从标准正态分布
    MinMaxScaler 无量纲化 区间缩放,基于最大最小值,将特征值转换到[0, 1]区间上
    Normalizer 归一化 基于特征矩阵的行,将样本向量转换为“单位向量”
    Binarizer 二值化 基于给定阈值,将定量特征按阈值划分
    OneHotEncoder 哑编码 将定性数据编码为定量数据
    Imputer 缺失值计算 计算缺失值,缺失值可填充为均值等
    PolynomialFeatures 多项式数据转换 多项式数据转换
    FunctionTransformer 自定义单变元函数转换 使用单变元的函数来转换数据

    2 - 无量纲化

    2.1 - 标准化

      标准化的公式为$x^{'}=frac{x-ar{X}}{S}$,代码如下:

    from sklearn.preprocessing import StandardScaler
    
    StandardScaler().fit_transform(iris.data)

    2.2 - 区间放缩

      区间放缩的公式为$x^{'}=frac{x-x_{min}}{x_{max}-x_{min}}$,代码如下:

    from sklearn.preprocessing import MinMaxScaler
    
    MinMaxScaler().fit_transform(iris.data)

    3 - 归一化

      无量纲化是依据特征矩阵的列来处理数据,而归一化是依据特征矩阵的行来处理数据,其公式为$x^{'}=frac{x}{sqrt{sum^m_jx[j]^2}}$,代码如下:

    from sklearn.preprocessing import Normalizer
    
    Normalizer().fit_transform(iris.data)

    4 - 二值化

      设定一个阈值,大于阈值的赋值为1,小于等于阈值的赋值为0,其公式为

    $$x^{'}=left{egin{matrix}1,x>threshold\0,xleq thresholdend{matrix} ight.$$

      代码如下:

    from sklearn.preprocessing import Binarizer
    
    Binarizer(threshold=3).fit_transform(iris.data)

    5 - 哑编码

      假如有一个定性特征具有n个离散值,则可以将其编码为长度为n的向量,对于具有第i个离散值的特征,将向量的第i位置为1,其余置为0,代码如下:

    from sklearn.preprocessing import OneHotEncoder
    
    OneHotEncoder().fit_transform(iris.target.reshape((-1, 1)))

    6 - 缺失值计算

      由于IRIS数据集不存在缺失值,所以直接对数据集增加一个样本,4个特征之均赋值为nan,而后通过缺失值计算计算出这四个特征之,代码如下:

    from numpy import vstack, array, nan
    from sklearn.preprocessing import Imputer
    
    Imputer().fit_transform(vstack((array([nan, nan, nan, nan]), iris.data)))

    7 - 数据变换

      常见的数据变换有基于多项式的、基于指数函数的、基于对数函数的。对于IRIS数据集的4个特征,做度数为2的多项式转换公式如下:

    $$egin{matrix}(x^{'}_{1},x^{'}_{2},x^{'}_{3},x^{'}_{4},x^{'}_{5},x^{'}_{6},x^{'}_{7},x^{'}_{8},x^{'}_{9},x^{'}_{10},x^{'}_{11},x^{'}_{12},x^{'}_{13},x^{'}_{14},x^{'}_{15})\
    =(1,x_{1},x_{2},x_{3},x_{4},x^{2}_{1},x_{1}*x_{2},x_{1}*x_{3},x_{1}*x_{4},x^{2}_{2},x_{2}*x_{3},x_{2}*x_{4},x^{2}_{3},x_{3}*x_{4},x^{2}_{4})
    end{matrix}$$

      代码如下:

    from sklearn.preprocessing import PolynomialFeatures
    
    PolynomialFeatures().fit_transform(iris.data)

    8 - 值定义单变元函数转换

      可以通过基于单变元的数据变化来转换特征,代码如下:

    from numpy import log1p
    from sklearn.preprocessing import FunctionTransformer
    
    FunctionTransformer(log1p).fit_transform(iris.data)

    9 - 参考资料

    http://www.cnblogs.com/jasonfreak/p/5448385.html

  • 相关阅读:
    May 24th 2017 Week 21th Wednesday
    May 23rd 2017 Week 21st Tuesday
    全球顶尖大学的UX课程资源,英文!
    如何设计出一款出色的结账表单
    快速完成网页设计,10个顶尖响应式HTML5网页模板助你一臂之力
    界面设计中如何增强CTA按钮召唤力?
    10个实用的UX设计作品推销小窍门
    UX术语详解:任务流,用户流,流程图以及其它全新术语
    让你不再恋家的9款小众时尚的酒店网站设计
    聊聊原型设计中的团队管理功能
  • 原文地址:https://www.cnblogs.com/CZiFan/p/10767956.html
Copyright © 2011-2022 走看看