引言
由於目前網上似乎沒有博客詳細介紹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進行歸一化。
雖然,實驗很簡單,但是把問題搞清楚,希望對自己和大家都有所幫助
分享是一種生活的信念,明白了分享的同時,明白了存在的意義