主要内容:七、利用sklearn进行数据预处理
数据预处理的必要性
数据清洗
数据集成
数据标准化
数据规约
数据变换与离散化
利用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.]]
推荐阅读
- sklearn实战|sklearn实战之数据预处理与特征工程
- 数据分析|Python 疫情数据的可视化与分析(二)
- 神经网络|机器学习-人工神经网络 最基础的单层神经网络编写
- 抖音解析|短视频搬运软件(抖音批量解析下载一个作者所有视频)
- 大数据可视化|Python疫情数据可视化分析+数据预测(pandas+pyecharts+statsmodels+matplotlib+sql)
- HaaS解决方案|看屏幕眼睛干(没问题 用ESP32和 HaaS Python做一个 全自动加湿器)
- HaaS解决方案|开工大吉,ESP32 + HaaS Python为您送上久坐提醒器,好好工作更要注意健康哦
- HaaS解决方案|用ESP32打造一个物联网红外测温打卡机/春节结束急着上班(哒咩,再努力奋斗也要先测体温)
- HaaS解决方案|绿色节能,怎么用ESP32 + HaaS Python怎么做一个起夜小灯(接上个“智慧路灯”案例中的留下的地下室人体感应亮灭灯)