关于Sklearn的归一化函数MinMaxScalar探讨

关于Sklearn的归一化函数MinMaxScalar探讨

引言

由于目前网上似乎没有博客详细介绍Sklearn的归一化函数MinMaxScalar到底是如何实现数据归一化的,而笔者也不确定生成的scalar的对象能不能完成数据单一映射而对实验结果的精度造成影响,于是有了此篇文章。本文通过生成的格式化数据,对MinMaxScalar函数的处理机制进行了探讨和介绍。通过这篇文章,你可能会发现该函数的机制似乎和你想的不一样(手动滑稽)

正文

实验一

  • 第一步是导入包,然后生成一个4X4的矩阵如下
from sklearn.preprocessing import MinMaxScaler
import numpy as np

data = np.reshape(np.arange(0,16,1),(4,4))
print(data)

可以看到生成数据如下:

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]
  • 第二步,接着我们看一下,归一化后的数据长什么样子:
scalar = MinMaxScaler(feature_range=(0,1))
scalar_data = scalar.fit_transform(data)
print(scalar_data)

结果如下:

[[0.         0.         0.         0.        ]
 [0.33333333 0.33333333 0.33333333 0.33333333]
 [0.66666667 0.66666667 0.66666667 0.66666667]
 [1.         1.         1.         1.        ]]

你会惊讶发现,这个归一化是按照列元素进行的,因此我蒙逼了,这样对数据进行归一化,不会产生数据失真吗?对于每行来说,原来不同的数据,全部变成了同样的值(当然不会啦,按列归一化就是按feature元素进行归一化)。

  • 第三步,将数据反向映射回去
print(scalar.inverse_transform(scalar_data))
[[ 0.  1.  2.  3.]
 [ 4.  5.  6.  7.]
 [ 8.  9. 10. 11.]
 [12. 13. 14. 15.]]

从反归一化结果可以看出,该方法的确是按照列进行归一化的

实验二

  • 我们把scalar_data 在第0维上只取前3个元素(行元素),并反向归一化
scalar_data2=scalar_data[:3]
print(scalar_data2)
print(scalar.inverse_transform(scalar_data2))
[[0.         0.         0.         0.        ]
 [0.33333333 0.33333333 0.33333333 0.33333333]
 [0.66666667 0.66666667 0.66666667 0.66666667]]
[[ 0.  1.  2.  3.]
 [ 4.  5.  6.  7.]
 [ 8.  9. 10. 11.]]

可以发现,数据可以正确的反向还原

实验二

  • 我们把scalar_data 在第1维上只取前3个元素(列元素),并反向归一化
scalar_data3=scalar_data[:,:3]
print(scalar_data3)
print(scalar.inverse_transform(scalar_data3))
[[0.         0.         0.        ]
 [0.33333333 0.33333333 0.33333333]
 [0.66666667 0.66666667 0.66666667]
 [1.         1.         1.        ]]
Traceback (most recent call last):
  File "/home/jason/PycharmProjects/tf-rnn-attention/demo/testing_for_scalar.py", line 26, in <module>
    print(scalar.inverse_transform(scalar_data3))
  File "/home/jason/PycharmProjects/reiforcementLearning/venv/lib/python3.5/site-packages/sklearn/preprocessing/data.py", line 406, in inverse_transform
    X -= self.min_
ValueError: operands could not be broadcast together with shapes (4,3) (4,) (4,3) 

发现格式报错。

  • PS :我同时测试了一维数组和3维的张量,结果均报错,该方法传入数据必须为为2维矩阵
ValueError: Expected 2D array, got 1D array instead:
array=[ 0.  1.  2.  3.  4.  5.  6.  7.  8.  9. 10. 11. 12. 13. 14. 15.].
Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.

结论

好了,通过上面的简单实验,我们其实可以发现,MinMaxScalar按照列元素进行归一化,其实就是按照feature进行归一化。
虽然,实验很简单,但是把问题搞清楚,希望对自己和大家都有所帮助

分享是一种生活的信念,明白了分享的同时,明白了存在的意义

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章