【机器学习】sklearn 数据预处理笔记1
·
机器学习从入门到入职--用sklearn与Keras搭建人工智能模型
4.1数据预处理的种类
大致分为:缺失值处理,数据的标准化、规范化,稀疏化,特征编码,特征提取
4.2使用SimpleImputer缺失值处理
第四章4.1根据样本之间关联关系,及数据的行和列,用SimpleImputer方法进行缺失值处理,策略有均值插补、中位数插补和高频数插补。例子如下:
#引用相应的库,numpy用于生成缺失值,sklearn.impute库中的simpleimputer方法用预处理缺失值
import Numpy as np
from sklearn.impute import SimpleImputer
#初始化缺失值处理器,指定缺失值参数missing_values,默认np.nan
#以及缺失值补全策略参数strategy,采用均值补全
#另外还有中位数(median)、常数(constant)、最高频数(most_frequent)
imp_mean=SimpleImputer(missing_values=np.nan,strategy='mean')
imp_median=SimpleImputer(missing_values=np.nan,strategy='median')
imp_constant=SimpleImputer(missing_values=np.nan,strategy='constant')
imp_most_frequent=SimpleImputer(missing_values=np.nan,strategy='most_frequent')
X=[[13,22],[5,3],[7,np.nan],[np.nan,5],[3,7]]
#执行缺失值处理的步骤,在fit原始数据之后对其进行转换
imp_mean.fit(X)
imp_median.fit(X)
imp_constant.fit(X)
imp_most_frequent.fit(X)
print(u"均值处理结果如下")
print(imp_mean.transform(X))
print(u"中位数处理结果如下")
print(imp_median.transform(X))
print(u"最高频处理结果如下")
print(imp_most_frequent.transform(X))
输出如下
均值处理结果如下:
[[13. 22.][5. 3.][7. 9.25][7. 5.][3. 5.]]
中位数处理结果如下:
[[13. 22.][5. 3.][7. 6.][6. 5.][3. 7.]]
常数处理结果如下:
[[13. 22.][5. 3.][7. 0.][0. 5.][3. 7.]]
最高频处理结果如下:
[[13. 22.][5. 3.][7. 3.][3. 5.][3. 7.]]
4.3数据的规范化
4.3.1缩放规范化:最小值最大值缩放和最大绝对值缩放
1.Min-Max scaling将该样本每个特征下的最大值与最小值之差作为缩放倍数,每个特征下没有任何一个数会超过其最值之差,所以作为分母;分子是每个特征下的值与最小值之差。全为0的特征,缩放后值为0。取值范围[0,1]代码表现如下:
# 引用相应的库,numpy用于生成缺失值,引用sklearn.processing库,其中包含绝大部分数据与处理方法
from sklearn import preprocessing
import numpy as np
# 原始数据X
X = np.array([[3, -2., 2.], [2., 0., 0.], [-1, 1., 3.]]) # 按行表示,按列计算
# 初始化数据预处理器,本例中为最小最大值缩放
min_max_scaler = preprocessing.MinMaxScaler()
# 数据转换并打印
X_minmax = min_max_scaler.fit_transform(X)
print("缩放规范化结果如下:\n")
print(X_minmax)
# 输出其缩放倍数
print("输出其缩放倍数:\n")
print(min_max_scaler.scale_)
# 输出其最小值
print("输出每一列的最小调整:\n")
print(min_max_scaler.min_)
print("输出每一列的最小值:\n")
print(min_max_scaler.data_min_)
输出结果:
缩放规范化结果如下:
[[1. 0. 0.66666667]
[0.75 0.66666667 0. ]
[0. 1. 1. ]]
输出其缩放倍数:
[0.25 0.33333333 0.33333333]
输出每一列的最小调整:
[0.25 0.66666667 0. ]
输出每一列的最小值:
[-1. -2. 0.]
2.MAxAbsolute Scaling执行效率更高。它在分子上减少了减法运算,分母上也仅采用特征的最大值的绝对值。取值范围[-1,1],分布以0为中心,更稀疏、合理。代码实现如下:
# 引用相应的库,numpy用于生成缺失值,引用sklearn.processing库,其中包含绝大部分的数据与处理方法
from sklearn import preprocessing
import numpy as np
#原始数据X
X = np.array([[3, -2., 2.], [2., 0., 0.], [-1, 1., 3.]]) # 按行表示,按列计算
# 初始化数据预处理器,本例中为最大绝对值缩放
max_abs_scaler = preprocessing.MaxAbsScaler()
#数据转换并打印
X_maxabs=max_abs_scaler.fit_transform(X)
print(X_maxabs)
输出结果如下:
[[ 1. -1. 0.66666667]
[ 0.66666667 0. 0. ]
[-0.33333333 0.5 1. ]]
对于希望数据分布到特定的取值范围之间的特殊要求,MaxMin Scaling可以预先设置特定的范围,添加一个x_scale表示设定最大值与最小值之后的缩放变换输出(在第一块代码的基础上)
from sklearn import preprocessing
import numpy as np
# 原始数据X
X = np.array([[3, -2., 2.], [2., 0., 0.], [-1, 1., 3.]]) # 按行表示,按列计算
# 初始化数据预处理器,本例中为最小最大值缩放
min_max_scaler = preprocessing.MinMaxScaler()
# 变式 添加x_scale改变缩放变换输出
# 初始化数据预处理器,用MaxMinScaling配置feature——range可转化之后的输出范围
min_max_scaler=preprocessing.MinMaxScaler(feature_range=(-2,6))
# 数据转换并打印
X_minmax=min_max_scaler.fit_transform(X)
print("feature_range=-2,6")
print(X_minmax)
输出结果:
feature_range=-2,6
[[ 6. -2. 3.33333333]
[ 4. 3.33333333 -2. ]
[-2. 6. 6. ]]
该方法存在问题,一旦样本某特征的数值超出最大最小值的边界,转化后的特征值存在不稳定的情况(在第一块代码的基础上)
from sklearn import preprocessing
import numpy as np
# 原始数据X
X = np.array([[3, -2., 2.], [2., 0., 0.], [-1, 1., 3.]]) # 按行表示,按列计算
# 初始化数据预处理器,本例中为最小最大值缩放
min_max_scaler = preprocessing.MinMaxScaler()
# 引入新数据,数据超出边界,输出特征值不稳定
X_new=np.array([[-3.,-1.,4.]])
X_new_minmax=min_max_scaler.transform(X_new)
print("缩放规范化效果如下:")
print(X_new_minmax)
输出:
缩放规范化效果如下:
[[-6. 0.66666667 8.66666667]]
4.3.2标准化
标准化又称标准差规范化或Z标准化(Z_Score Normalization),对样本每个特征分别进行计算使其满足正态分布--均值0、标准差1,
# 引用相应的库,numpy用于生成缺失值,引用sklearn.processing库,其中包含绝大部分的数据与处理方法
from sklearn import preprocessing
import numpy as np
# 原始数据X
X=np.array([[3,-2.,2.],[2.,0.,0.],[1,2.,3.]])
# 初始化数据预处理器,用标准化缩放
standard_scaler=preprocessing.StandardScaler()
# 数据转换并打印
X_standard=standard_scaler.fit_transform(X)
print(u"标准化变换的结果如下:\n")
print(X_standard)
# 输出其均值
print(u"输出标准化变换之后的均值:\n")
print(X_standard.mean(axis=0))
# 输出其标准差
print(u"输出标准化之后的标准差:\n")
print(X_standard.std(axis=0))
输出结果
标准化变换的结果如下:
[[ 1.22474487 -1.22474487 0.26726124]
[ 0. 0. -1.33630621]
[-1.22474487 1.22474487 1.06904497]]
输出标准化变换之后的均值:
[ 0.00000000e+00 0.00000000e+00 -7.40148683e-17]
输出标准化之后的标准差:
[1. 1. 1.]
标准化转换后均值0,标准差1,满足标准正态分布
所有预处理方法都提供函数接口,函数调用代码实现如下:
# 标准化缩放函数化实现
X_standard=preprocessing.scale(X)
print(X_standard)
输出
标准化变换后结果如下
[[ 1.22474487 -1.22474487 0.26726124]
[ 0. 0. -1.33630621]
[-1.22474487 1.22474487 1.06904497]]
4.3.3范数规范化
范数基本概念这里不予赘述,L0,L1,L2和无穷范数
范数规范化代码如下
from sklearn import preprocessing
import numpy as np
# 原始数据X
X = np.array([[3, -2., 2.], [2., 0., 0.], [-1, 1., 3.]]) # 按行表示,按列计算
# 范数规范化的函数化实现,其中规范化系数norm为L2,还有其他形式,诸如L1,max
X_norm=preprocessing.normalize(X,norm='l2')
print(u"范数L2规范化变换后的输出:\n")
print(X_norm)
# 范数规范化的类实现,其中规范化系数norm为L1
normalizer=preprocessing.Normalizer(norm='l1').fit(X)
print(u"范数L1规范化变换之后的输出:\n")
print(normalizer.transform(X))
输出结果:
[[ 0.72760688 -0.48507125 0.48507125]
[ 1. 0. 0. ]
[-0.30151134 0.30151134 0.90453403]]
范数L1规范化变换之后的输出:
[[ 0.42857143 -0.28571429 0.28571429]
[ 1. 0. 0. ]
[-0.2 0.2 0.6 ]]
4.4非线性变换
4.4.1二值化变换
待更新。。。
更多推荐

所有评论(0)