數據預處理之數據歸一化
- 一、摘要
- 二、數據歸一化概念
- 三、數據歸一化實現方法
- 3.1 最值歸一化方法
- 3.2 均值方差歸一化方法
一、摘要
本文主要講述了數據歸一化(Feature Scaling)的重要性及其方法。首先通過腫瘤大小和發現時間的例子,說明了不同量綱特征在距離計算中可能導致偏差,從而引出數據歸一化的必要性。接著,介紹了最值歸一化(Normalization)的概念和方法,即將數據映射到0-1之間的尺度,并指出其適用于分布有明顯邊界的情況。最后,還指出了最值歸一化的一個缺點,即受異常值影響較大。
二、數據歸一化概念
- 歸一化是指一種簡化計算的方式,將數據經過處理之后限定到一定的范圍之內,一般都會將數據限定在[0,1]。數據歸一化可以加快算法的收斂速度,而且在后續的數據處理上也會比較方便。
- 數據歸一化的重要性:
- 數據歸一化是機器學習中非常重要的一步,也稱為特征縮放。
- 歸一化的目的是使數據在不同特征之間具有相同的尺度,以便更好地進行分類或其他機器學習任務。
- 另外,歸一化算法是一種
去量綱
的行為,關于量綱對于計算的影響可以舉這樣一個例子:使用腫瘤大小(厘米)和發現時間(天)作為特征進行分類。
未歸一化時,距離計算主要受發現時間影響,因為時間單位的差異導致數據尺度不同。通過調整時間單位為年,可以使得距離計算更準確地反映腫瘤大小的重要性。歸一化的作用就是去除這樣的量綱給計算帶來的影響。
三、數據歸一化實現方法
3.1 最值歸一化方法
- 最值歸一化將數據映射到0到1之間。
- 方法:對每個特征求最大值和最小值,然后使用公式(x - xmin) / (xmax - xmin)進行轉換。
- 適用于數據分布有明確邊界的情況,如
考試成績
或像素值
。 - 缺點:對異常值敏感,可能影響歸一化結果。
- 注意事項:
在執行歸一化的算法時有一個地方需要注意,因為公式 y=(x-MinValue)/(MaxValueMinValue)的分母是 MaxValue-MinValue,如果某一個字段的最大值和最小值是相同的,會出現分母為零
的情況。所以對于字段數據全部相同的情況要加以判斷,通常來講如果當前字段全部相等且為非零數值,就轉換為 1 來處理。如果當前字段全部數值都是 0,那就直接保留 0。 - 最值歸一化的實現
-
整型向量數據的歸一化代碼
import numpy as np # 隨機生成向量,其中每個向量的數值是0-100,生成100個 x = np.random.randint(0,100,size=100) # 根據最值歸一化公式,實現Int類型數據的歸一化 # 實現最值歸一化公式,返回結果是一個向量,其中每一個元素的值就處于[0,1]之間 (x - np.min(x)) / (np.max(x) - np.min(x))
在jupyter中執行結果:
-
浮點型矩陣數據的歸一化代碼
# 生成50x2的矩陣,其中數值都在0-100之間 X = np.random.randint(0,100,(50,2)) # 將整型的矩陣轉成浮點型矩陣 X = np.array(X,dtype=float) # 將X矩陣數據進行最值歸一化,由于矩陣的列數是2列,因此分別需要對矩陣的每一列進行最值歸一化處理,如有多列,則使用循環即可 for col in range(0,2):# 對X中每列進行最值歸一化X[:,col] = (X[:,col] - np.min(X[:,col])) / (np.max(X[:,col]) - np.min(X[:,col])) # 可以將X矩陣歸一化之后的數據繪制出來,驗證其中每列數值是否處于[0,1]之間 import matplotlib.pyplot as plt plt.scatter(X[:,0],X[:,1]) plt.show()
執行結果:
此時,可以看出圖中橫縱坐標的數值處于[0,1]之間,說明X矩陣的數據已經完成了最值歸一化。 -
查看X矩陣中的均值和方差
# 查看X矩陣方差 [(np.std(X[:,col])) for col in range(0,2)] # 查看X矩陣方差 [(np.std(X[:,col])) for col in range(0,2)]
執行結果:
-
3.2 均值方差歸一化方法
-
均值方差歸一化將數據轉換為均值為0,方差為1的分布。
-
方法:用每個特征減去均值,再除以方差。
S為方差,Xmean為均值。 -
適用于數據分布沒有明確邊界的情況,如收入分布。
-
優點:不受異常值影響,使數據分布更加合理。
-
代碼實現過:
-
實現步驟及效果:
- 生成隨機矩陣并進行均值方差歸一化。
- 步驟:求均值和方差,減去均值,再除以方差。
- 結果:
矩陣中的元素不保證在0到1之間,但均值為0,方差為1。
-
編寫代碼
X = np.random.randint(0,100,(50,2)) X = np.array(X,dtype=float) # 根據均值方差歸一化公式,實現X矩陣的均值方差歸一化實現代碼 for col in range(0,2):X[:,col] = (X[:,col] - np.mean(X[:,col])) / np.std(X[:,col]) # 繪制圖像查看效果 plt.scatter(X[:,0],X[:,1]) plt.show()
執行效果:
-
查看X矩陣中的均值和方差是否接近或等于0和1:
-
查看X矩陣的每列數據的均值是否接近或等于0
# 通過圖像查看并不是很直觀,因此,我們查看X矩陣的每列數據的均值是否接近或等于0 [(np.mean(X[:,col])) for col in range(0,2)]
執行結果:
浮點數精度限制:計算機在存儲和處理浮點數時存在精度限制。不同編程語言和系統對于浮點數的表示遵循 IEEE 754 標準,常見的單精度浮點數(float)通常有大約 7 位十進制有效數字,雙精度浮點數(double)大約有 15 - 16 位十進制有效數字。當一個數的絕對值小于計算機所能表示的最小非零浮點數時,就可能會出現下溢情況,計算機可能會將其當作 0 處理。不過, -1.3322676295501878e - 17 一般不會出現這種情況,大多數計算機環境能正常表示它。
實際應用場景的誤差容忍度:在許多實際的計算和應用中,我們會設定一個誤差范圍(也稱為容差)。如果一個數的絕對值小于這個容差,就可以將其當作 0 處理。例如,在數值計算、物理模擬等領域,為了簡化計算或者忽略極小的誤差,常常會這么做。以下是 Python 示例代碼,演示了如何根據容差判斷一個數是否近似為 0:num = -1.3322676295501878e-17 tolerance = 1e-15 if abs(num) < tolerance:print("在給定容差范圍內,該數近似為 0") else:print("該數不等于 0")
-
查看X矩陣的每列數據的方差是否接近或等于1
# 通過圖像查看并不是很直觀,因此,我們查看X矩陣的每列數據的方差是否接近或等于1 [(np.std(X[:,col])) for col in range(0,2)]
執行結果:
-
-