バイアスと分散の問題を診断する

Pythonで学ぶ木ベースのMachine Learning

Elie Kawerk

Data Scientist

汎化誤差の推定

  • モデルの汎化誤差をどのように推定するか?

  • 直接推定することはできない。理由:

    • $f$ は未知、

    • 通常、データセットは1つしかない、

    • ノイズは予測不能。

Pythonで学ぶ木ベースのMachine Learning

汎化誤差の推定

解決策:

  • データを訓練セットとテストセットに分割する、
  • $\hat{f}$ を訓練セットに適合させる、
  • 未知のテストセットで $\hat{f}$ の誤差を評価する。
  • $\hat{f}$ の汎化誤差 $\approx$ $\hat{f}$ のテストセット誤差。
Pythonで学ぶ木ベースのMachine Learning

交差検証によるモデル評価の改善

  • $\hat{f}$ の性能に確信が持てるまでテストセットには触れない。

  • 訓練セットで $\hat{f}$ を評価すると偏った推定になる($\hat{f}$ はすべての訓練データを既に見ているため)。

  • 解決策 $\rightarrow$ 交差検証(CV):

    • K-Fold CV、

    • ホールドアウトCV。

Pythonで学ぶ木ベースのMachine Learning

K-Fold CV

K-Fold CVの図

Pythonで学ぶ木ベースのMachine Learning

K-Fold CV

CV誤差の図

Pythonで学ぶ木ベースのMachine Learning

分散の問題を診断する

  • $\hat{f}$ が高分散の場合:

    $\hat{f}$ のCVエラー > $\hat{f}$ の訓練セットエラー。

  • $\hat{f}$ は訓練セットに過学習していると言われる。過学習の対処法:
    • モデルの複雑さを下げる、
    • 例:最大深度を下げる、葉の最小サンプル数を増やす、など
    • より多くのデータを収集する、など
Pythonで学ぶ木ベースのMachine Learning

バイアスの問題を診断する

  • $\hat{f}$ が高バイアスの場合:

    $\hat{f}$ のCVエラー $\approx$ $\hat{f}$ の訓練セットエラー $>>$ 目標エラー。

  • $\hat{f}$ は訓練セットに未学習と言われる。未学習の対処法:

    • モデルの複雑さを上げる
    • 例:最大深度を上げる、葉の最小サンプル数を下げる、など
    • より関連性の高い特徴量を収集する
Pythonで学ぶ木ベースのMachine Learning

AutoデータセットでのsklearnによるK-Fold CV

from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error as MSE
from sklearn.model_selection import cross_val_score

# Set seed for reproducibility SEED = 123 # Split data into 70% train and 30% test X_train, X_test, y_train, y_test = train_test_split(X,y, test_size=0.3, random_state=SEED)
# Instantiate decision tree regressor and assign it to 'dt' dt = DecisionTreeRegressor(max_depth=4, min_samples_leaf=0.14, random_state=SEED)
Pythonで学ぶ木ベースのMachine Learning

AutoデータセットでのsklearnによるK-Fold CV

# Evaluate the list of MSE ontained by 10-fold CV 
# Set n_jobs to -1 in order to exploit all CPU cores in computation
MSE_CV = - cross_val_score(dt, X_train, y_train, cv= 10, 
                           scoring='neg_mean_squared_error',
                           n_jobs = -1)

# Fit 'dt' to the training set dt.fit(X_train, y_train) # Predict the labels of training set y_predict_train = dt.predict(X_train) # Predict the labels of test set y_predict_test = dt.predict(X_test)
Pythonで学ぶ木ベースのMachine Learning
# CV MSE  
print('CV MSE: {:.2f}'.format(MSE_CV.mean()))
CV MSE: 20.51
# Training set MSE
print('Train MSE: {:.2f}'.format(MSE(y_train, y_predict_train)))
Train MSE: 15.30
# Test set MSE
print('Test MSE: {:.2f}'.format(MSE(y_test, y_predict_test)))
Test MSE: 20.92
Pythonで学ぶ木ベースのMachine Learning

練習しましょう!

Pythonで学ぶ木ベースのMachine Learning

Preparing Video For Download...