机器学习:数据归一化(Scaler)
數(shù)據(jù)歸一化(Feature Scaling)
一、為什么要進(jìn)行數(shù)據(jù)歸一化
- 原則:樣本的所有特征,在特征空間中,對樣本的距離產(chǎn)生的影響是同級的;
- 問題:特征數(shù)字化后,由于取值大小不同,造成特征空間中樣本點(diǎn)的距離會被個別特征值所主導(dǎo),而受其它特征的影響比較小;
- 例:特征1 = [1, 3, 2, 6, 5, 7, 9],特征2 = [1000, 3000, 5000, 2000, 4000, 8000, 3000],計(jì)算兩個樣本在特征空間的距離時,主要被特征2所決定;
- 定義:將所有的數(shù)據(jù)(具體操作時,對每一組特征數(shù)據(jù)進(jìn)行分別處理)映射到同一個尺度中;
- 歸一化的過程,是算法的一部分;
?
二、數(shù)據(jù)歸一化的方法
1)最值歸一化(normalization)
1、思路:把所有數(shù)據(jù)映射到0~1之間;
2、公式:
# x為數(shù)據(jù)集中每一種特征的值;
# 將數(shù)據(jù)集中的每一種特征都做映射;
3、特點(diǎn):多適用于分布有明顯邊界的情況;如考試成績、人的身高、顏色的分布等,都有范圍;而不是些沒有范圍約定,或者范圍非常大的數(shù)據(jù);
# 明顯邊界:同一特征的數(shù)據(jù)大小相差不大;不會出現(xiàn)大部分?jǐn)?shù)據(jù)在0~200之間,有個別數(shù)據(jù)在100000左右;
4、缺點(diǎn):受outlier影響較大;
?
2)Z-score(standardization)
1、思路:把所有數(shù)據(jù)歸一到均值為0方差為1的分布中;
2、公式:Xscale = (X - Xmean ) /?σ
# Xmean:特征的均值(均值就是平均值);
# σ:每組特征值的標(biāo)準(zhǔn)差;
# X:每一個特征值;
# Xscale:歸一化后的特征值;
3、特點(diǎn)1:使用于數(shù)據(jù)分布沒有明顯的邊界;(有可能存在極端的數(shù)據(jù)值)
# 歸一化后,數(shù)據(jù)集中的每一種特征的均值為0,方差為1;
4、優(yōu)點(diǎn)(相對于最值歸一化):即使原數(shù)據(jù)集中有極端值,歸一化有的數(shù)據(jù)集,依然滿足均值為0方差為1,不會形成一個有偏的數(shù)據(jù);
?
三、訓(xùn)練數(shù)據(jù)集的歸一化
1)最值歸一化:
import numpy as np# 對一維向量做歸一化 x = np.random.randint(0, 100, size = 100) x = np.array(x, dtype=float) x = (x - np.min(x)) / (np.max(x) - np.min(x))# 對二維矩陣做歸一化 X = np.random.randint(0, 100, (50, 2)) X = np.array(X, dtype=float) # 分別對每一列進(jìn)行最值歸一化,方式與向量做最值歸一化一樣
2)均值方差歸一化:
import numpy as npX2 = np.random.randint(0, 100, (50, 2)) X2 = np.array(X2, dtype=float) X2[:,0] = (X2[:,0] - np.mean(X2[:,0])) / np.std(X2[:,0]) X2[:,1] = (X2[:,1] - np.mean(X2[:,1])) / np.std(X2[:,1])# np.mean(array):求向量的平均值;
# np.std(array):求向量的標(biāo)準(zhǔn)差;
?
四、測試數(shù)據(jù)集的歸一化
1)問題
- 訓(xùn)練數(shù)據(jù)集歸一化,用于訓(xùn)練模型,測試數(shù)據(jù)集如何歸一化?
2)方案
- 不能直接對測試數(shù)據(jù)集按公式進(jìn)行歸一化,而是要使用訓(xùn)練數(shù)據(jù)集的均值和方差對測試數(shù)據(jù)集歸一化;
3)原因
- 原因1:真實(shí)的環(huán)境中,數(shù)據(jù)會源源不斷輸出進(jìn)模型,無法求取均值和方差的;
- 原因2:訓(xùn)練數(shù)據(jù)集是模擬真實(shí)環(huán)境中的數(shù)據(jù),不能直接使用自身的均值和方差;
- 原因3:真實(shí)環(huán)境中,無法對單個數(shù)據(jù)進(jìn)行歸一化;
# 對數(shù)據(jù)的歸一化也是算法的一部分;
4)方式
- (X_test - mean_train) / std_train
?
五、使用scikit-learn中的Scaler類
1)調(diào)用的步驟
- scikit-learn中將訓(xùn)練數(shù)據(jù)集的均值和方差封裝在了類Scalar中;
?
2)代碼實(shí)現(xiàn)
import numpy as np from sklearn import datasetsiris = datasets.load_iris() X = iris.data y = iris.target# 1)歸一化前,將原始數(shù)據(jù)分割 from ALG.train_test_split import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, y, seed = 666)# 2)導(dǎo)入均值方差歸一化模塊:StandardScaler from sklearn.preprocessing import StandardScaler# 實(shí)例化,不需要傳入?yún)?shù) standardScaler = StandardScaler()# 3)fit過程:返回StandardScaler對象,對象內(nèi)包含訓(xùn)練數(shù)據(jù)集的均值和方差 # fit過程,傳入訓(xùn)練數(shù)據(jù)集; standardScaler.fit(X_train) # 輸出:StandardScaler(copy=True, with_mean=True, with_std=True)# fit后可通過standardScaler查看均值和標(biāo)準(zhǔn)差 # standardScaler.mean_:查看均值 # standardScaler.scale_:查看標(biāo)準(zhǔn)差# 4)transform:對訓(xùn)練數(shù)據(jù)集和測試數(shù)據(jù)集進(jìn)行歸一化,分別傳入對應(yīng)的數(shù)據(jù)集 # 歸一化并沒有改變訓(xùn)練數(shù)據(jù)集,而是又生成一個新的矩陣,除非將新生成的數(shù)據(jù)集賦給原數(shù)據(jù)集,一般不改變原數(shù)據(jù) X_train_standard = standardScaler.transform(X_train) X_test_standard = standardScaler.transform(X_test)# 接下來就是使用歸一化后的數(shù)據(jù)集訓(xùn)練并測試模型?
3)注意
?
4)實(shí)現(xiàn)scikit-learn的StandardScaler類中的內(nèi)部邏輯
import numpy as npclass StandardScaler:def __init__(self):self.mean_ = Noneself.scale_ = Nonedef fit(self, X):"""根據(jù)訓(xùn)練數(shù)據(jù)集獲取均值和標(biāo)準(zhǔn)差"""assert X.ndim == 2,"the dimension of X must be 2"self.mean_ = np.array([np.mean(X[:,i]) for i in range(0,X.shape[1])])self.scale_ = np.array([np.std(X[:,i]) for i in range(0,X.shape[1])])return selfdef transform(self, X):"""將X根據(jù)這個StandardScaler進(jìn)行均值方差歸一化處理"""assert X_train.ndim == 2, "the dimension of X_train must be 2"assert self.mean_ is not None and self.scale_ is not None,\"must fit before transform"assert X.shape[1] == len(self.mean_),\"the feature number of X must be equal to mean_ and std_"reasX = np.empty(shape=X.shape, dtype=float)for col in range(X.shape[1]):resX[:,col] = (X[:,col] - self.mean_[col]) / self.scale_[col]return resX?
轉(zhuǎn)載于:https://www.cnblogs.com/volcao/p/9089716.html
總結(jié)
以上是生活随笔為你收集整理的机器学习:数据归一化(Scaler)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 充分利用 cpu_如何充分利用云
- 下一篇: android访问WebService(