数据预处理技术
机器是看不懂绝大部分原始数据的,为了让让机器看懂,需要将原始数据进行预处理。
- 引入模块和数据
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]])
#第0轴长度为3,第1轴长度为4
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 知识前备
线性变换的特征向量(本征向量)是一个非简并的向量,其方向在该变换下不变。该向量在此变换下缩放的比例称为其特征值(本征值)。
一个线性变换通常可以由其特征值和特征向量完全描述。特征空间是相同特征值的特征向量的集合
特征向量外文名 Eigenvector
公式:Av=λv (A:矩阵(即变换),v:特征向量(在满足等式的情况下),λ:特征值(在满足等式的情况下))
- 标准化处理
即保证特征均值为0(均值移除)
数据标准化主要功能就是消除变量间的量纲关系,从而使数据具有可比性,一般标准化采用的是Z标准化,即均值为0,方差为1
data_standardized=preprocessing.scale(data)
print ("原始data\n",data)
print ("\n经过标准化处理的data\n",data_standardized)
print ("\n原始:mean = ",data.mean(axis=0))
print ("\n经过标准化处理:mean = ",data_standardized.mean(axis=0))
print ("\n原始:std deviation = ",data.std(axis=0))
print ("\n进过标准化处理:std deviation = ",data_standardized.std(axis=0))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
代码运行结果:
原始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.16920677 -0.86687558]
[-1.06904497 0.84543708 0.10439346 1.40111286]
[-0.26726124 0.55907936 -1.27360023 -0.53423728]]
原始:mean = [ 1.33333333 1.93333333 0.13333333 -2.53333333]
经过标准化处理:mean = [ 5.55111512e-17 -1.11022302e-16 0.00000000e+00 -7.40148683e-17]
原始:std deviation = [ 1.24721913 2.44449495 1.596524 3.30689515]
进过标准化处理:std deviation = [ 1. 1. 1. 1.]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 范围缩放
数据中的数值变化范围可能会很大,将范围缩放到合适的大小是非常重要的。
data_scaler=preprocessing.MinMaxScaler(feature_range=(0,1))
data_scaled=data_scaler.fit_transform(data)
print ("原始:\n",data)
print("\n经过范围缩放:\n",data_scaled)
- 1
- 2
- 3
- 4
代码运行结果:
原始:
[[ 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.56410256 1. ]
[ 0.33333333 0.87272727 0. 0.14666667]]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
归一化
归一化和标准化的区别
归一化特点
对不同特征维度的伸缩变换的目的是使各个特征维度对目标函数的影响权重是一致的,即使得那些扁平分布的数据伸缩变换成类圆形。
这也就改变了原始数据的一个分布。
好处:
1 提高迭代求解的收敛速度
2 提高迭代求解的精度
标准化特点
对不同特征维度的伸缩变换的目的是使得不同度量之间的特征具有可比性。同时不改变原始数据的分布。
好处:
1 使得不同度量之间的特征具有可比性,对目标函数的影响体现在几何分布上,而不是数值上
2 不改变原始数据的分布。
data_normalized=preprocessing.normalize(data,norm='l1')
print("原始:\n",data)
print("归一化后:\n",data_normalized)
- 1
- 2
- 3
- 4
代码运行结果:
原始:
[[ 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]]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 二值化
将数值特征向量转换为布尔类型向量。
data_binarized=preprocessing.Binarizer(threshold=1.4).transform(data)#小于等于1.4的为0,其余为1
print("原始:\n",data)
print("二值化:\n",data_binarized)
- 1
- 2
- 3
代码运行结果:
原始:
[[ 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.]]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 独热编码
对矩阵由上至下通过遍历每一行,若该行有n个不同数值,则在独热编码中占有n个只能是0或1且只能1个1.
好处是将稀疏散乱的矩阵收紧。
encoder=preprocessing.OneHotEncoder()
encoder.fit([[0,2,1,12],[1,3,5,3],[2,3,2,12],[1,2,4,3]])
encoded_vector=encoder.transform([[2,3,5,3]]) #注意是[[ ]]
print(type(encoded_vector))
print ("encoded_vector =\n ",encoded_vector)
print ("encoded_vector = ",encoded_vector.toarray())
- 1
- 2
- 3
- 4
- 5
- 6
代码运行结果:
<class 'scipy.sparse.csr.csr_matrix'>
encoded_vector =
(0, 9) 1.0
(0, 8) 1.0
(0, 4) 1.0
(0, 2) 1.0
encoded_vector = [[ 0. 0. 1. 0. 1. 0. 0. 0. 1. 1. 0.]]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 标记编码
#(1).创建标记编码器
label_encoder=preprocessing.LabelEncoder()
#(2) 用数据训练编码器
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=label_encoder.transform(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)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
代码运行结果:
grade--->0
health--->1
high--->2
id--->3
name--->4
weight--->5
labels = ['name', 'grade']
encoded labels = [4 0]
encoded labels [1, 2, 5, 3]
labels ['health' 'high' 'weight' 'id']
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
<link href="https://csdnimg.cn/release/phoenix/template/css/markdown_views-ea0013b516.css" rel="stylesheet">
</div>
数据预处理技术
机器是看不懂绝大部分原始数据的,为了让让机器看懂,需要将原始数据进行预处理。
- 引入模块和数据
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]])
#第0轴长度为3,第1轴长度为4
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 知识前备
线性变换的特征向量(本征向量)是一个非简并的向量,其方向在该变换下不变。该向量在此变换下缩放的比例称为其特征值(本征值)。
一个线性变换通常可以由其特征值和特征向量完全描述。特征空间是相同特征值的特征向量的集合
特征向量外文名 Eigenvector
公式:Av=λv (A:矩阵(即变换),v:特征向量(在满足等式的情况下),λ:特征值(在满足等式的情况下))
- 标准化处理
即保证特征均值为0(均值移除)
数据标准化主要功能就是消除变量间的量纲关系,从而使数据具有可比性,一般标准化采用的是Z标准化,即均值为0,方差为1
data_standardized=preprocessing.scale(data)
print ("原始data\n",data)
print ("\n经过标准化处理的data\n",data_standardized)
print ("\n原始:mean = ",data.mean(axis=0))
print ("\n经过标准化处理:mean = ",data_standardized.mean(axis=0))
print ("\n原始:std deviation = ",data.std(axis=0))
print ("\n进过标准化处理:std deviation = ",data_standardized.std(axis=0))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
代码运行结果:
原始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.16920677 -0.86687558]
[-1.06904497 0.84543708 0.10439346 1.40111286]
[-0.26726124 0.55907936 -1.27360023 -0.53423728]]
原始:mean = [ 1.33333333 1.93333333 0.13333333 -2.53333333]
经过标准化处理:mean = [ 5.55111512e-17 -1.11022302e-16 0.00000000e+00 -7.40148683e-17]
原始:std deviation = [ 1.24721913 2.44449495 1.596524 3.30689515]
进过标准化处理:std deviation = [ 1. 1. 1. 1.]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 范围缩放
数据中的数值变化范围可能会很大,将范围缩放到合适的大小是非常重要的。
data_scaler=preprocessing.MinMaxScaler(feature_range=(0,1))
data_scaled=data_scaler.fit_transform(data)
print ("原始:\n",data)
print("\n经过范围缩放:\n",data_scaled)
- 1
- 2
- 3
- 4
代码运行结果:
原始:
[[ 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.56410256 1. ]
[ 0.33333333 0.87272727 0. 0.14666667]]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
归一化
归一化和标准化的区别
归一化特点
对不同特征维度的伸缩变换的目的是使各个特征维度对目标函数的影响权重是一致的,即使得那些扁平分布的数据伸缩变换成类圆形。
这也就改变了原始数据的一个分布。
好处:
1 提高迭代求解的收敛速度
2 提高迭代求解的精度
标准化特点
对不同特征维度的伸缩变换的目的是使得不同度量之间的特征具有可比性。同时不改变原始数据的分布。
好处:
1 使得不同度量之间的特征具有可比性,对目标函数的影响体现在几何分布上,而不是数值上
2 不改变原始数据的分布。
data_normalized=preprocessing.normalize(data,norm='l1')
print("原始:\n",data)
print("归一化后:\n",data_normalized)
- 1
- 2
- 3
- 4
代码运行结果:
原始:
[[ 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]]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 二值化
将数值特征向量转换为布尔类型向量。
data_binarized=preprocessing.Binarizer(threshold=1.4).transform(data)#小于等于1.4的为0,其余为1
print("原始:\n",data)
print("二值化:\n",data_binarized)
- 1
- 2
- 3
代码运行结果:
原始:
[[ 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.]]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 独热编码
对矩阵由上至下通过遍历每一行,若该行有n个不同数值,则在独热编码中占有n个只能是0或1且只能1个1.
好处是将稀疏散乱的矩阵收紧。
encoder=preprocessing.OneHotEncoder()
encoder.fit([[0,2,1,12],[1,3,5,3],[2,3,2,12],[1,2,4,3]])
encoded_vector=encoder.transform([[2,3,5,3]]) #注意是[[ ]]
print(type(encoded_vector))
print ("encoded_vector =\n ",encoded_vector)
print ("encoded_vector = ",encoded_vector.toarray())
- 1
- 2
- 3
- 4
- 5
- 6
代码运行结果:
<class 'scipy.sparse.csr.csr_matrix'>
encoded_vector =
(0, 9) 1.0
(0, 8) 1.0
(0, 4) 1.0
(0, 2) 1.0
encoded_vector = [[ 0. 0. 1. 0. 1. 0. 0. 0. 1. 1. 0.]]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 标记编码
#(1).创建标记编码器
label_encoder=preprocessing.LabelEncoder()
#(2) 用数据训练编码器
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=label_encoder.transform(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)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
代码运行结果:
grade--->0
health--->1
high--->2
id--->3
name--->4
weight--->5
labels = ['name', 'grade']
encoded labels = [4 0]
encoded labels [1, 2, 5, 3]
labels ['health' 'high' 'weight' 'id']
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
<link href="https://csdnimg.cn/release/phoenix/template/css/markdown_views-ea0013b516.css" rel="stylesheet">
</div>