【机器学习】数据归一化——MinMaxScaler理解
前言
前阵在查sklearn
的归一化方法MinMaxScaler
的时候,发现找到的文章解释的一塌糊涂,一般都是扔个公式加一堆代码就敷衍了事了,所以这次写一篇讲述MinMaxScaler
核心功能的文章。
公式
会查MinMaxScaler
的基本上都应该理解数据归一化,本质上是将数据点映射到了[0,1]
区间(默认),但实际使用的的时候也不一定是到[0,1]
,你也可以指定参数feature_range
,映射到其他区间,这个后面再讲。
首先了解该计算公式:
X
s
t
d
=
X
−
X
.
m
i
n
(
a
x
i
s
=
0
)
X
.
m
a
x
(
a
x
i
s
=
0
)
−
X
.
m
i
n
(
a
x
i
s
=
0
)
X
s
c
a
l
e
d
=
X
s
t
d
∗
(
m
a
x
−
m
i
n
)
+
m
i
n
X_{std} = \frac{X - X.min(axis=0)}{X.max(axis=0) - X.min(axis=0)}\\ X_{scaled} = X_{std} * (max - min) + min
Xstd=X.max(axis=0)−X.min(axis=0)X−X.min(axis=0)Xscaled=Xstd∗(max−min)+min
乍看一下很懵逼,解释一下:
- X:要归一化的数据,通常是二维矩阵,例如
[[4,2,3] [1,5,6]]
- X.min(axis=0):每列中的最小值组成的行向量,如上面的例子中应该是
[1,2,3]
- X.max(axis=0):每列中的最大值组成的行向量,如上面的例子中应该是
[4,5,6]
- max: 要映射到的区间最大值,默认是1
- min:要映射到的区间最小值,默认是0
- X s t d X_{std} Xstd: 标准化结果
- X s c a l e d X_{scaled} Xscaled: 归一化结果
再用朴实的语言描述一下上面公式所做的事:
- 第一步求每个列中元素到最小值距离占该列最大值和最小值距离的比例,这实际上已经是将数据放缩到了[0,1]区间上
- 第二步将标准化的数据映射到给定的
[min,max]
区间
实例
有了上面的基础,我们用代码实现一下这个归一化过程:
from sklearn.preprocessing import MinMaxScaler
import numpy as np
data = np.array([[4,2,3],
[1,5,6]])
# 手动归一化
feature_range = [0,1] # 要映射的区间
print(data.min(axis=0))
print(data.max(axis=0))
x_std = (data-data.min(axis=0))/(data.max(axis=0)-data.min(axis=0))
x_scaled = x_std*(feature_range[1]-feature_range[0]) + feature_range[0]
print('手动归一化结果:\n{}'.format(x_scaled))
# 自动归一化
scaler = MinMaxScaler()
print('自动归一化结果:\n{}'.format(scaler.fit_transform(data)))
手动归一化的部分就是按照公式的,没什么好说,这里简要说一下sklearn。preprocessing.MinMaxScaler
的用法,简单来说只有两步:
- 初始化一个
MinMaxScaler
对象:scaler = MinMaxScaler()
- 拟合并转换数据,本质上就是先求最大最小值,然后对数据按照公式计算:
scaler.fit_transform(data)
前面说了,我们还可以将数据映射到[0,1]
以外的区间,如下代码:
scaler2 = MinMaxScaler(feature_range=[1,2])
print('自动归一化结果:\n{}'.format(scaler2.fit_transform(data)))
上一篇: 数据理解常用函数
下一篇: 机器学习模型保存与持久化
推荐阅读