本週預習 · 資料前處理

資料前處理
Data Preprocessing

機器學習流程中的第一步——在訓練模型之前,先把資料整理乾淨。

楊景元 助理教授
資訊科學系
預習時間約 15–20 分鐘
01 為什麼需要資料前處理?
現實世界的資料幾乎從來不完美。資料可能有缺失值格式不一致異常數值,或者不同來源的資料難以直接合併。如果直接把這樣的資料丟進機器學習模型,結果就像電腦科學的經典警語:

「垃圾進,垃圾出(Garbage In, Garbage Out)」 — 資料品質決定了模型的上限。

資料前處理的目標,就是在模型訓練之前,把原始資料轉換成乾淨、一致、適合分析的格式。
💡
在實際的機器學習專案中,資料前處理往往佔去整個專案 60–80% 的時間。這不是枯燥的雜事,而是決定模型好壞的關鍵。
02 四個主要步驟(大架構)
🧹

資料清洗

Data Cleaning
處理缺失值、去除重複、修正錯誤數值

🔄

資料轉換

Data Transformation
特徵縮放、特徵抽取、類別編碼、降維

🔗

資料集成

Data Integration
整合不同來源資料,統一格式與單位

📦

資料歸納

Data Reduction
降低維度與資料量,保留關鍵資訊

03 本週關鍵名詞
Missing Value缺失值
資料中某些欄位沒有數值(例如某位學生的年齡欄空白)。常見處理方式:刪除填補均值/中位數模型預測填補
Standardization標準化
將數值縮放至均值為 0、標準差為 1 的分布。適合線性回歸、SVM 等假設資料呈常態分布的模型。
Normalization正規化
將數值縮放至 [0, 1] 範圍內。適合神經網路、需要固定值域的場景。
Label Encoding標籤編碼
將類別資料轉換為整數,例如「紅=0, 綠=1, 藍=2」。適合有序類別(例如評級)及樹型模型。
One-Hot Encoding獨熱編碼
為每個類別建立獨立的 0/1 欄位,消除類別間的虛假順序關係。適合無序類別(例如城市名稱)。
PCA主成分分析
一種非監督式降維技術,保留資料中方差最大的方向,去除冗餘特徵。不需要標籤資訊。
Feature Extraction特徵抽取
從原始資料中提取有意義的特徵,例如從身高體重計算 BMI,或從日期提取「星期幾」。
Outlier異常值/離群值
明顯偏離其他資料的數值,例如年齡欄出現 -5 或 999。需要判斷是資料錯誤還是真實的極端值再決定如何處理。
04 兩個必記公式

📐 標準化(Standardization)

z = (x - μ) / σ
μ:該欄位的平均值
σ:該欄位的標準差
結果集中在 [-3, 3] 之間,均值為 0。

📐 正規化(Min-Max Normalization)

z = (x - min) / (max - min)
結果必定落在 [0, 1] 之間。
若資料有離群值,會壓縮大多數值到極小區間,此時標準化更穩健。
05 兩種類別編碼的差異

🏷️ Label Encoding(標籤編碼)

"Chicago" 0 "Houston" 1 "Los Angeles" 2 "New York" 3 "Phoenix" 4
  • 節省記憶體
  • 適合有序類別或樹型模型
  • ⚠️ 無序類別用此法會引入假順序

🔢 One-Hot Encoding(獨熱編碼)

"紅" [1, 0, 0] "綠" [0, 1, 0] "藍" [0, 0, 1]
  • 消除假順序關係
  • 適合線性模型、神經網路
  • ⚠️ 類別太多時會「維度爆炸」
06 課堂程式碼預覽

課堂上會實際操作以下程式碼,先看過一遍,上課時就能跟上節奏。

data_cleaning.py — 資料清洗實作
import pandas as pd
import numpy as np

# 建立範例資料集
data = {
    "Name":   ["Alice", "Bob", "Charlie", "David", "Alice", np.nan],
    "Age":    [25, np.nan, 35, 40, 25, 30],
    "Salary": [50000, 60000, 70000, np.nan, 50000, 150000]
}
df = pd.DataFrame(data)

# 1. 檢視缺失值數量
print(df.isnull().sum())

# 2. 用均值填補 Age、中位數填補 Salary
df["Age"]    = df["Age"].fillna(df["Age"].mean())
df["Salary"] = df["Salary"].fillna(df["Salary"].median())

# 3. 刪除重複行
df = df.drop_duplicates()
feature_scaling.py — 特徵縮放
from sklearn.preprocessing import StandardScaler, MinMaxScaler

# 標準化(均值0、標準差1)
scaler = StandardScaler()
data_std = scaler.fit_transform(data)

# 正規化(壓縮到 [0,1] 範圍)
scaler2 = MinMaxScaler()
data_norm = scaler2.fit_transform(data)
07 本課程使用的工具
Python 套件
Pandas
表格資料處理的核心工具。讀取、清洗、轉換資料的大多數操作都用它。
Python 套件
NumPy
數值運算基礎。Pandas 底層依賴 NumPy,處理矩陣與陣列運算。
Python 套件
Scikit-learn
提供 StandardScalerMinMaxScalerLabelEncoderOneHotEncoder 等現成工具。
Python 套件
Matplotlib / Seaborn
視覺化資料分佈,幫助識別異常值與資料偏態。

08 預習思考題

帶著這些問題去上課,不必現在找到答案——思考本身才是重點。

Q 01 一個欄位有 30% 的缺失值,你會選擇刪除還是填補?你的決定依據什麼? 概念
💡 想想看:刪除會損失多少資料?填補可能引入什麼偏差?
Q 02 對「城市名稱」這類無序類別,為什麼不能直接用標籤編碼(0、1、2…)? 概念
💡 模型會對這些整數做數學運算,想想這會造成什麼問題。
Q 03 若資料有一個特徵範圍是 [0, 1],另一個是 [0, 1,000,000],在使用 KNN 演算法時會發生什麼事?特徵縮放如何解決這個問題? 應用
💡 KNN 的核心是計算距離——哪個特徵會主導距離計算?
Q 04 薪資欄出現 -10000,年齡欄出現 -5,這是「缺失值」還是「異常值」?處理方式有什麼不同? 應用
💡 缺失 vs. 錯誤 vs. 真實極端值——三種情況各有不同的對策。
Q 05 在 Python 中,df.dropna()df.fillna() 的差別是什麼?各適合什麼情境? 程式
💡 先看一眼上方的程式碼預覽,想想兩者的行為差異。

09 上課前確認清單
確認你已完成:
□  我知道資料前處理的四個主要步驟
□  我能說出標準化與正規化的公式與差異
□  我知道 Label Encoding 和 One-Hot Encoding 各適合哪種情境
□  我的 Python 環境已安裝 pandasnumpyscikit-learn