sklearn进行归一化
Posted dearl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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...]])
以上是关于sklearn进行归一化的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 sklearn 对具有多个特征的时间序列数据进行归一化?
如何在 sklearn Logistic Regression 的 one-vs-rest 方案中对概率进行归一化?