當前位置:
首頁 > 最新 > 淺析數據標準化和歸一化,優化機器學習演算法輸出結果

淺析數據標準化和歸一化,優化機器學習演算法輸出結果

關於標準化(standardization)

數據標準化能將原來的數據進行重新調整(一般也稱為 z-score 規範化方法),以便他們具有標準正態分布的屬性,即 μ=0 和 σ=1。其中,μ 表示平均值,σ 表示標準方差。數據標準化之後的形式可以按照如下公式進行計算:

如果我們是比較兩個不同大小維度的數據,那麼將這些數據標準化到以 0 為中心並且標準差為 1 的範圍,這對許多的機器學習演算法來說也是一般的要求。比如,從直覺上來說,我們可以將梯度下降看作一個特殊的例子。由於特徵值 xj 在權重更新中發揮作用,那麼某些權重可能比其他權重更新的速度更快,即:

其中,wj:=wj+Δwj,η 表示學習率,t 表示目標正確分類結果,o 表示模型的輸出分類結果。

其他直觀的例子包括 KNN 演算法和一些聚類演算法上面,都會使用這種數據標準化的方法。

事實上,我能想到唯一不需要數據標準化的演算法就應該是基於決策樹的演算法了。我們來看一般的 CART 決策樹演算法。在這裡我們不深入的分析信息熵的含義,我們可以把這個決策簡單的想像成 。從直觀上來講,我們真的不需要來關心數據特徵在哪個大小維度(比如,不同數量級,不同領域 —— 這些真的不關心)。

那麼,在哪些演算法中特徵數據標準化是比較重要的呢?比如下面這些演算法:

對於基於歐幾里得距離的 KNN 演算法,如果你想要所有的數據對演算法都有貢獻,那麼必須進行標準化;

k-means 演算法;

邏輯回歸,支持向量機,感知器,神經網路等,如果你正是在使用梯度下降(上升)來作為優化器,那麼採用標準化會讓權重更快的收斂;

線性判別分析,PCA,核方法;

另外,我們還要考慮我們的數據是需要進行「標準化(standardize)」還是「歸一化(normalize)」(這裡是縮放到 [0, 1] 範圍)。因為有些演算法假設我們的數據是以 0 為中心分布的,那麼這時候進行標準化還是歸一化就需要自己思考了。例如,如果我們對一個小型多層感知器(利用 tanh 激活函數)進行權重初始化,權重應該是 0 ,或者是以零為中心的小隨機數,這樣能更好的更新模型權重。作為一個經驗法則,我想說的是:如果你不確定對數據進行標準化還是歸一化,那麼你就對數據進行標準化吧,至少它不會對數據和結果造成傷害。

標準化(Standardization)數據的標準化是將數據按比例縮放,使之落入一個小的特定區間,標準化之後的數據可正可負,但是一般絕對值不會太大,一般是 z-score 規範化方法。歸一化(Normalization)主要是為了數據處理提出來的,把數據映射到 0~1 範圍之間處理,更加便捷快速,這應該歸到數字信號處理範疇之內。一般方法是最小-最大縮放方法。


還有一種數據處理的方法是最小 - 最大縮放。在這種方法中,數據被縮放到一個固定的範圍 —— 通常是 0 到 1。與標準化相比,有限範圍的損失值計算最終將得到較小的標準偏差,這也可以抑制一些異常值的影響。

最小 - 最大縮放處理可以通過以下公式完成:


具體選擇哪一個數據處理方法沒有很明確的答案,它主要取決於具體的應用程序。

例如,在聚類分析中,為了比較基於特定距離度量的特徵數據之間的相似性,數據標準化可能是一個特別重要的方式。另一個比較突出的例子就是主成分分析,我們通常採用標準化來做數據進行縮放。因為我們對最大化方差的方向感興趣。


當然,我們可以利用 Numpy 包來計算數據的 z-score,並使用前面提到的公式來進行標準化。但是,如果我們使用 Python 的開源機器學習庫 scikit-learn 中的預處理模塊來做,會更加便捷。

為了下面更好的討論,我們採用 UCI 機器學習庫中的 「Wine」 數據集來進行代碼編寫。

| | Class label | Alcohol | Malic acid| | - | :-: | :-: | -: || 0 | 1 | 14.23 | 1.71| | 1 | 1 | 13.20 | 1.78| | 2 | 1 | 13.16 | 2.36| | 3 | 1 | 14.37 | 1.95| | 4 | 1 | 13.24 | 2.59|

正如我們在上面的表格中所看到的,Alcohol 特徵(百分比 / 體積)和 Malic acid(g/l)是在不同大小維度上面進行描述的,所有在比較或者組合這些特徵之前,進行數據縮放是非常有必要的。

標準化和最小-最大縮放

Mean after standardization:Alcohol=0.00, Malic acid=0.00

Standard deviation after standardization:Alcohol=1.00, Malic acid=1.00

Min-value after min-max scaling:Alcohol=0.00, Malic acid=0.00

Max-value after min-max scaling:Alcohol=1.00, Malic acid=1.00

畫圖

上面的圖包括所有三個不同比例的葡萄酒數據點:原始酒精含量數據(綠色),標準化之後的數據(紅色)和歸一化之後的數據(藍色)。在下面的圖中,我們將放大三個不同的坐標軸。


當然,我們也可以手動編寫標準化方程和最小-最大縮放。但是,實際正真項目中,還是比較推薦使用 scikit-learn 。比如:

接下來,我們採用純 Python 代碼來實現這幾個指標,並且也會用 numpy 來進行計算加速。回想一下我們用的幾個參數指標:

純 python

Numpy

可視化

為了檢驗我們的代碼是否正常工作,我們通過可視化來進行查看。


在文章的前面,我們提到了在 PCA 中對數據進行標準化是至關重要的,因為它是分析不同特徵之間的差異。現在,讓我們看看標準化是如何影響 PCA 對整個葡萄酒數據分類結果產生的影響。

接下來,我們主要通過這些步驟進行描述:

讀取數據集;

將原始數據集拆分為訓練集和測試集;

特徵數據標準化;

PCA 降維;

訓練樸素貝葉斯分類器;

利用標準化數據和不利用標準化數據分別對分類器進行評估;

讀取數據集

將原始數據集拆分為訓練集和測試集

在這一步中,我們將數據隨機的分為一個訓練集和一個測試集,其中訓練集包含整個數據集的 70%,測試集包含整個數據集的 30%。

特徵數據標準化

PCA 降維

現在,我們對標準化的數據和非標準化的數據分別進行 PCA 操作,將數據集轉化為二維特徵子空間。在一個真實的應用程序中,我們還會有一個交叉驗證的過程,以便找出一些過度擬合的信息。但是,在這裡我們就不做這個過程了,因為我們不是要設計一個完美的分類器,我們在這裡只是想要去比較標準化對分類結果的影響。

讓我們快速的查看一下我們的新特徵。如下圖:

訓練樸素貝葉斯分類器

接下來,我們使用一個樸素貝葉斯分類器來進行分類任務。也就是說,我們假設每一個特徵都是獨立分布的。總而言之,這是一個簡單的分類器,但是具有很好的魯棒性。

貝葉斯規則:

其中:

ω:表示分類標籤;

P(ω | x):表示後驗概率;

P(x | ω):表示先驗概率;

判別規則如下:

我不想在本文介紹很多的貝葉斯內容,如果你對這方面感興趣,可以自己上網看看材料,網上有很多這方面的資料。

利用標準化數據和不利用標準化數據分別對分類器進行評估

Prediction accuracy for the training dataset81.45%

Prediction accuracy for the test dataset64.81%

Prediction accuracy for the training dataset96.77%

Prediction accuracy for the test dataset98.15%

正如我們所看到的,在 PCA 之前進行標準化,確實對模型的正確率增加了不少。

作者:chen_h

CoderPai 是一個專註於人工智慧在量化交易應用的演算法實戰平台,主要關注人工智慧在量化交易上面的應用。如果你對人工智慧感興趣,請快快關注 「CoderPai」 微信號(coderpai)吧。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 機器學習 的精彩文章:

Martech Focus:2018年人工智慧和機器學習將成為CMO的必需品
谷歌傳道AI的方法論:通過免費在線課程教你掌控人工智慧和機器學習

TAG:機器學習 |