• Python 学习笔记之——用 sklearn 对数据进行预处理


    1. 标准化

    标准化是为了让数据服从一个零均值和单位方差的标准正态分布。也即针对一个均值为 (mean) 标准差为 (std) 的向量 (X) 中的每个值 (x),有 (x_{scaled} = frac{x - mean}{std})

    >>> from sklearn import preprocessing
    >>> import numpy as np
    
    >>> X_train = np.array([[ 1., -1.,  2.],
    ...                     [ 2.,  0.,  0.],
    ...                     [ 0.,  1., -1.]])
    
    >>> X_scaled = preprocessing.scale(X_train)
    >>> X_scaled                                          
    array([[ 0.  ..., -1.22...,  1.33...],
           [ 1.22...,  0.  ..., -0.26...],
           [-1.22...,  1.22..., -1.06...]])
    
    >>> X_scaled.mean(axis=0)
    array([0., 0., 0.])
    
    >>> X_scaled.std(axis=0)
    array([1., 1., 1.])
    

    默认针对每列来进行标准化,也即针对每个特征进行标准化。可以通过设置 axis=1 来对每行进行标准化,也即对每个样本进行标准化。sklearn.preprocessing.scale()

    此外,我们还可以用训练数据的均值和方差来对测试数据进行相同的标准化处理。sklearn.preprocessing.StandardScaler()

    >>> scaler = preprocessing.StandardScaler().fit(X_train)
    >>> scaler
    StandardScaler(copy=True, with_mean=True, with_std=True)
    
    >>> scaler.mean_                                      
    array([1. ..., 0. ..., 0.33...])
    
    >>> scaler.scale_                                       
    array([0.81..., 0.81..., 1.24...])
    
    >>> scaler.transform(X_train)                           
    array([[ 0.  ..., -1.22...,  1.33...],
           [ 1.22...,  0.  ..., -0.26...],
           [-1.22...,  1.22..., -1.06...]])
    
    >>> X_test = [[-1., 1., 0.]] # 用同样的均值和方差来对测试数据进行标准化
    >>> scaler.transform(X_test)                
    array([[-2.44...,  1.22..., -0.26...]])
    

    2. 将数据缩放到一定范围

    有时候,我们需要数据处在给定的最大值和最小值范围之间,常常是 0 到 1 之间,这样数据的最大绝对值就被限制在了单位大小以内。

    >>> X_train = np.array([[ 1., -1.,  2.],
    ...                     [ 2.,  0.,  0.],
    ...                     [ 0.,  1., -1.]])
    ...
    >>> min_max_scaler = preprocessing.MinMaxScaler()
    >>> X_train_minmax = min_max_scaler.fit_transform(X_train)
    >>> X_train_minmax
    array([[0.5       , 0.        , 1.        ],
           [1.        , 0.5       , 0.33333333],
           [0.        , 1.        , 0.        ]])
    
    >>> X_test = np.array([[-3., -1.,  4.]]) # 将同样的变换应用到测试数据上
    >>> X_test_minmax = min_max_scaler.transform(X_test)
    >>> X_test_minmax
    array([[-1.5       ,  0.        ,  1.66666667]])
    

    当 MinMaxScaler() 传入一个参数 feature_range=(min, max),我们可以将数据缩放到我们想要的范围内。sklearn.preprocessing.MinMaxScaler()

    X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
    X_scaled = X_std * (max - min) + min
    

    此外,我们还可以将数据限制在 [-1, 1] 之间,通过除以每个特征的最大绝对值。sklearn.preprocessing.MaxAbsScaler()

    >>> X_train = np.array([[ 1., -1.,  2.],
    ...                     [ 2.,  0.,  0.],
    ...                     [ 0.,  1., -1.]])
    ...
    >>> max_abs_scaler = preprocessing.MaxAbsScaler()
    >>> X_train_maxabs = max_abs_scaler.fit_transform(X_train)
    >>> X_train_maxabs               
    array([[ 0.5, -1. ,  1. ],
           [ 1. ,  0. ,  0. ],
           [ 0. ,  1. , -0.5]])
    
    >>> X_test = np.array([[ -3., -1.,  4.]])
    >>> X_test_maxabs = max_abs_scaler.transform(X_test)
    >>> X_test_maxabs                 
    array([[-1.5, -1. ,  2. ]])
    >>> max_abs_scaler.scale_         
    array([2.,  1.,  2.])
    

    3. 归一化

    归一化的目的是让每个样本具有单位范数。也即针对向量 (X) 中的每个值 (x),有 (x_{normalized} = frac{x}{||X||})

    >>> X = [[ 1., -1.,  2.],
    ...      [ 2.,  0.,  0.],
    ...      [ 0.,  1., -1.]]
    >>> X_normalized = preprocessing.normalize(X, norm='l2')
    
    >>> X_normalized                                      
    array([[ 0.40..., -0.40...,  0.81...],
           [ 1.  ...,  0.  ...,  0.  ...],
           [ 0.  ...,  0.70..., -0.70...]])
    
    >>> normalizer = preprocessing.Normalizer().fit(X)  # fit does nothing
    >>> normalizer
    Normalizer(copy=True, norm='l2')
    
    >>> normalizer.transform(X)                            
    array([[ 0.40..., -0.40...,  0.81...],
           [ 1.  ...,  0.  ...,  0.  ...],
           [ 0.  ...,  0.70..., -0.70...]])
    
    >>> normalizer.transform([[-1.,  1., 0.]])             
    array([[-0.70...,  0.70...,  0.  ...]])
    

    默认是对每行数据用 (L2) 范数进行归一化,我们也可以选择 (L1) 范数或者针对每列进行归一化。sklearn.preprocessing.Normalizer()

    获取更多精彩,请关注「seniusen」!

  • 相关阅读:
    华为机试:字符串翻转
    华为机试:数字颠倒
    华为机试:字符个数统计
    华为机试:提取不重复的整数
    华为机试:取近视值
    华为机试:进制转换
    华为机试:字符串分隔
    华为机试:明明的随机数
    华为机试:字符串最后一个单词的长度
    网易:相反数
  • 原文地址:https://www.cnblogs.com/seniusen/p/10017584.html
Copyright © 2020-2023  润新知