Titanic MLP 資料標準化,哪些敘述正確?
使用鐵達尼號(Titanic)資料集進行多層感知機(Multilayer Perceptron, MLP)分類預測分析,其中 survived 為反應變數(1 表示存活,0 表示死亡)。資料載入後切分為 X_train(前 9 欄)/y_train(survived)/X_test/y_test,型別為 float32。
參考下圖程式碼:
X_train -= X_train.mean(axis=0)
X_train /= X_train.std(axis=0)
X_test -= X_test.mean(axis=0)
X_test /= X_test.std(axis=0)
敘述(複選 sub-options):
A:X_train -= X_train.mean(axis=0) 將每個訓練集特徵的平均值調整為 0
B:X_train /= X_train.std(axis=0) 將每個訓練集特徵的標準差調整為 0
C:X_train 處理結果會將資料壓縮到 0 和 1 之間
D:標準化結果防止梯度爆炸或消失
E:標準化是屬於特徵選擇(Feature Selection)方法
F:X_train 程式碼應修正為 X_train = X_train.std(axis=0),X_test 程式碼應修正為 X_test = X_test.std(axis=0)
請問下列何者正確?(4 個選項各為不同的子敘述組合)
Titanic MLP 分析專案中,工程師在訓練模型前對特徵做了「標準化」處理:先減去各特徵的平均值,再除以標準差。題目列出了 6 個關於這段程式碼的敘述(A 到 F),這是一題複選題:4 個選項各是不同的子敘述組合,要從中選出「全部正確」的那個組合。
問你:6 個子敘述中,哪些是正確的?而對應到哪個選項組合?
一句話總結
6 個子敘述中正確的是子敘述 A(平均值調整為 0)和子敘述 D(防止梯度爆炸/消失),選項 C 的「A、D」組合即為正解。其餘子敘述 B、C、E、F 各有明確錯誤。
先感受問題:神經網路為什麼要先「標準化」特徵?
Titanic 資料集的 9 個特徵量綱差異極大:年齡(Age)在 0-80 之間、票價(Fare)可以到 500 以上、性別(Sex_encoded)只有 0 或 1。如果直接丟進神經網路,量綱大的特徵(票價)會主導梯度,量綱小的特徵(性別)幾乎被忽視,訓練不穩定。
標準化(Z-score normalization):每個特徵減去均值、除以標準差,讓所有特徵都縮放到「均值 0、標準差 1」的範圍,讓梯度更均衡,訓練更穩定。
這道複選題有 6 個子敘述,題目把它們打包成 4 個「哪些正確」的組合,要你逐一判斷每個子敘述的對錯,再找到對應的正確組合。
逐一判斷 6 個子敘述
- 子敘述 A(正確):X_train -= X_train.mean(axis=0) 對每個特徵(欄)減去該特徵的均值,讓每個特徵的均值變為 0。axis=0 表示沿樣本維度計算均值,結果是一個長度為特徵數(9)的向量。
- 子敘述 B(錯誤):X_train /= X_train.std(axis=0) 是除以標準差,結果是讓標準差變為 1,不是 0。標準差為 0 的特徵沒有意義(所有值相同),除以標準差是讓它「縮放到標準差 = 1」。
- 子敘述 C(錯誤):標準化不是 Min-Max 縮放,不會把資料壓縮到 0 和 1 之間。Z-score 標準化後的範圍是 (-∞, +∞),只是均值為 0、標準差為 1,可能有超出 -1 到 1 的值。Min-Max 縮放才是壓縮到 0-1。
- 子敘述 D(正確):特徵標準化確實有助於防止梯度爆炸(量綱大的特徵梯度過大)和梯度消失(量綱小的特徵梯度過小),是神經網路訓練穩定性的重要技術。
- 子敘述 E、F(皆錯誤):E 說標準化是「特徵選擇」,但標準化屬於特徵縮放(Feature Scaling),決定的是數值範圍,不是哪些特徵要保留;F 的「修正」把 -= 改成 =,X_train = X_train.std(axis=0) 會讓 X_train 從資料矩陣變成一個只有 9 個數的標準差向量,原始資料全部消失,是破壞性錯誤。
正確的兩個:A 和 D
整理 6 個子敘述的對錯:
- A:正確(減均值讓均值為 0)
- B:錯誤(除以標準差讓標準差為 1,不是 0)
- C:錯誤(Z-score 不壓縮到 0-1,是 Min-Max 的功能)
- D:正確(標準化防止梯度問題)
- E:錯誤(標準化是特徵縮放,不是特徵選擇)
- F:錯誤(提議的修正破壞了資料結構)
正確的子敘述是 A 和 D,對應選項 C 的「A、D」組合。
這就是選項 C 講的:A、D(子敘述 A 和 D 正確)。
技術版:Z-score 標準化公式與梯度影響
中級考試大概率會考程式碼跟公式,所以這部分你還是要學。但如果現在學起來很痛苦,可以先跳過,等讀完其他題目回頭再來。
想像你要比較台北市各區的「房價」和「犯罪率」。房價在 1,000 萬到 1 億之間,犯罪率在 0.01 到 0.1 之間。直接比較這兩個數字,房價的數字大幾千萬倍,會讓任何模型都認為「房價比犯罪率重要得多」——但這只是因為數字的單位不同,不是因為它真的更重要。
標準化就像「換算成標準分數」:讓每個指標都以「距離平均值幾個標準差」來表達,消除單位的影響,讓模型公平地比較兩者。
| 白話說法 | 程式碼 / 公式 |
|---|---|
| 減去每個特徵的均值 | X -= X.mean(axis=0) → 均值變 0 |
| 除以每個特徵的標準差 | X /= X.std(axis=0) → 標準差變 1 |
| Z-score 公式 | z = (x - μ) / σ |
| Min-Max 縮放(壓縮到 0-1) | x_norm = (x - x.min()) / (x.max() - x.min()) |
| sklearn 的標準化(等效) | from sklearn.preprocessing import StandardScaler scaler.fit_transform(X_train) |
- axis=0
- 沿第 0 維(樣本維)計算,對每個特徵(欄)分別算均值/標準差
- μ(均值)
- 標準化後等於 0,減均值讓資料以 0 為中心
- σ(標準差)
- 標準化後等於 1,除以標準差讓資料的散布程度一致
- 梯度爆炸
- 特徵值很大時,損失函數對該特徵的梯度也很大,更新步幅過大,訓練不穩
- 梯度消失
- 特徵值很小時,梯度接近 0,該特徵幾乎無法被學習
Z-score 標準化(本題的方法): z = (x - μ) / σ 結果:μ = 0,σ = 1 範圍:(-∞, +∞),通常集中在 [-3, 3] 內 Min-Max 縮放(容易混淆的另一種方法): x_norm = (x - x_min) / (x_max - x_min) 結果:[0, 1] ← 子敘述 C 說的是 Min-Max,不是 Z-score 子敘述 B 的錯誤: X /= X.std(axis=0) 的效果是: 新標準差 = 原標準差 / 原標準差 = 1 標準差變為 1,不是 0 子敘述 F 的錯誤: X_train = X_train.std(axis=0) X_train 原本 shape = (N, 9),這行執行後 X_train.shape = (9,),資料全部被覆蓋成標準差向量,原資料消失
- Z-score 標準化後的均值和標準差分別是多少?
- Z-score 標準化和 Min-Max 縮放的結果範圍有什麼差異?
- 為什麼標準化能防止梯度爆炸?以一個具體例子說明。
- 這段程式碼用 X_test.mean() 對測試集標準化,有什麼潛在問題?正確做法是什麼?
- 特徵縮放(Feature Scaling)和特徵選擇(Feature Selection)有什麼差異?
為什麼其他選項是錯的
字面在說什麼:子敘述 A、B、C、D 全部正確。
為什麼不對:子敘述 B 說「除以標準差讓標準差調整為 0」是錯誤的,除以標準差讓標準差變為 1,不是 0;子敘述 C 說「壓縮到 0 和 1 之間」也是錯誤的,Z-score 標準化的輸出範圍是 (-∞, +∞),不是 [0, 1],那是 Min-Max 縮放的效果。
誰會選錯:對「標準化」和「歸一化(Min-Max)」的差異不清楚,以為所有「預處理」都是把資料壓縮到 0-1;或誤讀了子敘述 B,以為「標準差縮放到某個值」就是「調整為 0」。
字面在說什麼:子敘述 A(均值為 0)和 E(標準化是特徵選擇)正確。
為什麼不對:子敘述 E 說標準化屬於「特徵選擇」是錯誤的。標準化是「特徵縮放」,它不選擇哪些特徵要保留,而是調整所有保留特徵的數值範圍。特徵選擇包含 Filter(相關係數、卡方檢定)、Wrapper(遞迴特徵消除 RFE)、Embedded(Lasso 正則化),完全不同的概念。
誰會選錯:把「對特徵做處理」統稱為「特徵選擇」,沒有區分縮放(Scaling)和選擇(Selection)是兩個不同的前處理步驟。
字面在說什麼:子敘述 A、C(壓縮到 0-1)和 F(修正程式碼)正確。
為什麼不對:子敘述 C 把 Z-score 標準化(結果不限 0-1)誤解成 Min-Max 縮放(結果是 0-1);子敘述 F 的「修正」把 X_train -= 改成 X_train =,直接把資料矩陣覆蓋成一個向量,是破壞性的錯誤,不是「修正」。
誰會選錯:把 -=(減等於)和 =(指派)搞混,以為 F 的「修正」是合理的;同時把 Z-score 和 Min-Max 混淆,選了 C。
同個考點下次怎麼變形
直覺:本題的程式碼用 X_test.mean() 和 X_test.std() 來標準化測試集,這樣有什麼問題?
答案:這會造成「資料洩漏」(Data Leakage)的邊緣情況:測試集的標準化用了測試集自己的統計量,而不是訓練集的統計量。正確做法是用訓練集算出的 mean 和 std 來標準化測試集:`X_test -= X_train_mean; X_test /= X_train_std`。這樣才能模擬「真實部署時,遇到全新資料」的情境。
直覺:什麼時候用 Z-score,什麼時候用 Min-Max?
答案:Z-score 適合:資料近似常態分佈、需要保留離群值影響、或使用線性模型/神經網路。Min-Max 適合:需要固定在 [0,1] 範圍(例如影像像素 0-255 → 0-1)、資料有明確上下界。神經網路兩者都常用,但如果有明顯離群值,Z-score 可能讓大多數值集中在很小的範圍,Min-Max 更合適。
直覺:標準化能防止梯度爆炸,但 BatchNorm 也能防止梯度問題,兩者有什麼差異?
答案:標準化(輸入端)是在訓練開始前對資料做一次性處理,只對輸入特徵有效。BatchNorm(層間)是在每個隱藏層激活後動態標準化,解決的是「深層網路訓練時中間層分佈偏移」的問題(Internal Covariate Shift),效果更全面,但需要加在網路結構裡。兩者可以同時使用。
直覺:Titanic 資料集除了標準化之外,還有哪些常用的特徵前處理方法?
答案:特徵選擇:用相關係數篩選與 survived 相關度高的特徵;用 Lasso 正則化讓不重要特徵的係數縮為 0。特徵工程:從 Name 欄位提取頭銜(Mr/Mrs/Miss),從 Cabin 提取客艙等級;建立交互特徵(Age × Pclass)。缺值處理:Age 的缺失值用中位數填補;Embarked 的缺失值用眾數填補。
直覺:X -= X.mean(axis=0) 和 X = X - X.mean(axis=0) 有什麼差異?
答案:對 NumPy 陣列,-= 是「就地(in-place)運算」,直接修改原陣列的記憶體,不建立新陣列,更省記憶體;= 是建立新陣列再指派,原陣列保留。功能上結果相同,但 -= 更節省記憶體,在大型資料集上有明顯差異。子敘述 F 把 -= 改成 = 卻省略了「- X.mean(axis=0)」部分,意思完全改變,這才是問題所在。
想再往下看,這 5 個
- 特徵縮放(Feature Scaling)本題核心,Z-score 標準化是特徵縮放的一種,確保不同量綱的特徵在模型訓練中獲得平等的權重。
- 梯度消失(Vanishing Gradient)特徵量綱過小時的梯度問題,標準化是最簡單的緩解方法之一。
- 梯度爆炸(Exploding Gradient)特徵量綱過大時的對應問題,與梯度消失相反,兩者都是深度網路訓練的挑戰。
- 特徵選擇(Feature Selection)子敘述 E 的混淆對象,與特徵縮放是不同的前處理步驟,決定保留哪些特徵而非調整數值範圍。
- 資料前處理(Data Preprocessing)標準化的上層概念,包含缺值處理、特徵縮放、編碼轉換等多個步驟,是機器學習流程的起點。