2025年4月22日 星期二

詳細說明 Step 2 的標準化(Standardization)

 詳細說明 Step 2 的標準化(Standardization),為什麼要做、怎麼做、怎麼理解每一行程式碼,並補充注意事項。


🧼 Step 2:資料標準化(Zero-mean, Unit-std)

📌 什麼是標準化?

標準化(standardization)是把每一個特徵資料轉換為:

  • 平均值為 0(Zero-mean)

  • 標準差為 1(Unit-variance)

這樣每個欄位會落在「均值為 0,且數值分佈一致」的範圍內,有利於:

  • 提升 模型收斂速度與準確率

  • 避免某些欄位因數值較大而主導訓練(尤其是用到距離計算時,如 SVM、KNN、MLP)


✅ 原始資料長什麼樣?

假設你有以下 NumPy 陣列 X(每列是一筆資料,每欄是一個特徵):

python
X = np.array([ [1.0, 200.0], [2.0, 220.0], [3.0, 250.0] ])

特徵 1(第 0 欄)平均值是 2.0,特徵 2 平均值是 223.3,單位尺度不同,這會影響模型效果。


🧠 使用 StandardScaler 的完整解釋:

python
from sklearn.preprocessing import StandardScaler # 建立一個標準化工具 scaler = StandardScaler()

🔹 scaler 是一個物件,裡面會記錄每一欄的 mean(均值)與 std(標準差)。


python
# 對訓練資料進行標準化 X_scaled = scaler.fit_transform(X)

這行做了兩件事(非常重要!):

動作說明
fit(X)計算 X 中每個欄位的平均值與標準差,記錄在 scaler.mean_scaler.scale_
transform(X)根據上面的平均值與標準差,轉換每筆資料的每一欄為 (x - mean) / std

例如:

python
# 假設 mean=[2.0, 223.3],std=[1.0, 25.17] # 原本的 [1.0, 200.0] 會變成 [-1.0, -0.93]

✅ 轉換後的資料長這樣:

python
print(X_scaled)
lua
[[-1.2247, -1.2978], [ 0.0000, -0.1330], [ 1.2247, 1.4308]]

⚠️ 為什麼 只對訓練資料做 fit

這是機器學習常犯的錯誤之一!

python
scaler.fit(X_train) # 只用訓練資料學習 mean / std X_train_scaled = scaler.transform(X_train) X_test_scaled = scaler.transform(X_test) # 測試資料使用相同轉換!

否則會產生「數據外洩(data leakage)」導致模型看到了未來資訊。


✅ 額外說明:你也可以反轉標準化

python
original = scaler.inverse_transform(X_scaled)

這樣可以把標準化後的資料轉回原來的數值,用於「還原預測值」或「視覺化解釋模型輸出」。


🧾 小結:

項目說明
工具sklearn.preprocessing.StandardScaler
方法.fit() 記錄 mean/std,.transform() 套用標準化
公式(x - mean) / std
重要性加快收斂、改善模型表現,尤其是神經網路與 SVM 等演算法
注意測試資料只能用「訓練資料的 mean/std」來轉換(不能自己 fit)


沒有留言:

張貼留言