Advertisement

2.4 特征预处理--归一化&标准化

阅读量:

文章目录

    • 什么是特征预处理

      • 1. 包含内容
      • 2. 特征预处理API
    • 2.4.1 归一化

      • 1. 定义
      • 2. 公式
      • 3. API
      • 4. 数据计算
      • 5. 归一化总结
    • 2.4.3 标准化

      • 1. 定义
      • 2. 公式
      • API
      • 数据计算
      • 标准化总结
  • 目标
    o 了解数据型数据、类别型数据特点
    o应用
    什么是预处理?
    在这里插入图片描述

什么是特征预处理

sklearn官网的解释:通过一些转换函数 将特征数据转换成更加适合算法模型 的特征数据过程

1. 包含内容

  • 数值型数据的无量纲化
    • 归一化
    • 标准化

2. 特征预处理API

sklearn.preprocessing

为什么我们要进行归一化/标准化?
特征的单位或者大小相差较大或者某特征的方差相比其他的特征要大出几个数量级,容易影响(支配)目标结果 ,使得一些算法无法学习到其他的特征

约会对象数据
相亲约会对象数据:这个的样本是男士的数据,三个特征,玩游戏所消耗时间的百分比、每年获得的飞行常客里程碑、每周消耗的冰淇淋公升数。然后有一个所属类别,被女士评价的三个类型,不喜欢didnt、魅力一般small、极具魅力largr

也许也就是说飞行里程数对于结果或者说相亲结果影响不大,但是统计的人觉得这三个特征同等重要
在这里插入图片描述
如果要计算上述图片红色的两个男士数据的特征是否接近:
\sqrt[]{ (72993-35948) ^ 2+ (10.14-6.83)^ 2 + (1.03-1.21) ^ 2 }
可以很明显看出最后的结果主要是取决于里程数,如果不进行归一化或标准化就会导致,我没无法学习到除了里程数以外的学习特征,但是设定是三个特征同等重要,所以需要用到一些方法进行无量纲化使不同规模的数据转换到同一规格

2.4.1 归一化

1. 定义

通过对原始数据进行变换把数据映射到(默认为[0,1])之间

2. 公式

X'= \frac{x-min}{max-min} X''=X'*(mx-mi)+mi

作用每一列,max为一列的最大值,min为一列的最小值,那么X^n为最终结果,mx,mi分别为指定区间默认mx为1,mi为0

那么怎么解释这个过程呢?举个例子:
在这里插入图片描述
eg: 对于第一列第3个数据,X'=\frac{75-60}{90-60}=0.5 X''=0.5*1+0=0.5

3. API

sklearn.prerocessing.MinMaxScaler(feature_range=(0,1)…)

  • MinMaxScaler.fit_transform(X)
    o X:numpy array格式的数据[n_samples,n_features]

  • 返回值:转换后的形状相同的array

4. 数据计算

我们对一下数据进行运算,在dating.txt中。保存的就是之前的约会对象数据

复制代码
    milage,liters,Consumtime,target
    40902,8.326976,0.953953,3
    14488,7.153469,1.673904,2
    26052,1.441871,0,805124,1
    75136,13.147394,0.428964,1
    38344,1.669788,0.134296,1
    ……
  • 分析

    1. 获取数据
    2. 实例化MinMaxScaler
    3. 通过fit_transform转换
复制代码
    import pandas as pd
    from sklearn.preprocessing import MinMaxScaler
    
    # 1.获取数据
    data = pd.read_csv("dating.txt")
    print("data:\n", data)

打开dating.txt的输出结果
在这里插入图片描述

复制代码
    data:
      milage     Liters  Consumtime  target
    0     40920   8.326976    0.953952       3
    1     14488   7.153469    1.673904       2
    2     26052   1.441871    0.805124       1
    3     75136  13.147394    0.428964       1
    4     38344   1.669788    0.134296       1
    ..      ...        ...         ...     ...
    995   11145   3.410627    0.631838       2
    996   68846   9.974715    0.669787       1
    997   26575  10.650102    0.866627       3
    998   48111   9.134528    0.728045       3
    999   43757   7.882601    1.332446       3
    
    [1000 rows x 4 columns]

例如本题数据归一化不需要target列,所以我们可以只选取前三列

复制代码
    # 只要前三列
    data = data.iloc[:,:3]
    print("data:\n",data)

输出结果:

复制代码
    data:
      milage     Liters  Consumtime
    0     40920   8.326976    0.953952
    1     14488   7.153469    1.673904
    2     26052   1.441871    0.805124
    3     75136  13.147394    0.428964
    4     38344   1.669788    0.134296
    ..      ...        ...         ...
    995   11145   3.410627    0.631838
    996   68846   9.974715    0.669787
    997   26575  10.650102    0.866627
    998   48111   9.134528    0.728045
    999   43757   7.882601    1.332446
    
    [1000 rows x 3 columns]
复制代码
    # 2.实例化一个转换器
    # 默认区间[0,1]
    transfer = MinMaxScaler()
    
    # 3.调用fit_transform
    data_new=transfer.fit_transform(data)
    print("data_new\n",data_new)

输出结果:

复制代码
    data_new
     [[0.44832535 0.39805139 0.56233353]
     [0.15873259 0.34195467 0.98724416]
     [0.28542943 0.06892523 0.47449629]
     ...
     [0.29115949 0.50910294 0.51079493]
     [0.52711097 0.43665451 0.4290048 ]
     [0.47940793 0.3768091  0.78571804]]
复制代码
    # 尝试其他区间范围
    transfer = MinMaxScaler(feature_range=[2,3])
    data_new=transfer.fit_transform(data)
    print("data_new\n",data_new)

输出结果:

复制代码
    data_new
     [[2.44832535 2.39805139 2.56233353]
     [2.15873259 2.34195467 2.98724416]
     [2.28542943 2.06892523 2.47449629]
     ...
     [2.29115949 2.50910294 2.51079493]
     [2.52711097 2.43665451 2.4290048 ]
     [2.47940793 2.3768091  2.78571804]]

问题(归一化的缺点):如果数据中异常点较多,会有什么影响?
在这里插入图片描述

5. 归一化总结

如果有异常值(最大值或者最小值 ),进行公式计算时:
X'= \frac{x-min}{max-min} X''=X'*(mx-mi)+mi
会导致公式的结果不准确,这种方法鲁棒性较差,只适合传统精确小数据场景

2.4.3 标准化

1. 定义

通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内

2. 公式

X'= \frac{x-mean}{σ}
作用于每列,mean为平均值,σ为标准差(集中程度)

所以回到刚才异常点的地方,我们再来看看标准化
在这里插入图片描述

  • 对于归一化来说:如果出现异常点,影响了最大值和最小值,那么结果显然会发生变化
  • 对于标准化来说:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小

API

  • sklearn.preprocessing.StandardScaler()
    o 处理之后,对每列来说,所有数据都聚集在均值为0附近,标准差为1
    o StandardScaler.fit_transform(X)
    X:numpy array格式的数据[n_samples,n_features]
    o 返回值:转换后的形状相同的array

数据计算

同样对上面的数据进行处理

  • 分析
  1. 实例化StandardScaler
  2. 通过fit_transform转换
复制代码
    from sklearn.preprocessing import StandardScaler
    data = pd.read_csv("dating.txt")
    data = data.iloc[:,:3]
    
    transfer = StandardScaler()
    data_new=transfer.fit_transform(data[['milage','Liters','Consumtime']])
    print("标准化结果\n",data_new)
    print("每一列特征的平均值\n",transfer.mean_)
    print("每一列特征的方差\n",transfer.var_)

输出结果:

复制代码
    标准化结果
     [[ 0.33193158  0.41660188  0.24523407]
     [-0.87247784  0.13992897  1.69385734]
     [-0.34554872 -1.20667094 -0.05422437]
     ...
     [-0.32171752  0.96431572  0.06952649]
     [ 0.65959911  0.60699509 -0.20931587]
     [ 0.46120328  0.31183342  1.00680598]]
    每一列特征的平均值
     [3.36354210e+04 6.55996083e+00 8.32072997e-01]
    每一列特征的方差
     [4.81628039e+08 1.79902874e+01 2.46999554e-01]

标准化总结

在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景

全部评论 (0)

还没有任何评论哟~