交叉驗證

使用 scikit-learn 進行監督式學習

George Boorman

Core Curriculum Manager, DataCamp

為何需要交叉驗證

  • 模型效能取決於資料如何切分

  • 可能無法代表模型對未見資料的泛化能力

  • 解法:交叉驗證!

使用 scikit-learn 進行監督式學習

交叉驗證基礎

表頭:split 1、fold 1、fold 2、fold 3、fold 4、fold 5

使用 scikit-learn 進行監督式學習

交叉驗證基礎

split 1 保留為測試集

使用 scikit-learn 進行監督式學習

交叉驗證基礎

fold 2–5 作為訓練資料

使用 scikit-learn 進行監督式學習

交叉驗證基礎

在這些 folds 上計算評估指標

使用 scikit-learn 進行監督式學習

交叉驗證基礎

以 Fold 2 作為測試資料

使用 scikit-learn 進行監督式學習

交叉驗證基礎

fold 1、3、4、5 作為訓練資料

使用 scikit-learn 進行監督式學習

交叉驗證基礎

再次計算評估指標

使用 scikit-learn 進行監督式學習

交叉驗證基礎

以第三個 fold 重複

使用 scikit-learn 進行監督式學習

交叉驗證基礎

以第四個 fold 重複

使用 scikit-learn 進行監督式學習

交叉驗證基礎

以第五個 fold 重複

使用 scikit-learn 進行監督式學習

交叉驗證與模型效能

  • 5 個 folds = 5-fold CV

  • 10 個 folds = 10-fold CV

  • k 個 folds = k-fold CV

  • folds 越多,計算成本越高

使用 scikit-learn 進行監督式學習

在 scikit-learn 進行交叉驗證

from sklearn.model_selection import cross_val_score, KFold

kf = KFold(n_splits=6, shuffle=True, random_state=42)
reg = LinearRegression()
cv_results = cross_val_score(reg, X, y, cv=kf)
使用 scikit-learn 進行監督式學習

評估交叉驗證表現

print(cv_results)
[0.70262578, 0.7659624, 0.75188205, 0.76914482, 0.72551151, 0.73608277]
print(np.mean(cv_results), np.std(cv_results))
0.7418682216666667 0.023330243960652888
print(np.quantile(cv_results, [0.025, 0.975]))
array([0.7054865, 0.76874702])
使用 scikit-learn 進行監督式學習

一起來練習吧!

使用 scikit-learn 進行監督式學習

Preparing Video For Download...