数据预处理 --Sklearn preprocessing的理解
一、标准化
API函数:scaler()或者StandardScaler()
数据集标准化对有些机器学习算法是很有必要的手段,只所以进行标准化,是因为两个原因:其一,对于同一特征中,最大最小值之差过大,将数据缩放在合适的范围,比如手机包月流量使用情况,有些数值是500M,有些是1G;其二、有些机器学习算法中目标函数的基础为假设特征均值为0,方差在同一介数的情况,sklearn官网说这类算法比如:SVM的RBF内核或线性模型的l1和l2正则化,如果某些特征的方差比其它的特征方差大几个数量级别,A方差是1,B特征方差是1000,那么会导致B特征对此算法占主导地位,导致学习器不是你所期望的结果。
标准化公式:(X - X_mean)/X_std; 计算时对每个属性/每列分别进行。
API函数一:sklearn.preprocessing.scale(X, axis=0, with_mean=True,with_std=True,copy=True)
变量注解:
X:{array-like, sparse matrix}
axis:默认值为0,为0表示分别标准化每个特征(按列),为1表示对每个样本进行标准化(按行)
with_mean和with_std:分别表示数据均值规范为0,方差规范为1
用例:
from sklearn import preprocessing import numpy as np X_train = np.array([[ 1., -1., 100.], [ 10., 0., 0.], [ 0., 1., -1.]]) X_scaler = preprocessing.scale(X_train) #X_scaler输出结果 array([[-0.59299945, -1.22474487, 1.41416106], [ 1.4083737 , 0. , -0.69652709], [-0.81537425, 1.22474487, -0.71763397]])
从上述结果可见,标准化后,数据之间差值没那么离谱
API函数二、sklearn.preprocessing.
StandardScaler
(copy=True, with_mean=True, with_std=True)
变量注释同上;
StandardScaler函数平时工作基本都用这个,其提供了fit和transform方法,fit可用于训练数据集,transform可用于测试数据集,使用方便
用例:
scaler = preprocessing.StandardScaler().fit(X_train) X_test = X_train scaler_result = scaler.transform(X_test) #scaler_result 结果 array([[-0.59299945, -1.22474487, 1.41416106], [ 1.4083737 , 0. , -0.69652709], [-0.81537425, 1.22474487, -0.71763397]]
1.1 缩放到一定的范围
一种标准化是将特征缩放到给定的最小值和最大值之间,可以使用MinMaxScaler ()和MaxAbsScaler()或者(minmax_scaler、maxabs_scaler),通常在0和1之间;
使用这种方法的好处:
- 1、对于方差非常小的属性可以增强其稳定性;
- 2、维持稀疏矩阵中为0的条目。
先介绍第一个函数:
sklearn.preprocessing.
MinMaxScaler
(feature_range=(0, 1), copy=True)
计算公式:
X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
X_scaled = X_std * (max - min) + min
另一种函数形式:sklearn.preprocessing.
minmax_scale
(X, feature_range=(0, 1), axis=0, copy=True),意思相同
变量注释:
feature_range:默认(min,max)为(0,1),即最大最小值为1、0
用例:
from sklearn import preprocessing import numpy as np X_train = np.array([[ 1., -1., 100.], [ 0.9, 0., 0.], [ 0.9, 1., -1.]]) minMaxScaler = preprocessing.MinMaxScaler() minMax = minMaxScaler.fit(X_train) minMax.transform(X_train) #输出结果 array([[ 1. , 0. , 1. ], [ 0. , 0.5 , 0.00990099], [ 0. , 1. , 0. ]])
上述X_train 中的数据使用minMaxScaler方法进行处理后,可见,在原有数值差异比较大的列,数据差异依然存在。
API函数二、MaxAbsScaler()只不过是用特征的值除以该特征的最大值而已,其取值范围是[-1,1]。
用例:
from sklearn import preprocessing import numpy as np 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(X_train) X_train_maxabs.transform(X_train) #输出结果 array([[ 0.5, -1. , 1. ], [ 1. , 0. , 0. ], [ 0. , 1. , -0.5]])
1.2 稀疏数据的缩放
MaxAbsScaler 以及maxabs_scaler是专为缩放数据而设计的,并且是缩放数据的推荐方法。但是,scale和 StandardScaler也能够接受 scipy.sparse
作为输入,只要参数 with_mean=False
被准确传入它的构造器。否则会出现 ValueError
的错误,因为默认的中心化会破坏稀疏性,并且经常会因为分配过多的内存而使执行崩溃
1.3 缩放离群值的数据
如果你的数据包含许多异常值,使用均值和方差缩放可能并不是一个很好的选择,可以使用RobustScaler或robust_scaler。但是特征工程有异常值存在时,一般要探测性的分析去发掘异常值。
二、归一化或者正则化(Normalization)
归一化 是 缩放单个样本以具有单位范数 的过程。如果你计划使用二次形式(如点积或任何其他核函数)来量化任何样本间的相似度,则此过程将非常有用。
API函数:sklearn.preprocessing.
Normalizer
(norm='l2', copy=True) 或者 sklearn.preprocessing.
normalize
(X, norm='l2', axis=1, copy=True, return_norm=False)
参数norm设置采用何种方式进行归一化,默认l2
同时:函数normalizer以及类Normalizer接收 来自scipy.sparse的密集类数组数据和稀疏矩阵 作为输入。
用例:
from sklearn import preprocessing import numpy as np X_train = np.array([[ 1., -1., 100.], [ 0.9, 0., 0.], [ 0.9, 1., -1.]]) norm = preprocessing.Normalizer() #此处的fit其实并未实际意义的,不使用fit,直接norm对象调用transform函数也可以
#因为每个样本被当做是独立于其他样本的,所以fit
方法是无用的 norm_fit = norm.fit(X_train) norm_fit.transform(X_train) #输出结果为 array([[ 0.009999 , -0.009999 , 0.99990001], [ 1. , 0. , 0. ], [ 0.53689499, 0.59654999, -0.59654999]])
三、二值化(Binarization)
API函数:sklearn.preprocessing.
Binarizer
(threshold=0.0, copy=True)
其中参数threshold表示小于等于0.0的数表示为0,大于0.0的数据表示为1。
用例:
from sklearn import preprocessing import numpy as np X_train = np.array([[ 1., -1., 100.], [ 0.9, 0., 0.], [ 0.9, 1., -1.]]) binarizer = preprocessing.Binarizer(threshold= 0.9) binarizer.transform(X_train) #输出结果 array([[ 1., 0., 1.], [ 0., 0., 0.], [ 0., 1., 0.]])
相比于 StandScaler和Normalizer类的情况,预处理模块提供了一个相似的函数 binarizer,以便不需要转换接口时使用。
binarizer及Binarizer接收 来自scipy.sparse的密集类数组数据以及稀疏矩阵作为输入
四、分类特征编码(Encoding categorical features)
API函数:sklearn.preprocessing.
OneHotEncoder
(n_values='auto', categorical_features='all', dtype=<type 'numpy.float64'>, sparse=True, handle_unknown='error')
其实就是大名鼎鼎的one-hot编码,该函数需注意参数是n_values,可以显示指定每个特征被编码为几列,也就是某个特征取值个数;
用例:
from sklearn import preprocessing import numpy as np enc = preprocessing.OneHotEncoder(n_values=[2, 3, 4]) # 注意到第二、三个特征是不全的 # features enc.fit([[1, 2, 3], [0, 2, 0]]) enc.transform([[1, 0, 0]]).toarray() #输出结果 array([[ 0., 1., 1., 0., 0., 1., 0., 0., 0.]])
上面的例子中,指定了第一个特征有两个取值,第二个特征有三个取值,第四个特征有4个取值;
五、缺失值填补( Imputation of missing values)
因为各种各样的原因,真实世界中的许多数据集都包含缺失数据,这类数据经常被编码成空格、NaNs,或者是其他的占位符。但是这样的数据集并不能scikit-learn学习算法兼容,因为大多的学习算法都默认假设数组中的元素都是数值,因而所有的元素都有自己的意义。 使用不完整的数据集的一个基本策略就是舍弃掉整行或整列包含缺失值的数据。但是这样就付出了舍弃可能有价值数据(即使是不完整的 )的代价。 处理缺失数值的一个更好的策略就是从已有的数据推断出缺失的数值。
Imputer类提供了估算缺失值的基本策略,使用缺失值所在的行/列中的平均值、中位数或者众数来填充。这个类也支持不同的缺失值编码。
API函数:sklearn.preprocessing.
Imputer
(missing_values='NaN', strategy='mean', axis=0, verbose=0, copy=True)
参数missing_values:integer or “NaN”, optional (default=”NaN”),什么值表示的是空值
import numpy as np from sklearn.preprocessing import Imputer imp = Imputer(missing_values='NaN', strategy='mean', axis=0) imp.fit([[1, 2], [np.nan, 3], [7, 6]]) X = [[np.nan, 2], [6, np.nan], [7, 6]] imp.transform(X) #输出结果为: array([[ 4. , 2. ], [ 6. , 3.66666667], [ 7. , 6. ]])
另外:
标准化和归一化何时使用呢:
标准化何时使用前面说了一下,对于归一化,归一化(Normalization)处理数据针对的是行样本,在数据样本向量进行点乘运算或其它核函数计算相似性时,拥有统一的标准(权重)时使用;