python机器学习与数据挖掘|数据预处理(七)——利用sklearn进行数据预处理

主要内容:
数据预处理的必要性
数据清洗
数据集成
数据标准化
数据规约
数据变换与离散化
利用sklearn进行数据预处理
小结
七、利用sklearn进行数据预处理 python机器学习与数据挖掘|数据预处理(七)——利用sklearn进行数据预处理
文章图片

1.数据标准化、均值和方差缩放
sklearn.preprocessing.scale(X, axis=0, with_mean=True, with_std=True, copy=True)

参数 数据类型 意义
X (array-like,sparse,matrix) 以此数据为中心缩放
axis int(0 by default) 轴向设置,置为0表示独立地标准化每个特征,1表示标准化每个样本(即行)
with_mean boolean,True by default 如果是True,缩放之前先中心化数据
with_std boolean,True by default 如果是True,以单位方差法缩放数据(或者等价地,单位标准差)
copy boolean,optional,default,True False:原地执行行标准化并避免复制
数据的标准化、均值和标准差求解示例。
from sklearn import preprocessing import numpy as np X_train = np.array([[1.,-2.,1.5],[2.2,1.3,0.5],[0.3,1.,-1.5]]) X_scaled = preprocessing.scale(X_train) print('X_train:\n',X_train) print('X_scaled:\n',X_scaled) print('均值:',X_scaled.mean(axis=0)) print('单位方差:',X_scaled.std(axis=0))# X_train: #[[ 1.-2.1.5] #[ 2.21.30.5] #[ 0.31.-1.5]] # X_scaled: #[[-0.21242964 -1.409427721.06904497] #[ 1.317063790.805387270.26726124] #[-1.104634150.60404045 -1.33630621]] # 均值: [0. 0. 0.] # 单位方差: [1. 1. 1.]

数据的标准化计算示例。
scaler = preprocessing.StandardScaler().fit(X_train) print('scaler.scale_:',scaler.scale_) print('scaler.mean_:',scaler.mean_) scaler.transform(X_train)# scaler.scale_: [0.78457349 1.48996644 1.24721913] # scaler.mean_: [1.16666667 0.10.16666667] # array([[-0.21242964, -1.40942772,1.06904497], #[ 1.31706379,0.80538727,0.26726124], #[-1.10463415,0.60404045, -1.33630621]])

X_test = [[-1.,1.,0.]] scaler.transform(X_test)# array([[-2.76158538,0.60404045, -0.13363062]])

2.特征缩放
(1)一般特征值缩放
sklearn.preprocessing.minmax_scale(X, feature_range=(0, 1), axis=0, copy=True)

数据的缩放示例。
X_train = np.array([[ 1., -1.,2.],[ 2.,0.,0.],[ 0.,1., -1.]]) min_max_scaler = preprocessing.MinMaxScaler() X_train_minmax = min_max_scaler.fit_transform(X_train) print('原数据:\n',X_train) print('归一化:\n',X_train_minmax)X_test = np.array([[-3., -1.,4.]]) X_test_minmax = min_max_scaler.transform(X_test) print('测试数据:',X_test) print('归一化的测试数据:\n',X_test_minmax) print('',min_max_scaler.scale_) print('',min_max_scaler.min_)# 原数据: #[[ 1. -1.2.] #[ 2.0.0.] #[ 0.1. -1.]] # 归一化: #[[0.50.1.] #[1.0.50.33333333] #[0.1.0.]] # 测试数据: [[-3. -1.4.]] # 归一化的测试数据: #[[-1.50.1.66666667]] #[0.50.50.33333333] #[0.0.50.33333333]

MinMaxScaler默认转换为[0.0,1.0],如果MinMaxScaler给出一个显式范围feature_range = (min,max),完整的表达式为:
X_std = (X-X.min(axis=0))/(X.max(axis=0)-X.min(axis=0)) X_scaled = X_std*(max-min)+min

MaxAbsScaler的工作方式类似,但通过除以每个特征中的最大值将训练数据置于[-1,1]范围内。它适用于已经零中心化数据或稀疏数据。
利用MaxAbsScaler将数据归一化。
X_train = np.array([[ 1., -1.,2.],[ 2.,0.,0.],[ 0.,1., -1.]]) max_Abs_scaler = preprocessing.MaxAbsScaler() X_train_minmax = max_Abs_scaler.fit_transform(X_train) print('原数据:\n',X_train) print('归一化:\n',X_train_minmax)X_test = np.array([[-3., -1.,4.]]) X_test_maxAbs = max_Abs_scaler.transform(X_test) print('测试数据:',X_test) print('归一化的测试数据:',X_test_maxAbs)# 原数据: #[[ 1. -1.2.] #[ 2.0.0.] #[ 0.1. -1.]] # 归一化: #[[ 0.5 -1.1. ] #[ 1.0.0. ] #[ 0.1.-0.5]] # 测试数据: [[-3. -1.4.]] # 归一化的测试数据: [[-1.5 -1.2. ]]

(2)缩放稀疏数据
将稀疏数据居中会破坏数据中的稀疏结构,但是缩放稀疏矩阵又是有意义的,特别是当特征处于不同的缩放比例。
(3)带异常值的缩放数据
如果您的数据包含许多异常值,则使用数据的平均值和方差进行缩放可能不会很好地工作。可以使用:robust_scale和Robust_Scaler替代。
3.非线性变换
【python机器学习与数据挖掘|数据预处理(七)——利用sklearn进行数据预处理】非线性变换有分位数转换和幂转换。分位数变换和幂变换都是基于特征的单调变换,从而保持每个特征值的秩。分位数变换将所有特征置于相同的期望分布中。幂变换是一类参数变换,其目的是将数据从任意分布映射到接近高斯分布的位置。
(1)映射到均匀分布
QuantileTransformer()方法和quantile_transform提供非参数转换,将数据映射到值为0~1的均匀分布。
数据映射到值介于0和1之间的均匀分布。
from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn import preprocessing import numpy as np X, y = load_iris(return_X_y=True) X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=0) quantile_transformer = preprocessing.QuantileTransformer(random_state=0) X_train_trans = quantile_transformer.fit_transform(X_train) X_test_trans = quantile_transformer.transform(X_test) print(np.percentile(X_train[:,0],[0,25,50,75,100])) # 此特征对应于以厘米为单位的萼片长度。 print(np.percentile(X_train_trans[:,0],[0,25,50,75,100]))# [4.3 5.1 5.8 6.5 7.9] # [9.99999998e-08 2.38738739e-01 5.09009009e-01 7.43243243e-01 #9.99999900e-01]

(2)映射到高斯分布
使用Box-Cox将从对数正态分布绘制的样本映射到正态分布的示例。
pt = preprocessing.PowerTransformer(method='box-cox',standardize=False) X_lognormal = np.random.RandomState(616).lognormal(size=(3,3)) print(X_lognormal) T = pt.fit_transform(X_lognormal) print(T)# [[1.28331718 1.18092228 0.84160269] #[0.94293279 1.60960836 0.3879099 ] #[1.35235668 0.21715673 1.09977091]] # [[ 0.490243490.17881995 -0.1563781 ] #[-0.051028920.58863196 -0.57612414] #[ 0.69420008 -0.848578220.10051454]]

使用QuantileTransformer方法进行数据映射。
from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split X, y = load_iris(return_X_y=True) quantile_transformer = preprocessing.QuantileTransformer(output_distribution='normal',random_state=0) X_trans = quantile_transformer.fit_transform(X) quantile_transformer.quantiles_# array([[4.3, 2., 1., 0.1], #[4.31491491, 2.02982983, 1.01491491, 0.1], #[4.32982983, 2.05965966, 1.02982983, 0.1], #..., #[7.84034034, 4.34034034, 6.84034034, 2.5], #[7.87017017, 4.37017017, 6.87017017, 2.5], #[7.9, 4.4, 6.9, 2.5]])

4.正则化
数据正态化示例。
X = [[1.,-1.,2.],[2.,0.,0.],[0.,1.,-1.]] X_normalized = preprocessing.normalize(X,norm='l2') X_normalized# array([[ 0.40824829, -0.40824829,0.81649658], #[ 1.,0.,0.], #[ 0.,0.70710678, -0.70710678]])

5.编码分类特征
数据编码示例。
enc = preprocessing.OrdinalEncoder() X = [['male','from US','uses Safari'],['female','from Europe','uses Firefox']] enc.fit(X) enc.transform([['female','from US','uses Safari']])# array([[0., 1., 1.]])

使用OneHotEncoder进行分类特征编码示例。
enc = preprocessing.OneHotEncoder() X = [['male','from US','uses Safari'],['female','from Europe','uses Firefox']] enc.fit(X) R = enc.transform([['female','from US','uses Safari'],['male','from Europe','uses Safari']]).toarray() display(R)# array([[1., 0., 0., 1., 0., 1.], #[0., 1., 1., 0., 0., 1.]])

类型数据变换示例,数据集中有两种性别,四个可能的大洲和四个网络浏览器。
genders = ['female','male'] locations = ['from Africa','from Asia','from Europe','from US'] browsers = ['uses Chrome','uses Firefox','uses IE','uses Safari'] enc = preprocessing.OneHotEncoder(categories=[genders,locations,browsers]) X = [['male','from US','uses Safari'],['female','from Europe','uses Firefox']] enc.fit(X) enc.transform([['female', 'from Asia', 'uses Chrome']]).toarray()# array([[1., 0., 0., 1., 0., 0., 1., 0., 0., 0.]])

6.离散化
(1)K-桶离散化
KBinsDiscretizer将特征离散到K个桶(Bin)中。
数据的K-桶离散化示例。
X = np.array([[-3.,5.,15],[0.,6.,14],[6.,3.,11]]) est = preprocessing.KBinsDiscretizer(n_bins=[3,2,2],encode='ordinal').fit(X) est.transform(X)# array([[0., 1., 1.], #[1., 1., 1.], #[2., 0., 0.]])

(2)特征二值化
特征二值化是对数字特征进行阈值化以获得布尔值的过程。
数据的二值化示例。
X = [[1.,-1.,2.],[2.,0.,0.],[0.,1.,-1.]] binarizer = preprocessing.Binarizer().fit(X) Y1 = binarizer.transform(X) print(Y1) binarizer = preprocessing.Binarizer(threshold=1.1) Y2 = binarizer.transform(X) print(Y2)# [[1. 0. 1.] #[1. 0. 0.] #[0. 1. 0.]] # [[0. 0. 1.] #[1. 0. 0.] #[0. 0. 0.]]

    推荐阅读