機器學習之資料歸一化

2021-09-13 03:58:07 字數 3199 閱讀 3712

機器學習中,資料歸一化是非常重要,如果不進行資料歸一化,可能會導致模型壞掉或者訓練出乙個奇怪的模型。

現在有乙個訓練資料集,包含兩個樣本,內容如下:

腫瘤大小(cm)

發現時間(day)

樣本11

200樣本2

5100

以 k-近鄰演算法為例,「發現時間」的數值比「腫瘤大小」的數值大很多,樣本間的距離被「發現時間」主導,訓練出來的模型主要由「發現時間」影響,甚至「腫瘤大小」的影響可忽略不計。

解決方法就是將是資料對映到同一尺度,這就是資料歸一化。

資料歸一化的兩個常用方式為:最值歸一化均值方差歸一化

最值歸一化就是將資料對映到 0~1 之間,適用於資料分布有明顯邊界的情況。將樣本的特徵值減去該特徵的最小值,再除以該特徵的取值區間,對應的數學公式為:

$$ x_ = \frac}-x_} $$

使用np.random生成乙個 50*2 的二維整形陣列,並轉換成浮點型:

import numpy as np

x = np.random.randint(0, 100, size=(50, 2))

x = np.array(x, dtype=float)

對於第一列資料,$x_$ =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 的二維整形陣列,並轉換成浮點型:

x2 = np.random.randint(0, 100, size=(50, 2))

x2 = np.array(x2, dtype=float)

對於第一列資料,$x_$ =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 類用於訓練資料集和測試資料集的歸一化處理。

以鳶尾花的資料為例:

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)

standardscaler 類位於 preprocessing 模組中:

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()方法中傳入訓練資料和測試資料獲取歸一化處理後的資料:

x_train = standardscaler.transform(x_train)

x_test = standardscaler.transform(x_test)

github | ml-algorithms-action

機器學習之 歸一化

之前我們討論了幾個機器學習的模型,線性回歸模型 linear regression 和邏輯回歸模型 logistic regression 這一次我們討論一下關於模型資料擬合的問題以及歸一化方法 regularization 過擬合問題 the problem of overfitting 如果我們...

筆記 機器學習之資料歸一化

在分類的時候需要進行資料歸一化 那麼為什麼要進行資料歸一化?像是腫瘤情況,當時間單位是天,大小單位是厘公尺,由於時間的跨度比大小的跨度差值大的太多,會導致樣本間的距離被時間所主導,同理,將時間變成以年為單位一樣會因為差值太大而導致模型不行 所謂的資料歸一化就是將所有的資料對映到同一尺度中 這說到了最...

機器學習 資料歸一化

機器學習中,在資料預處理過程中,通過將資料歸一化可以加快梯度下降求最優解的速度,也有可能提高模型計算的精度。常用的歸一化方法主要有兩種 最值歸一化。比如把最大值歸一化成1,最小值歸一化成 1 或把最大值歸一化成1,最小值歸一化成0。適用於本來就分布在有限範圍內的資料。其中常用的方法有 線性比例變換法...