MinMaxScaler

MinMaxScaler

class sklearn.preprocessing.MinMaxScaler(feature_range=(0, 1), copy=True)

一、功能

将每个元素(特征,feature)转换成给定范围的值。

该估计器(estimator)分别缩放和转换每个特征,以使其处于训练集的给定范围内,例如
在区间[0,1]。

转换原理如下:

1
2
X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))
X_scaled = X_std * (max - min) + min

其中min,max=feature_range。

实际转换是按照如下过程进行的:

1
2
X_scaled = scale * X + min - X.min(axis=0) * scale
where scale = (max - min) / (X.max(axis=0) - X.min(axis=0))

以上内容来自scikit-learn官方文档

二、如何利用MinMaxScaler对数据进行放缩

1. 将数据放缩至给定区间

? fit(self, X[, y]):计算给定数据集X的最大/小值用于之后的放缩(这一步没有进行放缩)

? transform(self, X):将数据集X放缩至给定区间

example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>> from sklearn.preprocessing import MinMaxScaler
>>> data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
>>> scaler = MinMaxScaler()
>>> print(scaler.fit(data))
MinMaxScaler()
>>> print(scaler.data_max_)
[ 1. 18.]
>>> print(scaler.transform(data))
[[0.   0.  ]
 [0.25 0.25]
 [0.5  0.5 ]
 [1.   1.  ]]
>>> print(scaler.transform([[2, 2]]))
[[1.5 0. ]]

? fit_transform(self, X[, y]):计算并将数据放缩至给定区间,相当于fit()+transform()

2. 恢复给定区间的数据

? inverse_transform(self, X):根据给定范围(feature_range)恢复数据

三、为什么要改变计算方式

MinMaxScaler()有两个属性:min_scale_

  • **min_**ndarray of shape (n_features,)

    Per feature adjustment for minimum. Equivalent to min - X.min(axis=0) * self.scale_

  • **scale_**ndarray of shape (n_features,)

    Per feature relative scaling of the data. Equivalent to (max - min) / (X.max(axis=0) - X.min(axis=0))

可以看到,通过它们计算X_scaled也就简化为了下面这个式子:

1
X_scaled = self.scale_ * X + self.min_

可逆的,将数据恢复至原来的数量级也变得非常容易了。

四、结语

可见,对于一个范围(feature_range)内的数据,是可以用一个MinMaxScaler进行放缩的。即使他们不是同一个数组。所以对于ML、DL预测任务而言,

  1. 可以对原始数据利用MinMaxScaler放缩,加快训练过程;
  2. 测试时,预测结果可以使用同一个MinMaxScaler对象恢复到实际数据范围。因为标准化后的数据往往很难看出有什么实际的意义。