zoukankan      html  css  js  c++  java
  • sklearn进行归一化

      利用神经网络预测数据时,突然就被一个以前从来没想过的问题困扰了,训练集与测试集应该分别进行归一化还是合并为一个大的矩阵统一进行归一化?如果放在一起,测试集会参与到模型的训练当中,感觉不对。如果分开,怎么对测试集进行归一化呢?

      咨询老师,得到了答案,记录如下:

      用训练集归一化,并记录归一化需要用到的参数(如果是最大最小归一化,记录最大最小值,如果是z-score,则记录均值与方差),再利用训练集的属性对新来的测试集进行归一化。用训练集代替总体样本分布,这也是机器学习的基本假设。

      z-score归一化,公式为:(X-mean)/std  计算时对每个属性/每列分别进行。将数据按期属性(按列进行)减去其均值,并处以其方差。得到的结果是,对于每个属性/每列来说所有数据都聚集在0附近,方差为1。

      用sklearn进行可以使用以下两个接口:

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

    >>> 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.])
    

      (2)使用sklearn.preprocessing.StandardScaler类,使用该类的好处在于可以保存训练集中的参数(均值、方差)直接使用其对象转换测试集数据。正好解释了我一开始关于训练集、测试集归一化问题。

    >>> scaler = preprocessing.StandardScaler().fit(X)
    >>> scaler
    StandardScaler(copy=True, with_mean=True, with_std=True)
     
    >>> scaler.mean_                                     
    array([ 1. ...,  0. ...,  0.33...])
     
    >>> scaler.var_                                      
    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...]])
    

      注意:

      什么情况下(不)需要归一化?

    • 需要: 基于参数的模型或基于距离的模型,都是要进行特征的归一化。
    • 不需要:基于树的方法是不需要进行特征的归一化,例如随机森林,bagging 和 boosting等。
  • 相关阅读:
    BZOJ 1433 && Luogu P2055 [ZJOI2009]假期的宿舍 匈牙利算法
    BZOJ 1123 && Luogu P3469 [POI2008]BLO-Blockade 割点+乘法原理
    POJ3694 Network 边双缩点+LCA+并查集
    luogu P5142 区间方差 十分优美的线段树
    luogu P2709 小B的询问 最简单的莫队
    luogu P2731 骑马修栅栏 Riding the Fences
    TYVJ P2032 「Poetize9」升降梯上 spfa最短路
    51nod 1515 明辨是非 并查集+set维护相等与不等关系
    BZOJ 1260: [CQOI2007]涂色paint 区间DP
    luogu P4145 上帝造题的七分钟2 / 花神游历各国 维护区间和&&区间开根号
  • 原文地址:https://www.cnblogs.com/dearL/p/9532288.html
Copyright © 2011-2022 走看看