Python机器学习的数据预处理操作包括哪些
Admin 2022-07-18 群英技术资讯 388 次浏览
假定样本集是二维平面上的若干个点,横坐标 x 分布于区间 [0,100] 内,纵坐标 y 分布于区间 [0,1] 内。显然,样本集的 x 特征列和 y 特征列的动态范围相差巨大,对于机器学习模型(如k-近邻或 k-means 聚类)的影响也会有显著差别。标准化处理正是为了避免某一个动态范围过大的特征列对计算结果造成影响,同时还可以提升模型精度。标准化的实质是对样本集的每个特征列减去该特征列均值进行中心化,再除以标准差进行缩放。
Scikit-learn的预处理子模块preprocessing提供了一个快速标准化函数scale(),使用该函数可以直接返回标准化后的数据集,其代码如下。
>>> import numpy as np >>> from sklearn import preprocessing as pp >>> d = np.array([[ 1., -5., 8.], [ 2., -3., 0.], [ 0., -1., 1.]]) >>> d_scaled = pp.scale(d) # 对数据集d做标准化 >>> d_scaled array([[ 0. , -1.22474487, 1.40487872], [ 1.22474487, 0. , -0.84292723], [-1.22474487, 1.22474487, -0.56195149]]) >>> d_scaled.mean(axis=0) # 标准化以后的数据集,各特征列的均值为0 array([0., 0., 0.]) >>> d_scaled.std(axis=0) # 标准化以后的数据集,各特征列的标准差为1 array([1., 1., 1.])
预处理子模块 preprocessing 还提供了一个实用类 StandardScaler,它保存了训练集上各特征列的平均值和标准差,以便以后在测试集上应用相同的变换。此外,实用类StandardScaler 还可以通过 with_mean 和 with_std 参数指定是否中心化和是否按标准差缩放,其代码如下。
>>> import numpy as np >>> from sklearn import preprocessing as pp >>> X_train = np.array([[ 1., -5., 8.], [ 2., -3., 0.], [ 0., -1., 1.]]) >>> scaler = pp.StandardScaler().fit(X_train) >>> scaler StandardScaler(copy=True, with_mean=True, with_std=True) >>> scaler.mean_ # 训练集各特征列的均值 array([ 1., -3., 3.]) >>> scaler.scale_ # 训练集各特征列的标准差 array([0.81649658, 1.63299316, 3.55902608]) >>> scaler.transform(X_train) # 标准化训练集 array([[ 0. , -1.22474487, 1.40487872], [ 1.22474487, 0. , -0.84292723], [-1.22474487, 1.22474487, -0.56195149]]) >>> X_test = [[-1., 1., 0.]] # 使用训练集的缩放标准来标准化测试集 >>> scaler.transform(X_test) array([[-2.44948974, 2.44948974, -0.84292723]])
标准化是用特征列的均值进行中心化,用标准差进行缩放。如果用数据集各个特征列的最小值进行中心化后,再按极差(最大值-最小值)进行缩放,即数据减去特征列的最小值,并且会被收敛到区间 [0,1] 内,这个过程就叫作数据归一化。
Scikit-learn的预处理子模块 preprocessing 提供 MinMaxScaler 类来实现归一化功能。MinMaxScaler 类有一个重要参数 feature_range,该参数用于设置数据压缩的范围,默认是 [0,1]。
>>> import numpy as np >>> from sklearn import preprocessing as pp >>> X_train = np.array([[ 1., -5., 8.], [ 2., -3., 0.], [ 0., -1., 1.]]) >>> scaler = pp.MinMaxScaler().fit(X_train) # 默认数据压缩范围为[0,1] >>> scaler MinMaxScaler(copy=True, feature_range=(0, 1)) >>> scaler.transform(X_train) array([[0.5 , 0. , 1. ], [1. , 0.5 , 0. ], [0. , 1. , 0.125]]) >>> scaler = pp.MinMaxScaler(feature_range=(-2, 2)) # 设置数据压缩范围为[-2,2] >>> scaler = scaler.fit(X_train) >>> scaler.transform(X_train) array([[ 0. , -2. , 2. ], [ 2. , 0. , -2. ], [-2. , 2. , -1.5]])
因为归一化对异常值非常敏感,所以大多数机器学习算法会选择标准化来进行特征缩放。在主成分分析(Principal Components Analysis,PCA)、聚类、逻辑回归、支持向量机、神经网络等算法中,标准化往往是最好的选择。归一化在不涉及距离度量、梯度、协方差计算,以及数据需要被压缩到特定区间时被广泛使用,如数字图像处理中量化像素强度时,都会使用归一化将数据压缩在区间 [0,1] 内。
归一化是对数据集的特征列的操作,而正则化是将每个数据样本的范数单位化,是对数据集的行操作。如果打算使用点积等运算来量化样本之间的相似度,那么正则化将非常有用。
Scikit-learn的预处理子模块preprocessing提供了一个快速正则化函数normalize(),使用该函数可以直接返回正则化后的数据集。normalize()函数使用参数norm指定I1范式或I2范式,默认使用I2范式。I1 范式可以理解为单个样本各元素的绝对值之和为 1;I2 范式可理解为单个样本各元素的平方和的算术根为 1,相当于样本向量的模(长度)。
>>> import numpy as np >>> from sklearn import preprocessing as pp >>> X_train = np.array([[ 1., -5., 8.], [ 2., -3., 0.], [ 0., -1., 1.]]) >>> pp.normalize(X_train) # 使用I2范式正则化,每行的范数为1 array([[ 0.10540926, -0.52704628, 0.84327404], [ 0.5547002 , -0.83205029, 0. ], [ 0. , -0.70710678, 0.70710678]]) >>> pp.normalize(X_train, norm='I1') # 使用I1范式正则化,每行的范数为1 array([[ 0.07142857, -0.35714286, 0.57142857], [ 0.4 , -0.6 , 0. ], [ 0. , -0.5 , 0.5 ]])
离散化(Discretization)是将连续特征划分为离散特征值,典型的应用是灰度图像的二值化。如果使用等宽的区间对连续特征离散化,则被称为 K-bins 离散化。Scikit-learn的预处理子模块preprocessing提供了Binarizer类和KbinsDiscretizer类来进行离散化,前者用于二值化,后者用于 K-bins 离散化。
>>> import numpy as np >>> from sklearn import preprocessing as pp >>> X = np.array([[-2,5,11],[7,-1,9],[4,3,7]]) >>> bina = pp.Binarizer(threshold=5) # 指定二值化阈值为5 >>> bina.transform(X) array([[0, 0, 1], [1, 0, 1], [0, 0, 1]]) >>> est = pp.KBinsDiscretizer(n_bins=[2, 2, 3], encode='ordinal').fit(X) >>> est.transform(X) # 三个特征列离散化为2段、2段、3段 array([[0., 1., 2.], [1., 0., 1.], [1., 1., 0.]])
白化一词是从whitening翻译过来的,难以望文生义,只能从白化后的效果去理解。数据白化有两个目的,一是去除或降低特征列之间的相关性,二是使得每个特征列的方差为1。显然,白化的第一个目标就是主成分分析(PCA),通过主成分分析降维,消除方差占比较小的特征维;白化的第二个目标就是标准化。
白化分为PCA白化和ZCA白化两种。PCA 白化将原数据各个特征维变换到主成分轴上,消除了特征之间的相关性,并使得各个主成分的方差为1。ZCA白化则是将PCA 白化的结果反变换到原数据的各个特征维轴上,因为ZCA白化过程中通常不会降维。
Scikit-learn没有提供专用的白化方法,不过借助成分分析子模块decomposition提供的PCA 类可以轻松实现PCA白化。PCA类的参数whiten用于设置是否移除特征间的线性关联,默认值为False。
假如一位姑娘手头有一堆相亲资料,每位帅哥的信息由年龄、身高、体重、年薪、房产数量、汽车数量等多个特征项组成。通过白化操作,能够生成一个特征维较小、且可以直接比较样本间差距的数据集。
>>> import numpy as np >>> from sklearn import preprocessing as pp >>> from sklearn.decomposition import PCA >>> ds = np.array([ [25, 1.85, 70, 50, 2, 1], [22, 1.78, 72, 22, 0, 1], [26, 1.80, 85, 25, 1, 0], [28, 1.70, 82, 100, 5, 2] ]) # 4个样本,6个特征列 >>> m = PCA(whiten=True) # 实例化主成分分析类,指定白化参数 >>> m.fit(ds) # 主成分分析 PCA(whiten=True) >>> d = m.transform(ds) # 返回主成分分析结果 >>> d # 特征列从6个降至4个 array([[ 0.01001541, -0.99099492, -1.12597902, -0.03748764], [-0.76359767, -0.5681715 , 1.15935316, 0.67477757], [-0.65589352, 1.26928222, -0.45686577, -1.8639689 ], [ 1.40947578, 0.28988421, 0.42349164, 1.2724972 ]]) >>> d.std(axis=0) # 显示各特征列方差 array([0.8660254 , 0.8660254 , 0.8660254 , 1.17790433]) >>> d = pp.scale(d) # 标准化 >>> d.std(axis=0) # 标准化后的各特征列方差均为1 array([1., 1., 1., 1.])
GitHub上有人提供了ZCA白化的代码,如果需要,请访问(https://github.com/mwv/zca)。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要介绍了浅谈Python任务自动化工具Tox,tox 是一个管理测试虚拟环境的命令行工具, 它已存在多年且广被开发者们使用,对Python任务自动化工具Tox基本用法感兴趣的朋友一起看看吧
这篇文章主要为大家介绍了python的运算符与表达式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
python编码要注意哪些规范?我们在学习python编码的时候,要有好的编码习惯,所有了解python编码规范很有必要。因此,下面就给大家来介绍一下关于缩进、行的最大长度、空行、命名约定、字符串引号、注释等使用的规范。
对Python小白来说,可能对列表的相关的知识还不是很了解,对此本文就给大家简单介绍关于列表的格式、列表的相关操作、列表的嵌套的内容,有这个方面学习需要的朋友可以参考参考。
内容介绍前言一、Xpath简介二、Xpath语法规则语法规则标签定位属性定位索引定位取文本内容三、语法规则练习总结前言网上已经有很多大佬发过Xpath,而且讲的都很好,我是因为刚开始学习网络爬虫,对这
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008