sklearn库学习笔记1——preprocessing库

转载:https://blog.csdn.net/wateryouyo/article/details/53898332

本次主要学习sklearn的preprocessing库:用来对数据预处理,包括无量纲化,特征二值化,定性数据量化等。

先看下这个库所包含的类及方法:


主要包括14大类,为训练集数据的预处理提供接口,每个类都提供了fit(填充数据,获取数据上的特征信息并保存),transform(将fit保存的信息应用到其它数据集上,对其它数据集进行转换),fit_transform(填充数据并对数据进行转换)。如果计算是一次性的,不需创建类,可直接调用与类相对应的方法。本次主要利用iris数据测试

[python]  view plain  copy
  1. from sklearn.datasets import load_iris  
  2. iris=load_iris()  

无量纲化:

1.标准化:(x-列均值)/ 列标准差

[python]  view plain  copy
  1. from sklearn.preprocessing import StandardScaler  
  2. StandardScaler().fit_transform(iris.data)  

或使用scaler方法,既可按列,又可按行标准化

[python]  view plain  copy
  1. from sklearn.preprocessing import scale  
  2. a=np.array([[1,2,3],[3,2,1]])  
  3. res=scale(a,axis=0#按列标准化  
  4. res.mean(axis=0#查看列均值  
  5. res.std(axis=0)   #查看列标准差  
  6.   
  7. res2=scale(a,axis=1)   #按行标准化  
这里要注意大写开头的StandarScaler与scale的区别,scale是一个方法,可直接调用,而StandarScaler是一个类,为计算训练集上的平均值和标准差提供的接口,通过fit方法,存储训练集上的均值和标准差,通过transform(x_test)方法,可用同样的标准处理测试集。也可直接用fit_transform方法,填充并转换,有点类似模型里边的fit。


2.区间缩放: 

1)(x-列最小值)/ (列最大值-列最小值), value在0-1直接

[python]  view plain  copy
  1. from sklearn.preprocessing import MinMaxScaler  
  2. MinMaxScaler().fit_transform(iris.data)  
同样,如果不想创建一个类,可使用方法 minmax_scale

2) x / 列最大值的绝对值, value在[-1,1]。(稀疏矩阵推荐使用

[python]  view plain  copy
  1. >>> X_train = np.array([[ 1., -1.,  2.],  
  2. ...                     [ 2.,  0.,  0.],  
  3. ...                     [ 0.,  1., -1.]])  
  4. ...  
  5. >>> max_abs_scaler = preprocessing.MaxAbsScaler()  
  6. >>> X_train_maxabs = max_abs_scaler.fit_transform(X_train)  
  7. >>> X_train_maxabs                # doctest +NORMALIZE_WHITESPACE^  
  8. array([[ 0.5, -1. ,  1. ],  
  9.        [ 1. ,  0. ,  0. ],  
  10.        [ 0. ,  1. , -0.5]])  
  11. >>> X_test = np.array([[ -3., -1.,  4.]])  
  12. >>> X_test_maxabs = max_abs_scaler.transform(X_test)  
  13. >>> X_test_maxabs                   
  14. array([[-1.5, -1. ,  2. ]])  
  15. >>> max_abs_scaler.scale_           
  16. array([ 2.,  1.,  2.])  
二者区别,除值域不一样外,后者不会改变矩阵的稀疏性,是0的还是0,而前者会改变。

3)根据四分位数来缩放数据。对于数据有较多异常值的情况,使用均值和方差来标准化显然不合适,按中位数,一、四分位数缩放效果要好,但没怎么明白缩放原理,有时间细看下。

[python]  view plain  copy
  1. from sklearn.preprocessing import RobustScaler  
  2. RobustScaler().fit_transform(iris.data)  

3.归一化: x /(根号下(x所在行的值的平方和))

[python]  view plain  copy
  1. from sklearn.preprocessing import Normalizer  
  2. Normalizer(norm='l2').fit_transform(iris.data)  
norm参数[‘l1’,'l2','max'], 默认norm为l2,即第二范数,也就是二维距离,l1是第一范数,即差的绝对值。


特征二值化:

[python]  view plain  copy
  1. import numpy as np  
  2. from sklearn.preprocessing import Binarizer  
  3. a=np.array([[1,2,3],[3,2,1]])  
  4. Binarizer(threshold=2).fit_transform(a)  
输出:array([[0, 0, 1],
       [1, 0, 0]])

大于阀值转为1,小于等于阀值为0


当需要转换的数据是一列时,也可用pandas很快计算

[python]  view plain  copy
  1. import pandas as pd  
  2. df=pd.DataFrame({'name1':[1,2,3]})  
  3. df[df<=2]=0  
  4. df[df>2]=1  
  5. print df  

定性变量的量化:

1. onehot编码

当一个特征变量不能用一个数值表示,而是一个分类值时,我们可以考虑使用onehot编码。如一个特征是某人最喜欢的水果,特征值为【‘苹果’,‘梨’,‘葡萄’,‘都不是’】,通常情况下,我们会把它转换为数字[1,2,3,4]。但机器学习里的数字默认都是有序的,4比3大等等,而我们的苹果和梨都是等价的。这时就是onehot编码发挥作用的时候了。也就是把每一个选项都当作一列特征了,选择该选项则对应特征值为1否则为0.

[python]  view plain  copy
  1. In [202]: from sklearn.preprocessing import OneHotEncoder  
  2.   
  3. In [203]: fruit=[[0],[1],[0],[2],[0],[3]]  
  4.   
  5. In [204]: res=OneHotEncoder().fit(fruit)  
  6.   
  7. In [205]: res.transform(fruit).toarray()  
  8. Out[205]:  
  9. array([[ 1.,  0.,  0.,  0.],  
  10.        [ 0.,  1.,  0.,  0.],  
  11.        [ 1.,  0.,  0.,  0.],  
  12.        [ 0.,  0.,  1.,  0.],  
  13.        [ 1.,  0.,  0.,  0.],  
  14.        [ 0.,  0.,  0.,  1.]])  

2.顺带提下pandas里对字符型变量的量化为数字

1) dummy

直接将字符串的变量转换为onehot编码了,如kaggle的入门训练Titanic中的上船地点取值为's','q','c' 。 但是它只适应于变量取值较少的情况,对于变量取值范围较广的字符串,还是先使用factorize再用onehot编码较好。

[python]  view plain  copy
  1. In [215]: emarked=pd.DataFrame(['s','s','q','q','c','s'])  
  2.   
  3. In [216]: pd.get_dummies(emarked)  
  4. Out[216]:  
  5.    0_c  0_q  0_s  
  6. 0  0.0  0.0  1.0  
  7. 1  0.0  0.0  1.0  
  8. 2  0.0  1.0  0.0  
  9. 3  0.0  1.0  0.0  
  10. 4  1.0  0.0  0.0  
  11. 5  0.0  0.0  1.0  

2) factorize

将相同的字符串映射为同一个数字,然后再用onehot啦。

[python]  view plain  copy
  1. In [214]: import pandas as pd  
  2.           data=pd.DataFrame({'name':['py','ws','py','zs','zs','ls','py']})  
  3.      ...: pd.factorize(data.name)  
  4.      ...:  
  5. Out[214]:  
  6. (array([0102230]),  
  7.  Index([u'py', u'ws', u'zs', u'ls'], dtype='object'))  

缺失值处理:

sklearn提供了Imputer对缺失值进行处理,用均值,中位数,众数代替,通过strategy控制,取值为['mean','median','most_frequent']

[python]  view plain  copy
  1. In [223]: a=[[1,2,3],[np.nan,2,4]]  
  2.   
  3. In [224]: Imputer(strategy='mean').fit_transform(a)  
  4. Out[224]:  
  5. array([[ 1.,  2.,  3.],  
  6.        [ 1.,  2.,  4.]])  


按指定函数处理数据:

preprocessing库还提供了FunctionTransformer函数,传入一个指定的函数提取数据的特征并转换,以对数转换为例:

[python]  view plain  copy
  1. from numpy import log1p  
  2. from sklearn.preprocessing import FunctionTransformer  
  3.   
  4. #自定义转换函数为对数函数的数据变换  
  5. #第一个参数是单变元函数  
  6. 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



猜你喜欢

转载自blog.csdn.net/m0_37870649/article/details/80562454