文章目录
机器学习 — 数据预处理:标准化/归一化
机器学习笼统的过程可以理解为:利用样本集来训练模型,用生成好的模型来预测新样本。
完整详细的过程为:
- 数据收集
- 数据预处理
- 模型建立及评估
- 模型预测新样本
数据预处理阶段又包括:特征提取,特征降维、特征空值处理、特征转换、数值特征标准化;目标值空值处理
(其中常用的是:降维、空值、特征转换、标准化)
本篇博客将着重讲解数值特征标准化。
一、归一化,标准化,中心化的概念
首先我们先了解一下归一化、标准化、中心化的概念。
数据归一化是数据标准化的一种典型做法,即将数据统一映射到[0,1]区间上.数据的标准化是指将数据按照比例缩放,使之落入一个特定的区间。
- 归一化:
归一化是将数据映射到 [0,1] 或者 [-1, 1] 区间。一来可以方便计算,二来可以消除不同特征量纲的影响,无量纲化可以直接纯数值计算 - 标准化:
标准化是将数据映射为均值是0,标准差是1的正态分布数据。该方法常用于SVM,LR,神经网络等模型中。 - 中心化:
中心化相比于标准化更简单一些,只将数据映射到均值为0的新数据中,无需满足标准差为1的条件。
中心化相对较为简单,转化公式为 x = x - mean,不做详述,下面主要介绍归一化和标准化。
归一化和标准化的区别:
不同点:
- 首先从两者的定义上可以看出不一样;
- 其次归一化后的值只受原样本数据里的极值影响,而标准化后映射的值受原数据里每一个样本的影响。
- 标准化是对特征矩阵里的列数据做处理,通过 z-score 变换转为标准正态分布数据,和整体样本分布相关。
相同点:
- 都是对某个特征(column)进行缩放(scaling)而不是对某个样本的特征向量(row)进行缩放
- 都是消除了量纲的影响
- 都是一种线性变换,都是对向量 X 按照比例压缩再进行平移
二、标准化/归一化的好处
- 避免过拟合
- 提升模型精度
- 提升收敛速度
三、标准化/归一化的方法
有两种常用的数据标准化的方法:min-max标准化,Z-score标准化方法
1、min-max标准化
-
定义:
也称为离差标准化,是对原始数据的线性变换,使得结果映射到0-1之间。 -
公式:
(X - min)/(max - min)
其中:max为样本数据的最大值,min为样本数据的最小值。 -
缺陷:
当有新数据加入时,可导致max和min的变化,需要重新定义。 -
sklearn代码实现:
- 通过创建类MinMaxScaler()
from sklearn import preprocessing
# 定义MinMaxScaler标准化类
min_max_scaler = preprocessing.MinMaxScaler()
# 用训练集数据训练scaler,并标准化训练集数据
X_train_minmax = min_max_scaler.fit_transform(data)
- 下面举个例子方便大家理解:
原始的数据如下,样本数据中含有两个特征:
特征1 | 特征2 |
---|---|
90 | 50 |
70 | 40 |
80 | 60 |
标准化的过程如下:
特征1 | 特征2 |
---|---|
(90 - 70) / (90 - 70) | (50 - 40 ) / (60 - 40) |
(70 - 70) / (90 - 70) | (40 - 40 ) / (60 - 40) |
(80 - 70) / (90 - 70) | (60 - 40 ) / (60 - 40) |
得到的结果如下:
特征1 | 特征2 |
---|---|
1 | 0.5 |
0 | 0 |
0.5 | 1 |
此demo的对应完整代码:
import numpy as np
from sklearn import preprocessing
# 构建训练数据
X = np.array([[90, 50], [70, 40], [80, 60]])
# 定义MinMaxScaler标准化类
min_max_scaler = preprocessing.MinMaxScaler()
# 用训练集数据训练scaler,并标准化训练集数据
X_train_minmax = min_max_scaler.fit_transform(X)
print(X_train_minmax)
运行结果:
X_train_minmax:
[[1. 0.5]
[0. 0. ]
[0.5 1. ]]
2、0均值标准化(Z-score standardization)
- 定义:这种方法用原始数据的均值(mean)和标准差(standard deviation)进行数据的标准化。经过处理的数据符合标准正态分布,即均值为0,标准差为1。如果数据的分布本身就服从 正 态 分 布 \color{red}正态分布 正态分布,就可以用这个方法。
- 本质:把有量纲表达式变成无量纲表达式。
- 转换函数:x =(x - μ) / σ
其中,μ为所有样本数据的均值。σ 为所有样本数据的标准差。 - sklearn代码实现:
- 通过创建类StandardScaler
# 数据标准化
# 用训练集数据训练scaler
scaler = preprocessing.StandardScaler().fit(data)
# 用scaler转换训练集
X_scaled = scaler.transform(data)
- 举个例子:
原始的数据如下,样本数据中含有两个特征:
特征1 | 特征2 |
---|---|
90 | 50 |
70 | 40 |
80 | 60 |
标准化的过程如下:
特征1:
均值 = 80,方差 = 200/3,标准差 = 8.165
特征2:
均值 = 50,方差 = 200/3,标准差 = 8.165
- 去均值
特征1 | 特征2 |
---|---|
(90 - 80) | (50 - 50 ) |
(70 - 80) | (40 - 50 ) |
(80 - 80) | (60 - 50 ) |
- 标准化:
特征1 | 特征2 |
---|---|
10 / 8.165 | 0 / 8.165 |
-10 /8.168 | -10 / 8.165 |
0 / 8.165 | 10 / 8.165 |
得到的结果如下:
特征1 | 特征2 |
---|---|
1.2247 | 0 |
-1.2247 | -1.2247 |
0 | 1.2247 |
此demo的对应完整代码:
import numpy as np
from sklearn import preprocessing
# 构建训练数据
X = np.array([[90, 50], [70, 40], [80, 60]])
scaler = preprocessing.StandardScaler().fit(X)
# 用scaler转换训练集
X_scaled = scaler.transform(X)
print(X_scaled)
运行结果:
X_scaled:
[[ 1.22474487 0. ]
[-1.22474487 -1.22474487]
[ 0. 1.22474487]]
四、保存标准化模型
以上两种标准化方法都可以把根据训练集标准化好的标准化模型保存下来,在进行新样本预测的时候,用保存好的标准化模型去标准化新样本,标准化之后再进行预测。
为什么要进行这一步骤?
因为使用机器学习训练得到的模型是在标准化之后的数据上面,即这些数据相比与原始的数据经过了一系列的变换。所以当使用机器学习的模型去预测新样本,也需要事先用标准化的模型去标准化新样本。
整体代码如下
- 根据训练集的数据得到标准化的模型
from sklearn import preprocessing
import joblib as jl
# 数据标准化
# 用训练集数据训练scaler
scaler = preprocessing.StandardScaler().fit(data)
# 用训练好的scaler去标准化训练集的数据
X_scaled = scaler.transform(data)
# 保存数据标准化的模型
jl.dump(scaler, '../../docs/scaler/scaler.pkl')
- 用第一步生成好的标准化模型去标准化新样本数据:
import joblib as jl
# 加载数据标准化的模型
scaler = jl.load('../../docs/scaler/scaler.pkl')
# 标准化新样本
sample_scaler = scaler.transform(sample)
# 用机器学习的分类器去预测新样本
label = clf.predict(sample_scaler)
标准化的Scaler其实也可以理解为模型:
- 机器学习根据算法学得的模型用来拟合/预测样本类别
- 标准化的Scaler模型是用来处理变换数据
详细保存与加载模型用法
参考博客:https://blog.csdn.net/pentiumCM/article/details/104370401