AI時代系列(1) 機器學習三部曲: 🔹 第一部:《機器學習 —— AI 智慧的啟航》
17/100 第二週:資料處理與特徵工程
17. 資料分割(訓練集、測試集) ✂ 適當切分數據,避免 AI 記住答案而不會「舉一反三」!
資料分割(訓練集、測試集) ✂
適當切分數據,避免 AI 記住答案,而不會「舉一反三」!
在機器學習中,為了讓模型具備「泛化能力」,我們需要將數據切分成不同部分,以確保模型不會只記住訓練數據,而能夠在新數據上表現良好。這樣可以有效避免過擬合(Overfitting),並提升模型在實際應用中的效能。
________________________________________
1️⃣ 為什麼要做資料分割?
📌 主要目標:
• 確保模型的泛化能力:讓 AI 學會「舉一反三」,而不是死記硬背。
• 避免過擬合:如果模型只學習訓練數據,可能無法在新數據上表現良好。
• 評估模型效能:透過測試集驗證模型是否能夠應用於真實世界的數據。
________________________________________
2️⃣ 常見的資料分割方法
一般來說,數據會被分成以下幾個部分:
• 訓練集(Training Set)📚:用來訓練模型,通常佔 60%~80%。
• 驗證集(Validation Set)🔍:用來調整模型超參數,避免過擬合,通常佔 10%~20%。
• 測試集(Test Set)🎯:用來最終評估模型效能,通常佔 10%~20%。
📊 最常見的分割比例
在劃分訓練集、驗證集與測試集時,不同的比例劃分適用於不同的模型開發階段與複雜度。
常見的 80/20 劃分方式,將 80% 的數據用於訓練,20% 用於測試,適合用於初步模型評估,快速檢視模型效果。而 70/15/15 的比例則更加均衡,將數據分為 70% 訓練集、15% 驗證集與 15% 測試集,
有助於超參數調整與模型優化過程中對模型表現進行更細緻的評估。對於較複雜的模型,則可採用 60/20/20 的劃分,將更多數據分配給驗證集與測試集,以便更充分地檢測模型在不同階段的泛化能力與穩定性。選擇適當的數據劃分比例,能有效提升模型訓練的效率與最終表現。
________________________________________
3️⃣ 資料分割的 Python 實作
✅ (1) 80/20 分割(訓練集 + 測試集)
📌 適用於一般機器學習專案
python
from sklearn.model_selection import train_test_split
import numpy as np
import pandas as pd
# 生成隨機數據(100 筆數據,5 個特徵)
X = np.random.rand(100, 5)
y = np.random.randint(0, 2, size=100) # 0 或 1
# 80% 訓練集,20% 測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
print(f"訓練集大小: {X_train.shape}, 測試集大小: {X_test.shape}")
📌 結果
• 80% 用於訓練
• 20% 用於測試
________________________________________
✅ (2) 70/15/15 分割(訓練集 + 驗證集 + 測試集)
📌 適用於深度學習 & 超參數調整
python
# 先分割為 80% 訓練集 & 20% 測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 再將訓練集切分為 70% 訓練集 & 15% 驗證集
X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.1875, random_state=42) # 15/80 = 18.75%
print(f"訓練集大小: {X_train.shape}, 驗證集大小: {X_val.shape}, 測試集大小: {X_test.shape}")
📌 結果
• 70% 訓練集
• 15% 驗證集(用來調整超參數)
• 15% 測試集(最終評估)
________________________________________
✅ (3) K-Fold 交叉驗證(Cross Validation, CV)
📌 適用於數據量少,最大化數據利用率
python
from sklearn.model_selection import KFold, cross_val_score
from sklearn.ensemble import RandomForestClassifier
kf = KFold(n_splits=5, shuffle=True, random_state=42)
# 訓練隨機森林模型並執行交叉驗證
model = RandomForestClassifier()
scores = cross_val_score(model, X, y, cv=kf)
print(f"每折的準確度: {scores}")
print(f"平均準確度: {scores.mean():.4f}")
📌 結果
• 透過 5 折交叉驗證,每次使用不同的測試集,最終計算平均準確度。
________________________________________
✅ (4) 時間序列分割(Time Series Split)
📌 適用於時間序列數據(如股票、天氣預測)
python
from sklearn.model_selection import TimeSeriesSplit
tscv = TimeSeriesSplit(n_splits=5)
for train_index, test_index in tscv.split(X):
print("訓練集索引:", train_index, "測試集索引:", test_index)
📌 結果
• 每次測試集都比訓練集的時間點晚,模擬真實預測情境。
________________________________________
4️⃣ 如何選擇合適的資料分割方法?
數據集切分方法依需求而定。80/20 分割簡單易用,適合初步測試,但可能受數據分佈影響。
70/15/15 分割適用於超參數調整和深度學習,惟測試集較小。K-Fold 交叉驗證能最大化數據利用率,適合數據量少的情況,但計算成本較高。
時間序列分割則保持時間順序,適用於時間序列預測,但無法隨機打亂數據。根據任務特性選擇合適策略,有助於提升模型效果。
________________________________________
5️⃣ 避免數據分割的錯誤
⚠ 錯誤 1:測試集數據洩漏
• 🚫 錯誤: 測試數據不應出現在訓練數據中。
• ✅ 解決方案: 在分割前檢查是否有重複數據,確保測試集是「完全新」的數據。
⚠ 錯誤 2:類別不平衡(Imbalanced Data)
• 🚫 錯誤: 如果一個類別(例如 0/1 標籤)在測試集中幾乎沒有,模型可能無法泛化。
• ✅ 解決方案: 使用 stratify=y 來保持類別比例一致:
python
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, stratify=y, random_state=42)
⚠ 錯誤 3:時間序列數據亂序
• 🚫 錯誤: 在時間序列問題中,不應隨機打亂數據。
• ✅ 解決方案: 使用 TimeSeriesSplit(),保持時間順序。
________________________________________
🎯 結論
📌 正確的數據分割 = 更好的模型泛化能力!
📌 選擇適合的分割方式,確保 AI 學會舉一反三,而不是死記答案! 🚀
👉 你的 AI 不能只學考古題,它需要真正理解新數據! 🎯