成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

機器學(xué)習(xí)之數(shù)據(jù)歸一化

W4n9Hu1 / 1114人閱讀

摘要:機器學(xué)習(xí)中,數(shù)據(jù)歸一化是非常重要,如果不進行數(shù)據(jù)歸一化,可能會導(dǎo)致模型壞掉或者訓(xùn)練出一個奇怪的模型。解決方法就是將是數(shù)據(jù)映射到同一尺度,這就是數(shù)據(jù)歸一化。數(shù)據(jù)歸一化的兩個常用方式為最值歸一化和均值方差歸一化。

機器學(xué)習(xí)中,數(shù)據(jù)歸一化是非常重要,如果不進行數(shù)據(jù)歸一化,可能會導(dǎo)致模型壞掉或者訓(xùn)練出一個奇怪的模型。

為什么要進行數(shù)據(jù)歸一化

現(xiàn)在有一個訓(xùn)練數(shù)據(jù)集,包含兩個樣本,內(nèi)容如下:

腫瘤大?。╟m) 發(fā)現(xiàn)時間(day)
樣本1 1 200
樣本2 5 100

以 k-近鄰算法為例,“發(fā)現(xiàn)時間”的數(shù)值比“腫瘤大小”的數(shù)值大很多,樣本間的距離被“發(fā)現(xiàn)時間”主導(dǎo),訓(xùn)練出來的模型主要由“發(fā)現(xiàn)時間”影響,甚至“腫瘤大小”的影響可忽略不計。

解決方法就是將是數(shù)據(jù)映射到同一尺度,這就是數(shù)據(jù)歸一化。

數(shù)據(jù)歸一化的兩個常用方式為:最值歸一化均值方差歸一化。

最值歸一化(normalization)

最值歸一化就是將數(shù)據(jù)映射到 0~1 之間,適用于數(shù)據(jù)分布有明顯邊界的情況。將樣本的特征值減去該特征的最小值,再除以該特征的取值區(qū)間,對應(yīng)的數(shù)學(xué)公式為:

$$ x_{scale} = frac{x-x_{min}}{x_{max}-x_{min}} $$

使用 np.random 生成一個 50*2 的二維整形數(shù)組,并轉(zhuǎn)換成浮點型:

import numpy as np

X = np.random.randint(0, 100, size=(50, 2))
X = np.array(X, dtype=float)

對于第一列數(shù)據(jù),$x_{min}$ = np.min(X[:, 0]),$x_{max}$ = np.max(X[:, 0])

X[:, 0] = (X[:, 0] - np.min(X[:, 0])) / (np.max(X[:, 0]) - np.min(X[:, 0]))

第二列數(shù)據(jù)同理:

X[:, 1] = (X[:, 1] - np.min(X[:, 1])) / (np.max(X[:, 1]) - np.min(X[:, 1]))

此時樣本的所有特征值都在 0~1 之間。

均值方差歸一化(standardization)

均值方差歸一化就是把所有數(shù)據(jù)歸一到均值為0、方差為1的分布中。對于數(shù)據(jù)分布有無明顯邊界都適用。數(shù)學(xué)公式為:

$$ x_{scale} = frac{x-x_{mean}}{s} $$

$x_{mean}$:特征均值,$s$:特征方差。

同樣使用 np.random 生成一個 50*2 的二維整形數(shù)組,并轉(zhuǎn)換成浮點型:

X2 = np.random.randint(0, 100, size=(50, 2))
X2 = np.array(X2, dtype=float)

對于第一列數(shù)據(jù),$x_{mean}$ = np.mean(X2[:, 0]),$s$ = np.std(X2[:, 0])

X2[:, 0] = (X2[:, 0] - np.mean(X2[:, 0])) / np.std(X2[:, 0])

第二列數(shù)據(jù)同理:

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
對測試數(shù)據(jù)集進行歸一化處理

前面都是在對訓(xùn)練數(shù)據(jù)集進行歸一化處理,而對測試數(shù)據(jù)集的歸一化處理有所不同。由于測試數(shù)據(jù)是在模擬真實環(huán)境,而在真實環(huán)境中很難拿到所有的測試數(shù)據(jù)的均值和方差,此時將測試數(shù)據(jù)集也進行上面的操作是錯誤的,正確的方法是利用訓(xùn)練數(shù)據(jù)集歸一化的數(shù)據(jù)。

如測試數(shù)據(jù)集的最值歸一化處理為:

$$ test_{scale} = frac{test-min_{train}}{max_{train}-min_{train}} $$

測試數(shù)據(jù)集的均值方差歸一化處理為:

$$ test_{scale} = frac{test-mean_{train}}{s_{train}} $$

以均值方差歸一化處理為例,Scikit Learn 中封裝了 StandardScaler 類用于訓(xùn)練數(shù)據(jù)集和測試數(shù)據(jù)集的歸一化處理。

以鳶尾花的數(shù)據(jù)為例:

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()

將訓(xùn)練數(shù)據(jù)傳入 fit() 方法中,該方法會保存訓(xùn)練數(shù)據(jù)的方差和均值,并返回 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ùn)練數(shù)據(jù)和測試數(shù)據(jù)獲取歸一化處理后的數(shù)據(jù):

X_train = standardScaler.transform(X_train)
X_test = standardScaler.transform(X_test)
源碼地址

Github | ML-Algorithms-Action

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/44882.html

相關(guān)文章

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<