转载:https://blog.csdn.net/wateryouyo/article/details/53898332
本次主要学习sklearn的preprocessing库:用来对数据预处理,包括无量纲化,特征二值化,定性数据量化等。
先看下这个库所包含的类及方法:
主要包括14大类,为训练集数据的预处理提供接口,每个类都提供了fit(填充数据,获取数据上的特征信息并保存),transform(将fit保存的信息应用到其它数据集上,对其它数据集进行转换),fit_transform(填充数据并对数据进行转换)。如果计算是一次性的,不需创建类,可直接调用与类相对应的方法。本次主要利用iris数据测试
- from sklearn.datasets import load_iris
- iris=load_iris()
无量纲化:
1.标准化:(x-列均值)/ 列标准差
- from sklearn.preprocessing import StandardScaler
- StandardScaler().fit_transform(iris.data)
或使用scaler方法,既可按列,又可按行标准化
- from sklearn.preprocessing import scale
- a=np.array([[1,2,3],[3,2,1]])
- res=scale(a,axis=0) #按列标准化
- res.mean(axis=0) #查看列均值
- res.std(axis=0) #查看列标准差
- res2=scale(a,axis=1) #按行标准化
1)(x-列最小值)/ (列最大值-列最小值), value在0-1直接
- from sklearn.preprocessing import MinMaxScaler
- MinMaxScaler().fit_transform(iris.data)
2) x / 列最大值的绝对值, value在[-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 # doctest +NORMALIZE_WHITESPACE^
- 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)根据四分位数来缩放数据。对于数据有较多异常值的情况,使用均值和方差来标准化显然不合适,按中位数,一、四分位数缩放效果要好,但没怎么明白缩放原理,有时间细看下。
- from sklearn.preprocessing import RobustScaler
- RobustScaler().fit_transform(iris.data)
3.归一化: x /(根号下(x所在行的值的平方和))
- from sklearn.preprocessing import Normalizer
- Normalizer(norm='l2').fit_transform(iris.data)
特征二值化:
- import numpy as np
- from sklearn.preprocessing import Binarizer
- a=np.array([[1,2,3],[3,2,1]])
- Binarizer(threshold=2).fit_transform(a)
[1, 0, 0]])
大于阀值转为1,小于等于阀值为0
当需要转换的数据是一列时,也可用pandas很快计算
- import pandas as pd
- df=pd.DataFrame({'name1':[1,2,3]})
- df[df<=2]=0
- df[df>2]=1
- print df
定性变量的量化:
1. onehot编码
当一个特征变量不能用一个数值表示,而是一个分类值时,我们可以考虑使用onehot编码。如一个特征是某人最喜欢的水果,特征值为【‘苹果’,‘梨’,‘葡萄’,‘都不是’】,通常情况下,我们会把它转换为数字[1,2,3,4]。但机器学习里的数字默认都是有序的,4比3大等等,而我们的苹果和梨都是等价的。这时就是onehot编码发挥作用的时候了。也就是把每一个选项都当作一列特征了,选择该选项则对应特征值为1否则为0.
- In [202]: from sklearn.preprocessing import OneHotEncoder
- In [203]: fruit=[[0],[1],[0],[2],[0],[3]]
- In [204]: res=OneHotEncoder().fit(fruit)
- In [205]: res.transform(fruit).toarray()
- Out[205]:
- array([[ 1., 0., 0., 0.],
- [ 0., 1., 0., 0.],
- [ 1., 0., 0., 0.],
- [ 0., 0., 1., 0.],
- [ 1., 0., 0., 0.],
- [ 0., 0., 0., 1.]])
2.顺带提下pandas里对字符型变量的量化为数字
1) dummy
直接将字符串的变量转换为onehot编码了,如kaggle的入门训练Titanic中的上船地点取值为's','q','c' 。 但是它只适应于变量取值较少的情况,对于变量取值范围较广的字符串,还是先使用factorize再用onehot编码较好。
- In [215]: emarked=pd.DataFrame(['s','s','q','q','c','s'])
- In [216]: pd.get_dummies(emarked)
- Out[216]:
- 0_c 0_q 0_s
- 0 0.0 0.0 1.0
- 1 0.0 0.0 1.0
- 2 0.0 1.0 0.0
- 3 0.0 1.0 0.0
- 4 1.0 0.0 0.0
- 5 0.0 0.0 1.0
2) factorize
将相同的字符串映射为同一个数字,然后再用onehot啦。
- In [214]: import pandas as pd
- data=pd.DataFrame({'name':['py','ws','py','zs','zs','ls','py']})
- ...: pd.factorize(data.name)
- ...:
- Out[214]:
- (array([0, 1, 0, 2, 2, 3, 0]),
- Index([u'py', u'ws', u'zs', u'ls'], dtype='object'))
缺失值处理:
sklearn提供了Imputer对缺失值进行处理,用均值,中位数,众数代替,通过strategy控制,取值为['mean','median','most_frequent']
- In [223]: a=[[1,2,3],[np.nan,2,4]]
- In [224]: Imputer(strategy='mean').fit_transform(a)
- Out[224]:
- array([[ 1., 2., 3.],
- [ 1., 2., 4.]])
按指定函数处理数据:
preprocessing库还提供了FunctionTransformer函数,传入一个指定的函数提取数据的特征并转换,以对数转换为例:
- from numpy import log1p
- from sklearn.preprocessing import FunctionTransformer
- #自定义转换函数为对数函数的数据变换
- #第一个参数是单变元函数
- FunctionTransformer(log1p).fit_transform(iris.data)
总结表:
类 | 功能 | 说明 |
StandardScaler | 无量纲化 | 标准化,基于特征矩阵的列,将特征值转换至服从标准正态分布 |
MinMaxScaler | 无量纲化 | 区间缩放,基于最大最小值,将特征值转换到[0, 1]区间上 |
Normalizer | 归一化 | 基于特征矩阵的行,将样本向量转换为“单位向量” |
Binarizer | 二值化 | 基于给定阈值,将定量特征按阈值划分 |
OneHotEncoder | 哑编码 | 将定性数据编码为定量数据 |
Imputer | 缺失值计算 | 计算缺失值,缺失值可填充为均值等 |
dummy,factorize | pandas库中的字符串处理 | 将字符型变量用onehot编码,将多字符变量映射为数字 |
FunctionTransformer | 自定义单元数据转换 | 使用单变元的函数来转换数据 |
fit | 数据填充 | 获取数据特征并存储 |
transform | 数据转换 | 将存储的标准应用到新的数据集上 |
fit_transform | 数据填充并转换 | 获取数据的特征并转换数据,转换后得到的是一个copy的新变量,不会改变原数据 |
参考:
http://scikit-learn.org/stable/modules/preprocessing.html#preprocessing
http://www.cnblogs.com/jasonfreak/p/5448385.html