実現したいこと
コードを理解する
前提
適当にネットから拾ってきたコードを組み合わせてCNNで機械学習を行えるようになりました。
コードを見直していると、何を行っているのか理解できない部分があったため、解説していただきたく、質問させていただきました。
本コードでは間違えてvalidation dataにtrain_test_splitで分離したtestデータをvalidationに使用してしまっていたため、解決次第、trainデータ、validationデータ、testデータの3つに分けて学習・評価を行おうと思っています。
発生している問題・エラーメッセージ
合計23940個のサンプルがあり、train_test_splitで30%をテストデータとし、16758個のtrainデータと7182個のtestデータに分けました。
質問1
9行目で
for train, test in kfold.split(x_train, y_train):
とありますが、これは何を層化k分割交差検証しているのでしょうか。そもそも層化k分割交差検証できているのでしょうか。次の①、②、③のうちどれが正しいのか、あるいはどれも正しくないのか教えてただきたいです。
①16758個のtrainデータをfold_numberの2で分け、前半の8329個のtrainデータで50エポックの学習を行いつつ7182個のデータでvalidationも行う。終了次第後半の8329個のtrainデータで50エポックの学習を最初から行いつつ、7182個のデータでvalidationも行う。
②16758個のtrainデータと7182個のtestデータをfold_numberの2で分け、前半の8329個のtrainデータで50エポックの学習を行いつつ前半の3591個のデータでvalidationも行う。終了次第後半の8329個のtrainデータで50エポックの学習を最初から行いつつ、後半の3591個のデータでvalidationも行う。
③16758個のtrainデータで50エポックの学習を行いつつ7182個のデータでvalidationも行う。それをただ2回繰り返す。
質問2
色んなサイトを見ていると、kfold.splitの引数にx_trainしか指定していないコードがたくさん見受けられました。
kfold.split(x_train, y_train)ではなく、kfold.split(x_train)でも同じ結果になるのかどうか教えていただきたいです。
該当のソースコード
python
1fold_number = 2 2seed =7 3np.random.seed(seed) 4kfold = StratifiedKFold(n_splits = fold_number, shuffle = True, random_state = seed) 5cvscores = [] 6 7start_time = time.time() 8 9for train, test in kfold.split(x_train, y_train): 10 model = Sequential() 11 model.add(Conv2D(16, (3, 3), padding='same', 12 input_shape=(100, 100, 1), activation='relu')) 13 model.add(MaxPooling2D(pool_size=(2, 2))) 14 model.add(Conv2D(128, (3, 3), padding='same', activation='relu')) #3*3*16のフィルタを128枚 15 model.add(Conv2D(256, (3, 3), padding='same', activation='relu')) #3*3*128のフィルタを256枚 16 model.add(MaxPooling2D(pool_size=(2, 2))) 17 model.add(Dropout(0.5)) 18 model.add(Flatten()) 19 model.add(Dense(128, activation='relu')) 20 model.add(Dropout(0.5)) 21 model.add(Dense(class_number, activation='softmax')) 22 23 model.summary() 24 25 model.compile(loss='categorical_crossentropy', 26 optimizer=Adam(amsgrad=True), 27 metrics=['accuracy']) 28 29 history = model.fit(x_train, keras.utils.to_categorical(y_train, class_number), 30 batch_size=128, epochs=50, verbose=1, 31 validation_data=(x_test, keras.utils.to_categorical(y_test, class_number))) 32 33 scores = model.evaluate(x_test, keras.utils.to_categorical(y_test, class_number), 34 verbose=0) 35 print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100)) 36 cvscores.append(scores[1] * 100)
試したこと
https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.StratifiedKFold.html
公式サイトを見ましたがよく理解できませんでした。
補足情報(FW/ツールのバージョンなど)
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/01/19 15:51
2024/01/19 15:53
2024/01/19 16:14 編集
2024/01/19 16:50
2024/01/19 16:58
2024/01/21 18:48