二、数据预处理Data Preprocessing – 特征工程

二、数据预处理Data Preprocessing – 特征工程数据预处理在整个机器学习领域都扮演着非常重要的角色 对于获取到的数据 需要先进行数据的清理 规范化 补全 或是对数据范围 量纲 格式 类型进行统一化处理 亦或是增强 变换等加工后 才能灌输给后续搭建好的模型进行训练

欢迎大家来到IT世界,在知识的湖畔探索吧!

数据预处理在整个机器学习领域都扮演着非常重要的角色,对于获取到的数据,需要先进行数据的清理、规范化、补全,或是对数据范围、量纲、格式、类型进行统一化处理,亦或是增强、变换等加工后,才能灌输给后续搭建好的模型进行训练。

数据预处理,有时也叫特征工程,在完整的机器学习项目中,也往往占据比较大的篇幅,后面的章节中会有更加明显的体现。

1. 预处理方法

1)标准化(均值移除)也叫零均值归一化 – Scale

标准差σ就是均方差,能反映一个数据集的离散程度。

标准差或者方差越大,数据集的离散程度也就越大

标准化(均值移除)即为,让样本中的每一列平均值为0,标准差为1.

具体方式为,求得每列的平均值和标准差,然后遍历每列特征值,统一减去平均值,然后除以标准差。

应用于处理特征与特征之间差异过大的情况

# 样本数据 raw_samples = np.array([ [3.0, -1.0, 2.0], [0.0, 4.0, 3.0], [1.0, -4.0, 2.0] ]) print(raw_samples) print(raw_samples.mean(axis=0)) # 求每列的平均值 print(raw_samples.std(axis=0)) # 求每列标准差 ​ for col in raw_samples.T: # 遍历每列 col_mean = col.mean() # 计算平均数 col_std = col.std() # 求标准差 col -= col_mean # 减平均值 ”广播“ col /= col_std # 除标准差 ”广播“

欢迎大家来到IT世界,在知识的湖畔探索吧!

或者直接使用sklearn中preprocessing模块里的scale函数直接做标准化

欢迎大家来到IT世界,在知识的湖畔探索吧!import sklearn.preprocessing as sp std_samples = sp.scale(raw_samples) # 求标准移除 print(std_samples) print(std_samples.mean(axis=0)) print(std_samples.std(axis=0))

这里axis为轴,几维数组就有几个轴。

其中一维数组不用解释。

二维数组中,axis=0表示的方向是列,即垂直方向,axis=1表示的行,即水平方向。

三维数组中,axis=0表示列,就是按照三维数组下一级(也就是第一级)单位的数组,也就是二维数组作为方向,axis=1表示,按照三维数组下两级的数组的垂直方向,有点类似列方向。axis=2就是整个三维数组中的最小数组维度下的数值方向,有点类似一维数组内方向。

也就是说,无论是几维数组,axis从0,1,2的取值,对应的是数组的shape从左到右对应的维度的垂直方向。– 这句话太有含金量了,原创!~

2)范围缩放 – MinMaxScale

将样本矩阵中的每一列最小值和最大值设定为相同的区间,统一各个特征值的范围。

具体方式为,获得每列的最大值和最小值,求取两数之差,然后所有值除以这个差值。计算完后将整体范围控制在0~1.

# 数据预处理之:范围缩放 import numpy as np import sklearn.preprocessing as sp ​ # 样本数据 raw_samples = np.array([ [1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]]).astype("float64") ​ # print(raw_samples) mms_samples = raw_samples.copy() # 复制样本数据 ​ for col in mms_samples.T: col_min = col.min() col_max = col.max() col -= col_min col /= (col_max - col_min) print(mms_samples)

或者直接使用sklearn中preprocessing模块,创建一个MinMaxScaler缩放器对象

欢迎大家来到IT世界,在知识的湖畔探索吧!# 创建一个缩放器对象mms mms = sp.MinMaxScaler(feature_range=(0,1)) # 基于缩放器对象,对目标数据集进行缩放转换 mms_samples = mms.fit_transform(raw_samples) ​ print(raw_samples)

3)归一化 – Normalize

用样本中的每个特征值,除以该样本中所有特征值的绝对值之和。计算后每个样本的特征值绝对值之和为1.

编程思想为

for row in nor_samples: row /= abs(row).sum() # 先对行求绝对值,再求和,再除以绝对值之和

或者直接使用sklearn中preprocessing模块中的normalize函数进行归一化处理

欢迎大家来到IT世界,在知识的湖畔探索吧!sp.normalize(raw_samples,norm='l1') # l1: l1范数,除以向量中各元素绝对值之和 # l2: l2范数,除以向量中各元素平方之和开方

4)二值化 – Binarize

根据一个给定的阈值,用0和1来表示特征值是否超过阈值。

# 二值化 import numpy as np import sklearn.preprocessing as sp ​ raw_samples = np.array([[65.5, 89.0, 73.0], [55.0, 99.0, 98.5], [45.0, 22.5, 60.0]]) bin_samples = raw_samples.copy() # 复制数组 # 生成掩码数组 mask1 = (bin_samples < 60) mask2 = (bin_samples >= 60) # 通过掩码进行二值化处理 bin_samples[mask1] = 0 bin_samples[mask2] = 1 ​ print(bin_samples) # 打印结果

同样,也可以用sklearn库来处理

欢迎大家来到IT世界,在知识的湖畔探索吧!bin = sp.Binarizer(threshold=59) # 创建二值化对象,注意边界值 bin_samples = bin.transform(raw_samples) ​ print(bin_samples)

二值化编码不可逆,会导致信息损失,如果要求可逆,可以使用独热编码。

5)独热编码 – OneHotEncode

根据一个特征中的个数来建立一个由一个1和若干个0组成的序列,用来对序列中所有的特征值进行编码.例如有如下样本:

二、数据预处理Data Preprocessing - 特征工程



欢迎大家来到IT世界,在知识的湖畔探索吧!

对于第一列,有两个值,1使用10编码,7使用01编码

对于第二列,有三个值,3使用100编码,5使用010编码,8使用001编码

对于第三列,有四个值,2使用1000编码,4使用0100编码,6使用0010编码,9使用0001编码

编码字段,根据特征值的个数来进行编码,通过位置加以区分.通过独热编码后的结果为:

二、数据预处理Data Preprocessing - 特征工程

这个转换实际是一种概率体现。

使用sklearn库提供的功能进行独热编码的代码如下所示:

# 独热编码示例 import numpy as np import sklearn.preprocessing as sp ​ raw_samples = np.array([[1, 3, 2], [7, 5, 4], [1, 8, 6], [7, 3, 9]]) ​ one_hot_encoder = sp.OneHotEncoder( sparse=False, # 是否采用稀疏格式 dtype="int32", categories="auto")# 自动编码 oh_samples = one_hot_encoder.fit_transform(raw_samples) # 执行独热编码 print(oh_samples) ​ print(one_hot_encoder.inverse_transform(oh_samples)) # 解码

6)标签编码 – LabelEncode

根据字符串形式的特征值在特征序列中的位置,来为其指定一个数字标签,用于提供给基于数值算法的学习模型.

将字符串类型的特征转换成数值类型,是根据字符串的ASCII码

代码如下所示:

欢迎大家来到IT世界,在知识的湖畔探索吧!# 标签编码 import numpy as np import sklearn.preprocessing as sp ​ raw_samples = np.array(['audi', 'ford', 'audi','bmw','ford', 'bmw']) ​ lb_encoder = sp.LabelEncoder() # 定义标签编码对象 lb_samples = lb_encoder.fit_transform(raw_samples) # 执行标签编码 print(lb_samples) ​ print(lb_encoder.inverse_transform(lb_samples)) # 逆向转换

执行结果:

[0 2 0 1 2 1] ['audi' 'ford' 'audi' 'bmw' 'ford' 'bmw']

注:标签编码器sp.LabelEncoder只能处理一维数组。

2. 特征工程

特征归一化

对数值类型的特征做归一化可以将所有的特征值统一到一个大致相同的数值区间内。原因是为了消除数据特征之间的量纲影响,使得不同数据指标之间具备可比性。

常见的特征归一化的方法有:

线性函数归一化MinMax Scaling,对原始数据做线性变换,使结果映射到【0,1】的范围,实现对原始数据的等比例缩放。

零均值归一化Z-Score Normalization,将原始数据映射为均值为0,标准差为1的分布上。也叫均值移除,是深度学习中比较常用的数据处理方式。

使用场景:线性回归,逻辑回归,支持向量机,神经网络等模型

决策树就不需要特征归一化。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/97420.html

(0)
上一篇 16小时前
下一篇 16小时前

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信