關於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進行歸一化。
雖然,實驗很簡單,但是把問題搞清楚,希望對自己和大家都有所幫助

分享是一種生活的信念,明白了分享的同時,明白了存在的意義

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