機器學習中,資料歸一化是非常重要,如果不進行資料歸一化,可能會導致模型壞掉或者訓練出乙個奇怪的模型。
現在有乙個訓練資料集,包含兩個樣本,內容如下:
腫瘤大小(cm)
發現時間(day)
樣本11
200樣本2
5100
以 k-近鄰演算法為例,「發現時間」的數值比「腫瘤大小」的數值大很多,樣本間的距離被「發現時間」主導,訓練出來的模型主要由「發現時間」影響,甚至「腫瘤大小」的影響可忽略不計。
解決方法就是將是資料對映到同一尺度,這就是資料歸一化。
資料歸一化的兩個常用方式為:最值歸一化和均值方差歸一化。
最值歸一化就是將資料對映到 0~1 之間,適用於資料分布有明顯邊界的情況。將樣本的特徵值減去該特徵的最小值,再除以該特徵的取值區間,對應的數學公式為:
$$ x_ = \frac}-x_} $$
使用np.random
生成乙個 50*2 的二維整形陣列,並轉換成浮點型:
對於第一列資料,$x_$ =import numpy as np
x = np.random.randint(0, 100, size=(50, 2))
x = np.array(x, dtype=float)
np.min(x[:, 0])
,$x_$ =np.max(x[:, 0])
:
x[:, 0] = (x[:, 0] - np.min(x[:, 0])) / (np.max(x[:, 0]) - np.min(x[:, 0]))
第二列資料同理:
x[:, 1] = (x[:, 1] - np.min(x[:, 1])) / (np.max(x[:, 1]) - np.min(x[:, 1]))
此時樣本的所有特徵值都在 0~1 之間。
均值方差歸一化就是把所有資料歸一到均值為0、方差為1的分布中。對於資料分布有無明顯邊界都適用。數學公式為:
$$ x_ = \frac} $$
$x_$:特徵均值,$s$:特徵方差。
同樣使用np.random
生成乙個 50*2 的二維整形陣列,並轉換成浮點型:
對於第一列資料,$x_$ =x2 = np.random.randint(0, 100, size=(50, 2))
x2 = np.array(x2, dtype=float)
np.mean(x2[:, 0])
,$s$ =np.std(x2[:, 0])
:
x2[:, 0] = (x2[:, 0] - np.mean(x2[:, 0])) / np.std(x2[:, 0])
第二列資料同理:
x2[:, 1] = (x2[:, 1] - np.mean(x2[:, 1])) / np.std(x2[:, 1])
可以檢視 x2 各列的均值非常接近0,方差非常接近1:
前面都是在對訓練資料集進行歸一化處理,而對測試資料集的歸一化處理有所不同。由於測試資料是在模擬真實環境,而在真實環境中很難拿到所有的測試資料的均值和方差,此時將測試資料集也進行上面的操作是錯誤的,正確的方法是利用訓練資料集歸一化的資料。# np.mean(x2[:, 0])
-4.440892098500626e-18
# np.mean(x2[:, 1])
-1.2878587085651815e-16
# np.std(x2[:, 0])
0.9999999999999999
# np.std(x2[:, 1])
0.9999999999999999
如測試資料集的最值歸一化處理為:
$$ test_ = \frac}-min_} $$
測試資料集的均值方差歸一化處理為:
$$ test_ = \frac}} $$
以均值方差歸一化處理為例,scikit learn 中封裝了 standardscaler 類用於訓練資料集和測試資料集的歸一化處理。
以鳶尾花的資料為例:
standardscaler 類位於 preprocessing 模組中:import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
iris = datasets.load_iris()
x = iris.data
y = iris.target
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
將訓練資料傳入from sklearn.preprocessing import standardscaler
standardscaler = standardscaler()
fit()
方法中,該方法會儲存訓練資料的方差和均值,並返回 standardscaler 例項本身:
standardscaler.fit(x_train)
其中mean_
、scale_
屬性儲存了均值和方差:
接著可以向# standardscaler.mean_
array([5.83416667, 3.08666667, 3.70833333, 1.17 ])
# standardscaler.scale_
array([0.81019502, 0.44327067, 1.76401924, 0.75317107])
transform()
方法中傳入訓練資料和測試資料獲取歸一化處理後的資料:
github | ml-algorithms-actionx_train = standardscaler.transform(x_train)
x_test = standardscaler.transform(x_test)
機器學習之 歸一化
之前我們討論了幾個機器學習的模型,線性回歸模型 linear regression 和邏輯回歸模型 logistic regression 這一次我們討論一下關於模型資料擬合的問題以及歸一化方法 regularization 過擬合問題 the problem of overfitting 如果我們...
筆記 機器學習之資料歸一化
在分類的時候需要進行資料歸一化 那麼為什麼要進行資料歸一化?像是腫瘤情況,當時間單位是天,大小單位是厘公尺,由於時間的跨度比大小的跨度差值大的太多,會導致樣本間的距離被時間所主導,同理,將時間變成以年為單位一樣會因為差值太大而導致模型不行 所謂的資料歸一化就是將所有的資料對映到同一尺度中 這說到了最...
機器學習 資料歸一化
機器學習中,在資料預處理過程中,通過將資料歸一化可以加快梯度下降求最優解的速度,也有可能提高模型計算的精度。常用的歸一化方法主要有兩種 最值歸一化。比如把最大值歸一化成1,最小值歸一化成 1 或把最大值歸一化成1,最小值歸一化成0。適用於本來就分布在有限範圍內的資料。其中常用的方法有 線性比例變換法...