日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【机器学习】 - 数据预处理之数据归一化(标准化)与实战分析,正则化

發布時間:2023/12/10 编程问答 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【机器学习】 - 数据预处理之数据归一化(标准化)与实战分析,正则化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、為什么要進行數據歸一化

  • 定義:把所有數據的特征都歸到 [0,1] 之間 或? 均值0方差1 的過程。
  • 原則:樣本的所有特征,在特征空間中,對樣本的距離產生的影響是同級的;
  • 問題:特征數字化后,由于取值大小不同,造成特征空間中樣本點的距離會被個別特征值所主導,而受其它特征的影響比較小;
  • 例:特征1 = [1, 3, 2, 6, 5, 7, 9],特征2 = [1000, 3000, 5000, 2000, 4000, 8000, 3000],計算兩個樣本在特征空間的距離時,主要被特征2所決定;
  • 定義:將所有的數據(具體操作時,對每一組特征數據進行分別處理)映射到同一個尺度中;
  • 歸一化的過程,是算法的一部分;

?

二、數據歸一化的方法

1.最值歸一化(MinMaxScaler,normalization)

將特征縮放至特定區間,將特征縮放到給定的最小值和最大值之間,或者也可以將每個特征的最大絕對值轉換至單位大小。這種方法是對原始數據的線性變換,將數據歸一到[0,1]中間。

轉換函數為 :?

其中x為數據集中每一種特征的值,將數據集中的每一種特征都做映射,

?

特點:

1.多適用于分布有明顯邊界的情況;如考試成績、人的身高、顏色的分布等,都有范圍;而不是些沒有范圍約定,或者范圍非常大的數據。

2.這種方法對于outlier非常敏感,因為outlier影響了max或min值,且被考慮在計算中了。

3.這種方法有個缺陷就是當有新數據加入時,可能導致max和min的變化,需要重新定義。

?

2.? Z-score(StandardScaler,0均值歸一化

標準化數據通過減去均值然后除以方差(或標準差),這種數據標準化方法經過處理后數據符合標準正態分布,即均值為0,標準差為1,轉化函數為:

其中

μ:每組特征的均值;σ:每組特征值的標準差;X:每一個特征值;Xnorm:歸一化后的特征值;

?

特點:

1.?適用于 數據的分布本身就服從正態分布的情況。

2. 通常這種方法基本可用于有outlier的情況,但是,在計算方差和均值的時候outliers仍然會影響計算。所以,在出現outliers的情況下可能會出現轉換后的數的不同feature分布完全不同的情況。

3.?使用于數據分布沒有明顯的邊界(有可能存在極端的數據值)。

4.?歸一化后,數據集中的每一種特征的均值為0,方差為1。

5.?相對于最值歸一化的優點是:即使原數據集中有極端值,歸一化后,依然滿足均值為0方差為1,不會形成一個有偏的數據。

6.?在分類、聚類算法中,需要使用距離來度量相似性的時候、或者使用PCA技術進行降維的時候,這種方法(Z-score standardization)表現更好。

3.? RobustScaler

如果你的數據包含許多異常值,使用均值和方差縮放可能并不是一個很好的選擇。這種情況下,你可以使用 robust_scale 以及 RobustScaler 作為替代品。它們對你的數據的中心和范圍使用更有魯棒性的估計。

This Scaler removes the median(中位數) and scales the data according to the quantile range(四分位距離,也就是說排除了outliers)

?

三、其他細節及說明

1.歸一化范圍選擇[0, 1] 還是 [-1, 1] ?

([-1,1]指存在負數,但是不一定所有數據都在這個范圍內,例如下面的實戰的截圖)

假設我們有一個只有一個hidden layer的多層感知機(MLP)的分類問題。每個hidden unit表示一個超平面,每個超平面是一個分類邊界。參數w(weight)決定超平面的方向,參數b(bias)決定超平面離原點的距離。如果b是一些小的隨機參數(事實上,b確實被初始化為很小的隨機參數),那么所有的超平面都幾乎穿過原點。所以,如果data沒有中心化在原點周圍,那么這個超平面可能沒有穿過這些data,也就是說,這些data都在超平面的一側。這樣的話,局部極小點(local minima)很有可能出現。 所以,在這種情況下,標準化到[-1, 1]比[0, 1]更好。

1、在分類、聚類算法中,需要使用距離來度量相似性的時候、或者使用PCA技術進行降維的時候,StandardScaler表現更好。

2、在不涉及距離度量、協方差計算、數據不符合正太分布的時候,可以使用MinMaxScaler。比如圖像處理中,將RGB圖像轉換為灰度圖像后將其值限定在[0 255]的范圍。

原因是使用MinMaxScaler,其協方差產生了倍數值的縮放,因此這種方式無法消除量綱對方差、協方差的影響,對PCA分析影響巨大;同時,由于量綱的存在,使用不同的量綱、距離的計算結果會不同。

而在StandardScaler中,新的數據由于對方差進行了歸一化,這時候每個維度的量綱其實已經等價了,每個維度都服從均值為0、方差1的正態分布,在計算距離的時候,每個維度都是去量綱化的,避免了不同量綱的選取對距離計算產生的巨大影響。

?

?

2. 關于測試數據集的處理

 1)問題

  • 訓練數據集歸一化很好理解,用于訓練模型,那對于測試數據集如何歸一化?

 2)方案

  • 不能直接對測試數據集按公式進行歸一化,而是要使用訓練數據集的均值和方差對測試數據集歸一化;

 3)原因

  • 原因1:真實的環境中,數據會源源不斷輸出進模型,無法求取均值和方差的;
  • 原因2:訓練數據集是模擬真實環境中的數據,不能直接使用自身的均值和方差;
  • 原因3:真實環境中,無法對單個數據進行歸一化;

對數據的歸一化也是算法的一部分;

 4)方式

  • (X_test - mean_train) / std_train
  • X_test:測試集;
  • mean_train:訓練集的均值;
  • std_train:訓練集的標準差;
  • ?

    四、實戰代碼解析

    ?

    1.自己實現前兩種歸一化:

    import numpy as np x = np.random.randint(0, 100, size = 100) # 范圍[0,100)注意左閉右開 x = np.array(x, dtype=float)x = (x - np.min(x)) / (np.max(x) - np.min(x)) # 這樣的操作是合法的xx = np.random.randint(0, 100, size = (50,2) ) xx = xx.astype('float32')xx[:,0] = (xx[:,0]-np.mean(xx[:,0]))/np.std(xx[:,0]) xx[:,1] = (xx[:,1]-np.mean(xx[:,1]))/np.std(xx[:,1])

    得到:

    可以發現,最值歸一化時,操作后的數據中一定會有0和1,且都是非負數。

    0均值歸一化時,數據有正有負,且不一定在[-1,1]范圍內。

    ?

    2.學習使用scikit-learn中的Scaler類

    假設numpy數據的行數為數據樣本個數,列數為特征數。

    方法1:使用? sklearn.preprocessing.scale

    >>> from sklearn import preprocessing >>> import numpy as np >>> X_train = np.array([[ 1., -1., 2.], ... [ 2., 0., 0.], ... [ 0., 1., -1.]]) >>> X_scaled = preprocessing.scale(X_train)>>> X_scaled array([[ 0. ..., -1.22..., 1.33...],[ 1.22..., 0. ..., -0.26...],[-1.22..., 1.22..., -1.06...]])

    sklearn.preprocessing.scale可以沿著特定的坐標軸對數據集進行歸一化,在均值附近集中化數據并縮放至單位方差.?

    參數包括:sklearn.preprocessing.scale(X, axis = 0, with_mean=True, with_std=True, copy=True)

    X:需要進行集中化和縮放的數據,類似于數組,稀疏矩陣

    axis:整數(默認是 0 )用來計算均值和標準差的軸. 當 axis=0 時,對各個特征進行標準化;當 axis=1 時,會對每個樣本進行標準化

    with_mean:boolean,布爾型,默認是 True,即在縮放之前對數據進行集中化

    with_std:boolean,布爾型,默認是 True,即縮放數據至單位方差( 或單位標準差)

    copy:boolean,布爾型,默認是 True,可選填. 設置為 False 的時候即在原數據行上進行標準化,并禁止復制( 如果輸入是 numpy 數組或是 scipy.sparse CSC 矩陣并且 axis = 1)

    ?

    ?

    ?

    方法2:使用?sklearn.preprocessing.StandardScaler

    ?

    • scikit-learn中將訓練數據集的均值和方差封裝在了類Scalar中;

    其中:fit:根據訓練數據集獲取均值和方差,scikit-learn中返回一個Scalar對象;

    ? ? ? ? ?transform:對訓練數據集、測試數據集進行歸一化;

  • 實例化StandardScaler()時,不需要傳入參數;
  • 歸一化并沒有改變數據集,而是又生成一個新的矩陣,一般不要改變原數據;
  • 實戰代碼的具體步驟

    數據分割——導入并實例化歸一化模塊——fit(得到均值和方差)——transform(得到歸一化后的數據集) ——繼續后續操作

    import numpy as np from sklearn import datasetsiris = datasets.load_iris() X = iris.data y = iris.target# 1)歸一化前,將原始數據分割 from sklearn.model_selection import train_test_split X_train,X_test,y_train,y_test = train_test_split(X, y, test_size=0.2,stratify=y, # 按照標簽來分層采樣shuffle=True, # 是否先打亂數據的順序再劃分random_state=1) # 控制將樣本隨機打亂# 2)導入均值方差歸一化模塊:StandardScaler from sklearn.preprocessing import StandardScaler# 實例化,不需要傳入參數 standardScaler = StandardScaler()# 3)fit過程:返回StandardScaler對象,對象內包含訓練數據集的均值和方差 # fit過程,傳入訓練數據集; standardScaler.fit(X_train) # 輸出:StandardScaler(copy=True, with_mean=True, with_std=True)# fit后可通過standardScaler查看均值和標準差 # standardScaler.mean_:查看均值 # standardScaler.scale_:查看標準差# 4)transform:對訓練數據集和測試數據集進行歸一化,分別傳入對應的數據集 # 歸一化并沒有改變訓練數據集,而是又生成一個新的矩陣,除非將新生成的數據集賦給原數據集,一般不改變原數據 X_train_standard = standardScaler.transform(X_train)np.mean(X_train_standard[:,0]) np.var(X_train_standard[:,0]) X_test_standard = standardScaler.transform(X_test)# 接下來就是使用歸一化后的數據集訓練并測試模型

    ? ?4. scikit-learn的StandardScaler類中的內部邏輯

    import numpy as npclass StandardScaler:def __init__(self):self.mean_ = Noneself.scale_ = Nonedef fit(self, X):"""根據訓練數據集獲取均值和標準差"""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根據這個StandardScaler進行均值方差歸一化處理"""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

    參考資料:

    1.??https://www.cnblogs.com/volcao/p/9089716.html

    2.??https://www.cnblogs.com/bjwu/p/8977141.html

    3.??https://blog.csdn.net/wjplearning/article/details/81592304

    4.??https://blog.csdn.net/weixin_38002569/article/details/81910661

    ?

    正則化相關內容:

    https://www.cnblogs.com/chaosimple/p/4153167.html

    總結

    以上是生活随笔為你收集整理的【机器学习】 - 数据预处理之数据归一化(标准化)与实战分析,正则化的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。