• 《机学二》特征工程2 ——数据特征预处理:数据缩放:归一化、标准化(重点常用)、缺失值处理


    上接:https://blog.csdn.net/u010132177/article/details/102911543

    概述

    1)概念

    特征预处理定义(作用):通过特定的统计方法(数学方法), 将数据转换成 算法要求的数据
    在这里插入图片描述
    在这里插入图片描述

    2)特征预处理的方法、种类

    1、数值型数据--标准缩放(1-2是重点):

    1. 归一化
    2. 标准化
    3. 缺失值

    2、类别型数据:one-hot编码
    3、时间类型:时间的切分

    3)sklearn特征处理API

    • sklearn. preprocessing

    一、特征预处理:归一化

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

    1) 归一公式:

    计算分2步:x'-x'':

    [x'=frac{x-min}{max-min} ]

    [x''=x'*(mx-mi)+mi ]

    • 注:作用于每一列,x为每一个值,max为一列的最大值,min为一列的最小值,
      X’’为最终结果,mx,mi分别为指定区间值(默认mx为1,mi为0)

    例:计算第1列每一个值的归一值:
    在这里插入图片描述
    解:
    【第1列,第1项】
    x'=90-60/90-60=1
    x''=1*(1-0)+0=1
    所以:(第1列,第1项)的归一值为1

    【第1列,第2项】
    x'=60-60/90-60=0
    x''=0*(1-0)+0=0
    所以(第1列,第2项)归一值:0
    ...

    2)sklearn归一化API

    sklearn归一化API:

    sklearn.preprocessing.MinMaxScaler
    

    MinMaxScaler语法

    1. MinMaxScalar(feature_range=(0,1)…)
      每个特征缩放到给定范围(默认[0,1])
    2. MinMaxScalar.fit_transform(X)
      X:numpy array格式的数据[n_samples,n_features]
      返回值:转换后的形状相同的array

    归一化步骤

    1、实例化MinMaxScalar
    2、通过fit_transform转换

    归一化sklearn代码例:

    对 [[90,2,10,40],[60,4,15,45],[75,3,13,46]] 进行归一化

    from sklearn.preprocessing import MinMaxScaler #引入支持
    
    def mm():
        """
        数值归一化处理
        :return: None
        """
        mm = MinMaxScaler(feature_range=(2, 3)) #默认转化成0-1间,此处改为2-3之间
        data = mm.fit_transform([[90,2,10,40],[60,4,15,45],[75,3,13,46]])
        print(data)
    
        return None
    
    if __name__=="__main__":
        mm()
        
    """结果:
    [[3.         2.         2.         2.        ]
     [2.         3.         3.         2.83333333]
     [2.5        2.5        2.6        3.        ]]
    """
    

    3)什么情况能用到归一化(为什么要归一化)案例解释

    】:相亲约会对象数据,这个样本时男士的数据,三个特征,玩游戏所消耗时间的百分比、每年获得的飞行常客里程数、每周消费的冰淇淋公升数。然后有一个 所属类别,被女士评价的三个类别,不喜欢didnt、魅力一般small、极具魅力large也许也就是说飞行里程数对于结算结果或者说相亲结果影响较大,但是统计的人觉得这三个特征同等重要。

    里程数  公升数     消耗时间比       评价
    14488  7.153469   1.673904   	smallDoses
    26052  1.441871   0.805124   	didntLike
    75136  13.147394  0.428964   	didntLike
    38344  1.669788   0.134296   	didntLike
    72993  10.141740  1.032955   	didntLike
    35948  6.830792   1.213192   	largeDoses
    42666  13.276369  0.543880   	largeDoses
    67497  8.631577   0.749278   	didntLike
    35483  12.273169  1.508053   	largeDoses
    50242  3.723498   0.831917   	didntLike
    

    计算】此数据在用 [ k近邻 ] 算法对数据进行分类时,红色2列计算为:
    (72993-35948) ^2 +(10.14-6.8) ^2 + (1.0-1.21)^2
    分析】可以看到,由于里程数非常大,因此它对数据权重会造成很大影响,所以需要用到归一化使其数值都在(0-1)间从而取消掉过大数值对最终结果造成影响
    目的】:让某一个特征过大时,对最终结果不不会造成非常大影响
    缺点】:如下图,一个不正常(错误)的数据,粉色异常点对最大值最小值影响太大在这里插入图片描述
    【应用场景】:注意在特定场景下最大值最小值是变化的,另外,最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性(即稳定性)较差,只适合传统精确小数据场景

    二、★特征处理:标准化(归一的改进)

    1)概述

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

    2)标准化公式

    [x'=frac{x-mean}{δ} ]

    • 注:标准差,作用于每一列,mean为平均值,δ为标准差(考量数据的稳定性)

      标准差算法:$$ δ=sqrt{var} $$

      方差算法(var即 variance即):$$var=frac{(x1- mean)^{2}+(x2- mean)^{2}+...}{n(每个特征的样本数)}$$

      方差考量数据稳定性

    3)计算标准差示例:

    在这里插入图片描述
    解:
    (第一列,第一个)
    mean=(90+60+75)/3=75

    [var=frac{(90-75)^{2}+(60-75)^{2}+(75-75)^{2}}{3} ]

    [δ=sqrt{var} ]

    x'=90-75/ δ
    ...
    【解析】作用:如果有异常点,对整体影响不大

    4)结合归一化来谈标准化

    在这里插入图片描述
    【对于归一化来说】:如果出现异常点,影响了最大值和最小值,那么结果显然会发生改变

    【对于标准化来说】:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小。+

    5)sklearn特征化API

    sklearn特征化APIscikit-learn.preprocessing.StandardScaler
    Standard Scaler:标准 定标器

    StandardScaler语法:

    1. StandardScaler(…)
      处理之后每列来说所有数据都聚集在均值0附近标准差为1

    2. StandardScaler.fit_transform(X,y)
      X:numpy array格式的数据[n_samples,n_features]
      返回值:转换后的形状相同的array

    3. StandardScaler.mean_
      原始数据中每列特征的平均值

    4. StandardScaler.std_
      原始数据每列特征的方差

    代码示例

    标准化步骤:
    1、实例化StandardScaler
    2、通过fit_transform转换
    【标准化总结】:在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。

    from sklearn.preprocessing import StandardScaler
    
    def stand():
        """
        标准化缩放
        :return:
        """
        std = StandardScaler()
        data = std.fit_transform([[ 1., -1., 3.],[ 2., 4., 2.],[ 4., 6., -1.]])
        print(data)
    
        return None
    
    if __name__=="__main__":
        stand()
    
    """结果:
    [[-1.06904497 -1.35873244  0.98058068]
     [-0.26726124  0.33968311  0.39223227]
     [ 1.33630621  1.01904933 -1.37281295]]
     ----------
     每一列相加==0
    """
    

    三、缺失值处理

    1)概述

    缺失值主要处理工具:在pandas中即可

    缺失值处理2种方法:

    1. 删除:如果每列或者行数据缺失值达到一定的比例,建议放弃整行或者整列
    2. 插补:可以通过缺失值每行或者每列的平均值、中位数来填充

    2) 缺失值处理sklearn的API: preprocessing.Imputer

    API:sklearn.preprocessing.Imputer

    2.1Imputer语法:

    1. Imputer(missing_values='NaN', strategy='mean', axis=0)
      完成缺失值插补
    2. Imputer.fit_transform(X,y)
      X:numpy array格式的数据[n_samples,n_features]
      返回值:转换后的形状相同的array

    2.2缺失值处理步骤:

    1. 初始化Imputer,指定”缺失值”,指定填补策略,指定行或列
      注:缺失值也可以是别的指定要替换的值
    2. 调用fit_transform

    2.3关于np.nan(np.NaN)

    数据当中的缺失值类型需要是:np.nan

    1. numpy的数组中可以使用np.nan/np.NaN来代替缺失值,属于float类型
    2. 如果是文件中的一些缺失值,可以替换成nan,通过np.array转化成float型的数组即可

    2.4pandas处理缺失值

    • pandas:dropna
    • fillna
    • replace(“?”, np.nan)

    2.5缺失值处理示例:

    处理缺失值:[[1, 2], [np.nan, 3], [7, 6]]

    from sklearn.preprocessing import Imputer
    import numpy as np
    
    def im():
        """
        缺失值处理
        :return:NOne
        """
        # NaN, nan axis=0表示列,1表示行
        im = Imputer(missing_values='NaN', strategy='mean', axis=0)
        data = im.fit_transform([[1, 2], [np.nan, 3], [7, 6]])
        print(data)
    
        return None
    
    if __name__=="__main__":
        im()
    """结果:
    [[1. 2.]
     [4. 3.]
     [7. 6.]]
    """
    
  • 相关阅读:
    IndexDB
    实现es6中的set和map
    视口viewport
    nginx入门
    http协议
    图像格式
    promise
    js中this指向
    CSS 7阶层叠水平
    C# 一个方法如何返回多个值
  • 原文地址:https://www.cnblogs.com/chenxi188/p/11940166.html
Copyright © 2020-2023  润新知