一、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. Facebook's React vs AngularJS: A Closer Look

    When we launched React | A JavaScript library for building user interfaces two weeks ago there were ...

  2. 咖啡之约--体验 SourceAnywhere

    http://www.damingsoft.com/campaign/school-campaign-coffee-code.aspx 必备技能:代码版本控制 不论你是菜鸟还是大牛,想要获得高薪水和高 ...

  3. C语言事实上不简单:sizeof

    问:C语言中一共同拥有多少个keyword? 答:32个. 答不上来的没关系.非常正常.我们玩的是程序的艺术.而不是背数字. 只是这个特殊的数字1<<5也是非常好记的-.-. 问:size ...

  4. poj 1184

    经典的宽搜题目,感觉最好的办法应该是双向广搜. 不过用简单的启发式搜索可以飘过. #include <iostream> #include <cstdio> #include ...

  5. Android导入第三方静态库.a编译成动态库.so

    http://ikinglai.blog.51cto.com/6220785/1324985 在Android开发的时候,经常会使用到用c或c++编写的第三方的静态库.如果有源码的话,可以直接跟你自己 ...

  6. JVM Debugger Memory View for IntelliJ IDEA

    Posted on August 19, 2016 by Andrey Cheptsov Every day we try to find new ways to improve developer ...

  7. cygwin下切换到其他磁盘

    转自:https://blog.csdn.net/lts_cxl/article/details/17248727 cygwin安装之后,无法直接访问e,c,d等盘的目录.  运行df -h 命令,发 ...

  8. MDX Cookbook 12 - 计算 SMA 简单移动平均 LastPeriods() 函数的使用

    先认识一下这几个名词 Moving Average (MA) 移动平均,或者叫做移动平均线,是技术分析中一种分析时间序列数据的工具.最常见的就是利用股价,回报或交易量等变数计算出移动平均.可以利用移动 ...

  9. 树莓派3中没有/dev/video0的解决方法(使用OpenCV编程调用树莓派摄像头的方法)

    一.问题 使用下列方法调用OpenCV编程调用树莓派摄像头时总是失败,提示调用Grabber的start()时失败. import org.bytedeco.javacpp.opencv_core; ...

  10. 1.5.3 GROUP BY子句

    1.5.3 GROUP BY子句正在更新内容.请稍后