一、standardization

之所以标准化的原因是,如果数据集中的某个特征的取值不服从标准的正太分布,则性能就会变得很差

①函数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)
print(X_scaled)
"""
[ 1.22474487 0. -0.26726124]
[-1.22474487 1.22474487 -1.06904497]]
"""
#尺度调整之后的数据有0均值和淡乏味方差(==1)
print(X_scaled.mean(axis=0))
#[ 0. 0. 0.]
print(X_scaled.std(axis=0))
#[ 1. 1. 1.]

②Preprocessing还提供了一个类StandarScaler,该类实现了变换器的API用于计算训练数据集的均值和标准差,然后将均值与标准差用到对测试数据集的变换操作中去,所以这个标准化过程应该被应用到Pipeline的早起阶段

scaler=preprocessing.StandardScaler().fit(X)
print(scaler)
#StandardScaler(copy=True, with_mean=True, with_std=True)
print(scaler.mean_)
#[ 1. 0. 0.33333333]
print(scaler.scale_)
#[ 0.81649658 0.81649658 1.24721913]
print(scaler.transform(X))
"""
[[ 0. -1.22474487 1.33630621]
[ 1.22474487 0. -0.26726124]
[-1.22474487 1.22474487 -1.06904497]]
"""

在上面的代码在,scalar实例已经训练完毕,就可以用来对新的数据执行在训练集上同样的变换操作

print(scaler.transform([[-1,1,0]]))

#[[-2.44948974  1.22474487 -0.26726124]]

③将特征变换到指定范围内,

可以把特征的取值设置到最小值和最大值之间,通常是【0,1】区间或每个特征分量的最大绝对值被缩放为单位值,这样的特征变换可以使用MinMaxScaler 或 MaxAbsScaler

这些变换的作用主要是为那些变动范围特别小的 特征分量添加一定的鲁棒性,并且可以防止zero entries in sparse data

min_max_scaler=preprocessing.MinMaxScaler()
X_train_minmax=min_max_scaler.fit_transform(X)
print(X_train_minmax)
"""
[[ 0.5 0. 1. ]
[ 1. 0.5 0.33333333]
[ 0. 1. 0. ]]
"""

上面的X上训练好的MinMaxScaler就可以通过transform函数被用到新的数据上:同样的缩放和评议操作被用到测试数据集

X_test=np.array([[-3,-1,4]])
X_test_minmax=min_max_scaler.transform(X_test)
print(X_test_minmax)
#[[-1.5 0. 1.66666667]]
print(min_max_scaler.scale_)
#[ 0.5         0.5         0.33333333]
print(min_max_scaler.min_)
#[ 0.          0.5         0.33333333]

④Scaling features to a range

max_abs_scaler=preprocessing.MaxAbsScaler()
X_train_maxabs=max_abs_scaler.fit_transform(X)
print(X_train_maxabs)
"""
[[ 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)
print(X_test_maxabs)
#[[-1.5 -1. 2. ]]
print(max_abs_scaler.scale_)
#[ 2. 1. 2.]

⑤缩放稀疏矩阵

⑥Scaling data with outliers

 二、normalization

函数normalize提供了快速简单的方法,使用L1或L2范数执行规范化操作是:

from sklearn import preprocessing
x=[[1,-1,2],
[2,0,0],
[0,1,-1]]
x_normalized=preprocessing.normalize(x,norm="l2")
print(x_normalized)
"""
按行操作,把每一行变成单位长度!!
[[ 0.40824829 -0.40824829 0.81649658]
[ 1. 0. 0. ]
[ 0. 0.70710678 -0.70710678]] """

规范化操作类Normalizer作为数据预处理步骤,应该用在sklearn.pipeline.Pipeline

normalizer=preprocessing.Normalizer().fit(x)
print(normalizer)
#Normalizer(copy=True, norm='l2')
print(normalizer.transform(x))
"""
[[ 0.40824829 -0.40824829 0.81649658]
[ 1. 0. 0. ]
[ 0. 0.70710678 -0.70710678]]
"""
print(normalizer.transform([[1,1,0]]))
#[[ 0.70710678 0.70710678 0. ]]

三、二值化

Feat binarization:将数值型特征取值阈值化转变为布尔形特征取值,这一过程主要是概率型的学习器提供数据预处理机制

binarizer=preprocessing.Binarizer().fit(x)
print(binarizer)
#Binarizer(copy=True, threshold=0.0)
print(binarizer.transform(x))
"""
[[1 0 1]
[1 0 0]
[0 1 0]]
"""

还可以通过参数指定binarizer对象实例的阈值

四、离散化

有些情况下,某些特征的取值不是连续的数值,而是离散的标称变量

比如一个人的特征描述取值有以下几种:

"male","female" "Europe","US","Asia" "Firefox","chrome","Safari","IE"

这样的特征可以被有效的编码为整型特征值。样本实例:["Europe","US","Asia"]对于为[0,1,3],["chrome","Safari","IE"]对应于[1,2,1]

但是上面的这些整数型的特征向量是无法直接被sklearn的学习器使用的,因为学习器希望输入的是连续变化的量或者可以比较大小的量,但是上述特征向量里边的数字大小的比较是没有任何意义的

一种变换标称型特征的方法是使用one-of-K或者叫one-hot encoding,在类OneHotEncoder里面就已实现,这个编码器将每个标称型特征编码成一个m维二值特征,其中每一个样本特征向量就只有一个位置是1,其余位置全是0.

from sklearn import preprocessing
enc=preprocessing.OneHotEncoder()
enc.fit([[0,0,3],[1,1,0],[0,2,1],[1,0,2]])
print(enc)
"""
OneHotEncoder(categorical_features='all', dtype=<class 'numpy.float64'>,
handle_unknown='error', n_values='auto', sparse=True)
"""
print(enc.transform([[0,1,3]]).toarray())
#[[ 1. 0. 0. 1. 0. 0. 0. 0. 1.]]

默认情况下,每个特征分量需要多少个值是从数据集自动推断出来的,我们还可以通过参数n_values进行显式的指定,上面的数据集中,有两种性别,三个可能的地方以及四个浏览器,然后we fit the estimator,再对每一个样本进行变换,结果里面,前两个值编码了性别,接下来的三个值编码了地方,最后的四个编码了浏览器。

注意:如果训练数据集中某个标称型分量的取值没有完全覆盖其所有可能的情况,则必须给OneHotEncoder指定每个标称型特征分量的取值个数,设置参数:n_values

enc=preprocessing.OneHotEncoder(n_values=[2,3,4])
enc.fit([[1,2,3],[0,2,0]])
print(enc)
"""
OneHotEncoder(categorical_features='all', dtype=<class 'numpy.float64'>,
handle_unknown='error', n_values=[2, 3, 4], sparse=True)
"""
print(enc.transform([[1,0,0]]).toarray())
#[[ 0. 1. 1. 0. 0. 1. 0. 0. 0.]]

五、缺失值补充

一种方法是直接丢掉包含缺失值的整行或整列,然而这样可能丢失很多有价值的数据

另一种方法是从已知的部分数据中推断出未知的数据

Imputer Class提供了补全缺失值的基本策略:使用一行或一列的均值,中值,出现次数最多的值,该类也允许不同缺失值的编码。

下面的例子展示了如何替代缺失值,缺失值编码为np.nan:策略是使用包含缺失值的列均值来替代

#用中值来补充缺失值
import numpy as np
from sklearn.preprocessing import Imputer
imp=Imputer(missing_values="NaN",strategy="mean",axis=0)
print(imp.fit([[1,2],[np.nan,3],[7,6]]))
"""
Imputer(axis=0, copy=True, missing_values='NaN', strategy='mean', verbose=0)
"""
x=[[np.nan,2],[6,np.nan],[7,6]]
print(imp.transform(x))
"""
[[ 4. 2. ]
[ 6. 3.66666667]
[ 7. 6. ]]
"""

Inputer 类支持稀疏矩阵

import scipy.sparse as sp
X=sp.csc_matrix([[1,2],[0,3],[7,6]])
imp=Imputer(missing_values=0,strategy='mean',axis=0)
print(imp.fit(X))
"""
Imputer(axis=0, copy=True, missing_values=0, strategy='mean', verbose=0)
"""
X_test=sp.csc_matrix([[0,2],[6,0],[7,6]])
print(imp.transform(X_test))
"""
[[ 4. 2. ]
[ 6. 3.66666667]
[ 7. 6. ]]
"""

六、产生多项式特征

为输入数据添加非线性特征可以增加模型的复杂度,实现这一点的常用的简单方法是使用多项式特征,他可以引入特征的高阶项和互乘积项。

Sklearn的类PolynomialFeatures可以用来在输入数据的基础上构造多项式特征

转化前的特征为(X1,X2),转化后的特征为(1,X1,X2,X1X1,X1X2,X2X2

#引入特征的高阶项和互乘积项
import numpy as np
from sklearn.preprocessing import PolynomialFeatures
X=np.arange(6).reshape(3,2)
print(X)
"""
[[0 1]
[2 3]
[4 5]]
"""
poly=PolynomialFeatures(2)
print(poly.fit_transform(X))
"""
[[ 1. 0. 1. 0. 0. 1.]
[ 1. 2. 3. 4. 6. 9.]
[ 1. 4. 5. 16. 20. 25.]]
"""

有些情况下,我们只想要原始特征分量之间的互乘积项,这时可以设置参数做到:interaction_only=True

#只想要原始特征分量之间的互乘积项

X=np.arange(9).reshape(3,3)
print(X)
"""
[[0 1 2]
[3 4 5]
[6 7 8]]
"""
poly=PolynomialFeatures(degree=3,interaction_only=True)
print(poly.fit_transform(X))
"""
[[ 1. 0. 1. 2. 0. 0. 2. 0.]
[ 1. 3. 4. 5. 12. 15. 20. 60.]
[ 1. 6. 7. 8. 42. 48. 56. 336.]]
"""

转化前的特征为(X1,X2,X3),转化后的特征为(1,X1,X2,X3,X1X2,X1X3,X2X3,X1X2X3

七、利用已有的函数自定义transformer

借助于FunctionTransformer类,可以从任意的Python函数实现一个transformer,比如,构造一个transformer实现对数变换

#构造一个transformer实现对数变换
import numpy as np
from sklearn.preprocessing import FunctionTransformer
transformer=FunctionTransformer(np.log1p)
X=np.array([[0,1],[2,3]])
print(transformer.transform(X))
"""
[[ 0. 0.69314718]
[ 1.09861229 1.38629436]] """

sklearn数据预处理的更多相关文章

  1. sklearn数据预处理-scale

    对数据按列属性进行scale处理后,每列的数据均值变成0,标准差变为1.可通过下面的例子加深理解: from sklearn import preprocessing import numpy as ...

  2. sklearn 数据预处理1: StandardScaler

    作用:去均值和方差归一化.且是针对每一个特征维度来做的,而不是针对样本. [注:] 并不是所有的标准化都能给estimator带来好处. “Standardization of a dataset i ...

  3. 数据预处理及sklearn方法实现

    1.标准化(中心化) 在许多机器学习执行前,需要对数据集进行标准化处理.因为很对算法假设数据的特征服从标准正态分布.所以如果不对数据标准化,那么算法的效果会很差. 例如,在学习算法的目标函数,都假设数 ...

  4. 使用sklearn进行数据挖掘-房价预测(4)—数据预处理

    在使用机器算法之前,我们先把数据做下预处理,先把特征和标签拆分出来 housing = strat_train_set.drop("median_house_value",axis ...

  5. 【sklearn】数据预处理 sklearn.preprocessing

    数据预处理 标准化 (Standardization) 规范化(Normalization) 二值化 分类特征编码 推定缺失数据 生成多项式特征 定制转换器 1. 标准化Standardization ...

  6. sklearn学习笔记(一)——数据预处理 sklearn.preprocessing

    https://blog.csdn.net/zhangyang10d/article/details/53418227 数据预处理 sklearn.preprocessing 标准化 (Standar ...

  7. 文本数据预处理:sklearn 中 CountVectorizer、TfidfTransformer 和 TfidfVectorizer

    文本数据预处理的第一步通常是进行分词,分词后会进行向量化的操作.在介绍向量化之前,我们先来了解下词袋模型. 1.词袋模型(Bag of words,简称 BoW ) 词袋模型假设我们不考虑文本中词与词 ...

  8. 【Sklearn系列】使用Sklearn进行数据预处理

    这篇文章主要讲解使用Sklearn进行数据预处理,我们使用Kaggle中泰坦尼克号事件的数据作为样本. 读取数据并创建数据表格,查看数据相关信息 import pandas as pd import ...

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

    一.标准化(Z-Score),或者去除均值和方差缩放 公式为:(X-mean)/std  计算时对每个属性/每列分别进行. 将数据按期属性(按列进行)减去其均值,并处以其方差.得到的结果是,对于每个属 ...

随机推荐

  1. 怎样使用ZOL一键安装器下载中关村在线的源安装包

    怎样使用ZOL一键安装器下载中关村在线的源安装包 马根峰               (广东联合电子服务股份有限公司, 广州 510300) 摘要    中关村在线近期開始推出ZOL一键安装器,用户直 ...

  2. boost python3依赖安装

    之前写过python dlib依赖的安装,当时是使用了系统默认的python2.7安装的boost.Python,如果自己编译好python3,想安装支持python3的boost.Python也是可 ...

  3. 从入门到精通Puppet的实践之路

    本文有感于<精通Puppet配置管理工具>在豆瓣上的某些差评而顺手写的书评. 半路出家   故事要从12年初说起.  某天,部门老大让我所在team的老大调研一下当下业界的配置管理工具.于 ...

  4. Android性能优化-减小图片下载大小

    原文链接 https://developer.android.com/topic/performance/network-xfer.html 内容概要 理解图片的格式 PNG JPG WebP 如何选 ...

  5. 微软BI 之SSIS 系列 - 对于平面文件中 NULL 值处理过程中容易极易混淆的几个细节

    开篇介绍 最近有人问我有关文件处理中空值处理的相关问题: OLE DB Destination 中的 Keep Nulls 如何控制 NULL 值的显示? 为什么选中了 Keep Nulls 但是数据 ...

  6. windows性能监控

    see also:http://www.cnblogs.com/upDOoGIS/archive/2010/11/19/1881970.html CPU Processor : % Processor ...

  7. PL/SQL学习笔记之函数

    一:函数 函数与过程的最大不同就是,函数有返回值.适用于需要返回结果的场景. 二:创建函数 CREATE [OR REPLACE] FUNCTION function_name [(parameter ...

  8. V-rep学习笔记:机器人路径规划2

    路径规划问题是机器人学研究的一个重要领域,它是指给定操作环境以及起始和目标的位置姿态,要求选择一条从起始点到目标点的路径,使运动物体(移动机器人或机械臂)能安全.无碰撞地通过所有的障碍物而达到目标位置 ...

  9. 【Linux】ps命令

    Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信 ...

  10. Redis资料整理

    1.Redis命令參考中文简体版. 2.java操作redis.jedis使用api 3.Redis学习笔记. 4.浅谈Redis数据库的键值设计 5.Redis资料汇总专题 6.MongoDB资料汇 ...