普段、機械学習のパラメーターを最適化するために
K分割交差検証をするときはGridSearchCVで済ましているのですが、
今回別の目的があって、K-分割交差検証のような分割が必要になりました。
参考:scikit-learn でグリッドサーチ
そこで、GridSearchCVの中でも使われているKFoldを使ってみたのでその記録です。
ドキュメントはこちら。
sklearn.model_selection.KFold
注意点は、splitした時に得られる結果が、データそのものではなくデータのインデックスである点くらいです。
実行してみるために、まずダミーデータを準備します。
from sklearn.model_selection import KFold
import numpy as np
# ダミーデータの準備
X = np.random.randint(20, size=(10, 2))
y = np.random.choice([0, 1], size=10)
print(X)
'''
[[ 2 12]
[ 6 3]
[ 0 3]
[15 9]
[19 0]
[12 14]
[ 0 0]
[12 18]
[ 1 9]
[ 3 14]]
'''
print(y)
# [0 0 0 1 1 1 0 1 0 0]
次に、 KFoldを動かしてみましょう。
まず挙動を確認したいので、splitして得られるイテレータの中身を表示してみます。
kf = KFold(5, shuffle=True)
for train_index, test_index in kf.split(X):
print("train_index:", train_index)
print("test_index:", test_index)
print() # 1行開ける
# 以下出力
'''
train_index: [1 2 3 4 5 6 8 9]
test_index: [0 7]
train_index: [0 1 2 3 4 6 7 9]
test_index: [5 8]
train_index: [0 1 3 4 5 6 7 8]
test_index: [2 9]
train_index: [0 1 2 5 6 7 8 9]
test_index: [3 4]
train_index: [0 2 3 4 5 7 8 9]
test_index: [1 6]
'''
ご覧の通り、0〜9の値を、5つのグループに分けて、順番に一個をテスト用にしながら交差検証用のデータセットのインデックスを返してくれています。
インデックスを元にデータを分割するには、つぎのようにして別の変数に取り出すと以降のコードが読みやすくなります。
X_train, X_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]