1. 程式人生 > >機器學習中訓練集和測試集歸一化-matlab

機器學習中訓練集和測試集歸一化-matlab

 本文不是介紹如何使用matlab對資料集進行歸一化,而是通過matlab來介紹一下資料歸一化的概念。
 以下內容是自己的血淚史,因為歸一化的錯誤,自己的實驗過程至少走了兩個星期的彎路。由此可見機器學習中一些基礎知識和概念還是應該紮實掌握。

背景介紹

  1. 歸一化後加快了梯度下降求最優解的速度,歸一化有可能提高精度。
  2. 訓練集和測試集歸一化方法相同。
  3. 資料集不小,81*132337,81行表示包含81維屬性,132337列表示包含132337條訓練資料。
  4. 資料中包含NaN資料。
  5. 使用matlab中的mapminmax函式,歸一化到預設的範圍[-1 +1]。

  為了方便演示,我們以一個簡單的矩陣來說明歸一化。

123234345456(1)
 這是3*4的矩陣,表示有4條訓練資料,每條資料有3個屬性。資料歸一化應該針對屬性,而不是針對每條資料,針對每條資料是完全沒有意義的,因為只是等比例縮放,對之後的分類沒有任何作用。這是我遇到的第一個坑

 針對屬性進行歸一化的程式碼

inst = [1 2 3 4; 2 3 4 5; 3 4 5 6];
inst_norm = mapminmax(inst);

 得到的歸一化矩陣如下

1.00001.00001.00000.33330.33330.33330.33330.33330.33331.00001.00001.0000(2)
 針對資料進行歸一化的程式碼
inst = [1
2 3 4; 2 3 4 5; 3 4 5 6];
inst_norm = mapminmax(inst')';

 得到的歸一化矩陣如下

101101101101(3)
 我們應該採用第一種歸一化方法,即對屬性進行歸一化。
 訓練集和測試集歸一化的方法應該相同,但是在具體實驗過程中,腦子發生了短路,對訓練集的歸一化是針對屬性的,但是測試集卻針對了資料,這是我遇到的第二個坑。這種做法讓測試結果接近隨機,跟訓練集沒什麼關係。
 網上有一些說法,覺得訓練集和測試集應該放到一起進行歸一化,我覺得這種做法有所不妥,這樣會讓測試集受到訓練集的影響,導致訓練集和測試集不相互獨立。
 正確的做法是記錄下訓練集的歸一化方法,用該方法對測試集單獨進行歸一化,matlab中的mapminmax
函式提供了相應的機制。

 對於一條新的資料,應該先按照訓練集的歸一化方法進行歸一化,再進行分類,比如對於如下一條新資料,

135(4)
 通過如下程式碼
inst = [1 2 3 4; 2 3 4 5; 3 4 5 6];
[inst_norm, settings] = mapminmax(inst);
test = [1 3 5]';
test_norm = mapminmax('apply', test, settings);

 其中settings記錄了訓練集的歸一化方法,得到以下歸一化結果,可以參考矩陣(2)

1.00000.33330.3333(5)
mapminmax會跳過NaN資料,最好的方法是歸一化之後,將NaN賦值成0。
inst_norm(find(isnan(inst_norm))) = 0;