博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python 学习笔记之——用 sklearn 对数据进行预处理
阅读量:7153 次
发布时间:2019-06-29

本文共 3460 字,大约阅读时间需要 11 分钟。

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 来对每行进行标准化,也即对每个样本进行标准化。

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

>>> scaler = preprocessing.StandardScaler().fit(X_train)>>> scalerStandardScaler(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_minmaxarray([[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_minmaxarray([[-1.5       ,  0.        ,  1.66666667]])复制代码

当 MinMaxScaler() 传入一个参数 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复制代码

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

>>> 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>>> normalizerNormalizer(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 范数或者针对每列进行归一化。

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

转载地址:http://yylgl.baihongyu.com/

你可能感兴趣的文章
VB.NET 指针
查看>>
有关@NgModule装饰器巩固
查看>>
配置webpack.config.js中的文件
查看>>
VS2012编译log4cpp1.1.1版本
查看>>
linux下安装jdk
查看>>
GoF 23种设计模式概述
查看>>
WebADI_配置设定5_设定下载WebADI Importer
查看>>
PLSQL_基础系列02_分组函数GROUP BY / ROLLUP / CUBE(案例)
查看>>
mysql::创建多个表空间添加记录数据会添加到哪个表空间中?
查看>>
js字符串方法
查看>>
孤岛营救问题 (BFS+状压)
查看>>
C++ 中的prioriy_queue 优先级队列 转
查看>>
统计学习方法 李航---第5章 决策树
查看>>
java中绘图-----那个鼠标等的监听我还是不太会,,好苦恼啊。不知道这些监听事件是怎么区分的...
查看>>
java从键盘输入若干数,求其最大值,最小值,平均值。等等
查看>>
volatile
查看>>
Ali流量控制中间件Sentinel
查看>>
微信小程序里多出来的奇怪宽度
查看>>
Babel 命令基础
查看>>
Java中的static关键字解析
查看>>