• 关于使用sklearn进行数据预处理 —— 归一化/标准化/正则化


    转自:https://www.cnblogs.com/chaosimple/p/4153167.html

    一、标准化(Z-Score),或者去除均值和方差缩放

    公式为:(X-mean)/std  计算时对每个属性/每列分别进行。

    将数据按期属性(按列进行)减去其均值,并处以其方差。得到的结果是,对于每个属性/每列来说所有数据都聚集在0附近,方差为1。

    实现时,有两种不同的方式:

    • 使用sklearn.preprocessing.scale()函数,可以直接将给定数据进行标准化。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    >>> from sklearn import preprocessing
    >>> import numpy as np
    >>> X = np.array([[ 1., -1.,  2.],
    ...               [ 2.,  0.,  0.],
    ...               [ 0.,  1., -1.]])
    >>> X_scaled = preprocessing.scale(X)
     
    >>> 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.])
    • 使用sklearn.preprocessing.StandardScaler类,使用该类的好处在于可以保存训练集中的参数(均值、方差)直接使用其对象转换测试集数据。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    >>> scaler = preprocessing.StandardScaler().fit(X)
    >>> scaler
    StandardScaler(copy=True, with_mean=True, with_std=True)
     
    >>> scaler.mean_                                     
    array([ 1. ...,  0. ...,  0.33...])
     
    >>> scaler.std_                                      
    array([ 0.81...,  0.81...,  1.24...])
     
    >>> scaler.transform(X)                              
    array([[ 0.  ..., -1.22...,  1.33...],
           [ 1.22...,  0.  ..., -0.26...],
           [-1.22...,  1.22..., -1.06...]])
     
     
    >>>#可以直接使用训练集对测试集数据进行转换
    >>> scaler.transform([[-1.1., 0.]])               
    array([[-2.44...,  1.22..., -0.26...]])

    二、将属性缩放到一个指定范围

    除了上述介绍的方法之外,另一种常用的方法是将属性缩放到一个指定的最大和最小值(通常是1-0)之间,这可以通过preprocessing.MinMaxScaler类实现。

    使用这种方法的目的包括:

    1、对于方差非常小的属性可以增强其稳定性。

    2、维持稀疏矩阵中为0的条目。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    >>> 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]])
     
     
    >>> #缩放因子等属性
    >>> min_max_scaler.scale_                            
    array([ 0.5       0.5       0.33...])
     
    >>> min_max_scaler.min_                              
    array([ 0.        0.5       0.33...])

    当然,在构造类对象的时候也可以直接指定最大最小值的范围:feature_range=(min, max),此时应用的公式变为:

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

    X_scaled=X_std/(max-min)+min

     

    三、正则化(Normalization)

    正则化的过程是将每个样本缩放到单位范数(每个样本的范数为1),如果后面要使用如二次型(点积)或者其它核方法计算两个样本之间的相似性这个方法会很有用。

    Normalization主要思想是对每个样本计算其p-范数,然后对该样本中每个元素除以该范数,这样处理的结果是使得每个处理后样本的p-范数(l1-norm,l2-norm)等于1。

                 p-范数的计算公式:||X||p=(|x1|^p+|x2|^p+...+|xn|^p)^1/p

    该方法主要应用于文本分类和聚类中。例如,对于两个TF-IDF向量的l2-norm进行点积,就可以得到这两个向量的余弦相似性。

    1、可以使用preprocessing.normalize()函数对指定数据进行转换:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> 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...]])

    2、可以使用processing.Normalizer()类实现对训练集和测试集的拟合和转换:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    >>> 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.  ...]])

    补充:

  • 相关阅读:
    HDU 5642 King's Order 动态规划
    HDU 5640 King's Cake GCD
    HDU 5641 King's Phone 模拟
    HDU 5299 Circles Game 博弈论 暴力
    HDU 5294 Tricks Device 网络流 最短路
    HDU 5289 Assignment rmq
    HDU 5288 OO’s Sequence 水题
    星际争霸 虚空之遗 人族5BB 操作流程
    Codeforces Beta Round #3 D. Least Cost Bracket Sequence 优先队列
    Codeforces Beta Round #3 C. Tic-tac-toe 模拟题
  • 原文地址:https://www.cnblogs.com/Reallylzl/p/13391380.html
Copyright © 2020-2023  润新知