• 数据集特征预处理


    1、什么是特征预处理

    1.1、什么是特征预处理

    • scikit-learn的解释

    provides several common utility functions and transformer classes to change raw feature vectors into a representation that is more suitable for the downstream estimators.

    翻译过来:通过一些转换函数将特征数据转换成更加适合算法模型的特征数据过程

    可以通过下面那张图来理解
    在这里插入图片描述

    1.2、包含内容

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

    1.3、特征预处理API

    sklearn.preprocessing

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

    约会对象数据

    在这里插入图片描述
    我们需要用到一些方法进行无量纲化使不同规格的数据转换到同一规格

    2、归一化

    2.1、定义

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

    2.2、公式

    在这里插入图片描述

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

    那么怎么理解这个过程呢?我们通过一个例子
    在这里插入图片描述

    2.3、API

    • sklearn.preprocessing.MinMaxScaler (feature_range=(0,1)… )
      • MinMaxScalar.fit_transform(X)
        • X:numpy array格式的数据[n_samples,n_features]
      • 返回值:转换后的形状相同的array

    2.4、数据计算

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

    milage,Liters,Consumtime,target
    40920,8.326976,0.953952,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

    import pandas as pd
    from sklearn.preprocessing import MinMaxScaler
    
    
    def minmax_demo():
        """
        归一化演示
        :return: None
        """
        data = pd.read_csv("dating.txt")
        print(data)
        # 1、实例化一个转换器类
        transfer = MinMaxScaler(feature_range=(0, 1))
        # 2、调用fit_transform
        data = transfer.fit_transform(data[['milage','Liters','Consumtime']])
        print("最小值最大值归一化处理的结果:\n", data)
    
        return None
    
    
    if __name__ == '__main__':
        minmax_demo()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    结果:

    最小值最大值归一化处理的结果:
     [[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]]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

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

    • 归一化总结
      注意最大值最小值是变化的,另外,最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性较差(健壮性),只适合传统精确小数据场景。

    怎么办?

    3、标准化

    3.1、定义

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

    3.2、公式

    在这里插入图片描述

    • 作用于每一列,mean为平均值,σ为标准差
      所以回到刚才异常点的地方,我们再来看看标准化
      在这里插入图片描述
    • 对于归一化来说:如果出现异常点,影响了最大值和最小值,那么结果显然会发生改变
    • 对于标准化来说:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小。

    3.3、API

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

    3.4、数据计算

    import pandas as pd
    from sklearn.preprocessing import StandardScaler
    
    
    def stand_demo():
        """
        标准化演示
        :return: None
        """
        data = pd.read_csv("dating.txt")
        print(data)
        # 1、实例化一个转换器类
        transfer = StandardScaler()
        # 2、调用fit_transform
        data = transfer.fit_transform(data[['milage', 'Liters', 'Consumtime']])
        print("标准化的结果:\n", data)
        print("每一列特征的平均值:\n", transfer.mean_)
        print("每一列特征的方差:\n", transfer.var_)
    
        return None
    
    
    if __name__ == '__main__':
        stand_demo()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    结果:

    标准化的结果:
     [[ 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]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

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

  • 相关阅读:
    SpringBoot-SpringCache缓存
    flask框架初学-10-restful代码风格
    MySQL刷题的一些注意事项
    高忆管理:突破22万亿!五大保险巨头总资产创历史新高
    Gin框架中的Cookie怎么搞(会话控制)
    完整的 pixel 6a 刷入 AOSP 源码过程记录
    NumPy的实用函数整理之sliding_window_view
    阿里云幻兽帕鲁Linux 服务器下载游戏存档的方法
    算法通关村第六村-白银挑战树的层序遍历
    全局sass变量配置
  • 原文地址:https://blog.csdn.net/qq_42402817/article/details/133999085