机器学习之数据预处理(标准化处理、归一化、二值化、独热编码、标记编码)

机器学习之数据预处理(标准化处理、归⼀化、⼆值化、独热
编码、标记编码)
数据预处理
机器是看不懂绝⼤部分原始数据的,为了让让机器看懂,需要将原始数据进⾏预处理。
引⼊模块和数据:
import numpy as np
from sklearn import preprocessing
data = np.array([[3, -1.5, 2, -5.4],
[0, 4, -0.3, 2.1],
[1, 3.3, -1.9, -4.3]])  # 原始数据矩阵 shape=(3,4)
最常⽤的数据预处理技术:
1. 均值移除(Mean removal)/ 标准化处理
把每个特征的平均值移除,以保证特征均值为0(即标准化处理),这样做可以消除特征彼此间的偏差,从⽽使数据具有可⽐性。
data_standardized=preprocessing.scale(data)
print ("原始data\n",data)
print ("\n经过标准化处理的data\n",data_standardized)
print ("\n原始:mean = ",an(axis=0))
print ("\n经过标准化处理:mean = ",an(axis=0))
# 或者:print ("\n经过标准化处理:mean = ",np.mean(data_standardized,axis=0))
print ("\n原始:std deviation = ",data.std(axis=0))
print ("\n进过标准化处理:std deviation = ",data_standardized.std(axis=0))
代码运⾏结果:
原始data
[[ 3.  -1.5  2.  -5.4]
[ 0.  4.  -0.3  2.1]
[ 1.  3.3 -1.9 -4.3]]
二苯并噻吩
经过标准化处理的data
[[ 1.33630621 -1.40451644  1.29110641 -0.86687558]
[-1.06904497  0.84543708 -0.14577008  1.40111286]
[-0.26726124  0.55907936 -1.14533633 -0.53423728]]
原始:mean =  [ 1.33333333  1.93333333 -0.06666667 -2.53333333]
经过标准化处理:mean =  [ 5.55111512e-17 -1.11022302e-16 -7.40148683e-17 -7.40148683e-17]
原始:std deviation =  [1.24721913 2.44449495 1.60069429 3.30689515]
进过标准化处理:std deviation =  [1. 1. 1. 1.]
⼩结:
均值移除之后的矩阵每⼀列的均值约为0,⽽std为1。这样做的⽬的是确保每⼀个特征列的数值都在类似的数据范围之间,防⽌某⼀个特征列数据天然的数值太⼤⽽⼀家独⼤。
可以直接调⽤preprocessing模块中成熟的scale⽅法来对⼀个numpy 矩阵进⾏均值移除
求⼀个numpy矩阵的平均值(或std,min,max等)⾄少有两种⽅法
2. 范围缩放(Scaling)
数据点中每个特征列的数值范围可能变化很⼤,因此,有时需要将特征列的数值范围缩放到合理的⼤⼩。
#范围缩放
data_scaler=preprocessing.MinMaxScaler(feature_range=(0,1))
data_scaled=data_scaler.fit_transform(data)
print ("原始:\n",data)
print("\n经过范围缩放:\n",data_scaled)
代码运⾏结果:
原始:
[[ 3.  -1.5  2.  -5.4]
[ 0.  4.  -0.3  2.1]
[ 1.  3.3 -1.9 -4.3]]
兰兰过桥教案经过范围缩放:
[[1.        0.        1.        0.        ]
[0.        1.        0.41025641 1.        ]
[0.33333333 0.87272727 0.        0.14666667]]
⼩结:
数据缩放是将每⼀个特征列的数值都调整到feature_range范围之内(此处为(0,1)之内)。
作⽤是,可以确保每个特征列的数值变化范围具有⼀致性。
代码上,先使⽤MinMaxScaler构建⼀个缩放器,然后使⽤该缩放器来缩放原始数据
3. 归⼀化(Normalization)
data_alize(data,norm='l1')
print("原始:\n",data)
print("归⼀化后:\n",data_normalized)
代码运⾏结果:
原始:
[[ 3.  -1.5  2.  -5.4]
[ 0.  4.  -0.3  2.1]
[ 1.  3.3 -1.9 -4.3]]
归⼀化后:
[[ 0.25210084 -0.12605042  0.16806723 -0.45378151]
[ 0.          0.625      -0.046875    0.328125  ]
[ 0.0952381  0.31428571 -0.18095238 -0.40952381]]
⼩结:
对不同特征维度的伸缩变换的⽬的是使各个特征维度对⽬标函数的影响权重是⼀致的,即使得那些扁平分布的数据伸缩变换成类圆形。
这也就改变了原始数据的⼀个分布。
注意和均值移除的区别:均值移除是对每⼀个特征列都缩放到类似的数值范围,每⼀个特征列的均值为0,⽽Normalization是将全局所有数值都缩放到同⼀个数值范围
4. ⼆值化(Binarization)
⼆值化⽤于将数值特征向量转换为布尔类型向量。
data_binarized=preprocessing.Binarizer(threshold=1.4).transform(data)#⼩于等于1.4的为0,其余为1
print("原始:\n",data)
print("⼆值化:\n",data_binarized)
代码运⾏结果:
原始:
[[ 3.  -1.5  2.  -5.4]
[ 0.  4.  0.3  2.1]
[ 1.  3.3 -1.9 -4.3]]
⼆值化:
[[ 1.  0.  1.  0.]
[ 0.  1.  0.  1.]
[ 0.  1.  0.  0.]]
⼩结:
⼆值化之后的数据点都是0或者1,所以叫做⼆值化。
计算⽅法是,将所有⼤于threshold的数据都改为1,⼩于等于threshold的都设为0
经常⽤于出现某种特征(⽐如设为1),或者没有出现某种特征(设为0)的应⽤场合。
5. 独热编码(One-Hot Encoding)
通常,需要处理的数值都是稀疏地,散乱地分布在空间中,但我们并不需要存储这些⼤数值,这时就需要使⽤独热编码,独热编码实际上是⼀种收紧特征向量的⼯具。
data = np.array([[0, 2, 1, 12],
[1, 3, 5, 3],
[2, 3, 2, 12],
[1, 2, 4, 3]])  # 原始数据矩阵 shape=(4,4)
encoder = preprocessing.OneHotEncoder()
encoder.fit(data)
encoded_vector = ansform([[2, 3, 5, 3]]).toarray()
print(encoded_vector.shape)
print(encoded_vector)
代码运⾏结果:
(1, 11)
[[0. 0. 1. 0. 1. 0. 0. 0. 1. 1. 0.]]
⼩结:
独热编码可以缩⼩特征向量的维度,将稀疏的,散乱的数据集(⽐如代码块中的data,shape=(4,4))收缩为11维致密矩阵(如输出结果,shape=(1,11))
编码⽅式为:根据原始数据集data构建编码器encoder,⽤编码器来对新数据进⾏编码。
⽐如,第0列有三个不同值(0,1,2),故⽽有三个维度,即0=100,1=010,2=001;
同理,第1列有两个不同值(2,3),故⽽只有两个维度,即2=10,3=01;
图灵奖同理,第2列有四个不同值(1,5,2,4),故⽽有四个维度,即1=1000,2=0100,4=0010,5=0001
同理,第3列有两个不同值(3,12),故⽽只有两个维度,即3=10,12=01
所以在⾯对新数据[[2,3,5,3]]时,第0列的2就对应于001,第1列的3对应于01,第2列的5对应于0001,第3列的3对应于10,连接起来后就是输出的这个(1,11)矩阵,即为独热编码后的致密矩阵。
播种希望的种子如果⾯对的新数据不存在上⾯的编码器中,⽐如[[2,3,5,4]]时,4不存在于第3列(只有两个离散值3和12),则输出为00,连接起来后是[[0. 0. 1. 0. 1. 0. 0. 0. 1. 0. 0.]],注意倒数第⼆个数字变成了0 .
6.标记编码
天然气工业期刊
#创建标记编码器
label_encoder=preprocessing.LabelEncoder()
#⽤数据训练编码器
data=['name','id','health','weight','high','grade']
label_encoder.fit(data)
for i,item in enumerate(label_encoder.classes_):
print("%7s--->%d"%(item,i))
labels=['name','grade']
encoded_labels=ansform(labels)
print("\nlabels = ",labels)
print("encoded labels = ",encoded_labels)
encoded_labels=[1,2,5,3]
labels=label_encoder.inverse_transform(encoded_labels)
print("\nencoded labels",encoded_labels)
print("labels",labels)
代码运⾏结果:
grade--->0
health--->1
high--->2
id--->3
name--->4
weight--->5
wikipedia
labels =  ['name', 'grade']
encoded labels =  [4 0]
encoded labels [1, 2, 5, 3]
labels ['health' 'high' 'weight' 'id']

本文发布于:2024-09-21 14:25:34,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/147140.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

上一篇:LDPC编码原理
下一篇:信道编码技术
标签:数据   特征   数值
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议