web-dev-qa-db-ja.com

トレーニングデータとテストデータの分割方法-TensorflowのKeras

現在、ニューラルネットワークとフィット関数を使用してデータをトレーニングしています。

history=model.fit(X, encoded_Y, batch_size=50, nb_Epoch=500, validation_split = 0.2, verbose=1)

今、validation_splitを20%として使用しました。私が理解したのは、私のトレーニングデータは80%、テストデータは20%になるということです。このデータがバックエンドでどのように処理されるか混乱しています。上位80%のサンプルがトレーニングに使用され、20%パーセント未満がテストに使用されるのですか、それともサンプルが中間からランダムに選択されるのですか?個別のトレーニングデータとテストデータを提供する場合は、fit()を使用してどのように行うのですか?

さらに、私の2番目の懸念は、データがモデルにうまく適合しているかどうかを確認する方法ですか?結果から、トレーニングの精度は約90%、検証の精度は約55%であることがわかります。これは、過剰適合または過小適合の場合であることを意味しますか?

私の最後の質問は、リターンを評価するものは何ですか?ドキュメントはそれが損失を返すと述べていますが、私は各エポックの間に(fit()(歴史の中で)の戻りとして)損失と正確さをすでに得ています。評価によって返される精度とスコアは何を示していますか?評価によって返される精度が90%を返す場合、各エポックの個々の精度と損失に関係なく、データが適切に適合していると言えますか?

以下は私のコードです:

import numpy
import pandas
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.wrappers.scikit_learn import KerasClassifier
from sklearn.model_selection import cross_val_score
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import StratifiedKFold
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from keras.utils import np_utils
from sklearn.model_selection import KFold
from sklearn.metrics import confusion_matrix
import itertools

seed = 7
numpy.random.seed(seed)

dataframe = pandas.read_csv("INPUTFILE.csv", skiprows=range(0, 0))

dataset = dataframe.values
X = dataset[:,0:50].astype(float) # number of cols-1
Y = dataset[:,50]

encoder = LabelEncoder()
encoder.fit(Y)
encoded_Y = encoder.transform(Y)

encoded_Y = np_utils.to_categorical(encoded_Y)
print("encoded_Y=", encoded_Y) 
# baseline model
def create_baseline():
    # create model
    model = Sequential()
    model.add(Dense(5, input_dim=5, kernel_initializer='normal', activation='relu'))
    model.add(Dense(5, kernel_initializer='normal', activation='relu'))
    #model.add(Dense(2, kernel_initializer='normal', activation='sigmoid'))

    model.add(Dense(2, kernel_initializer='normal', activation='softmax'))

    # Compile model
    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])  # for binayr classification
        #model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])  # for multi class
    return model


model=create_baseline();
history=model.fit(X, encoded_Y, batch_size=50, nb_Epoch=500, validation_split = 0.2, verbose=1)

print(history.history.keys())
# list all data in history
print(history.history.keys())
# summarize history for accuracy
plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
plt.title('model accuracy')
plt.ylabel('accuracy')
plt.xlabel('Epoch')
plt.legend(['train', 'test'], loc='upper left')
plt.show()
# summarize history for loss
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('model loss')
plt.ylabel('loss')
plt.xlabel('Epoch')
plt.legend(['train', 'test'], loc='upper left')
plt.show()


pre_cls=model.predict_classes(X)    
cm1 = confusion_matrix(encoder.transform(Y),pre_cls)
print('Confusion Matrix : \n')
print(cm1)


score, acc = model.evaluate(X,encoded_Y)
print('Test score:', score)
print('Test accuracy:', acc)
9
eshaa
  1. Kerasのドキュメントによれば、「検証データは、シャッフル前に、提供されたxおよびyデータの最後のサンプルから選択されます。」これは、分割後にシャッフルが発生することを意味します。デフォルトとしてtrueを設定するので、データをシャッフルしたくない場合は、falseに設定できます

  2. トレーニングデータで良い結果が得られ、評価データで悪い結果が得られるかどうかは、通常、モデルが過剰適合していることを意味します。過剰適合は、モデルが非常に特定のシナリオで学習し、新しいデータで良好な結果を達成できない場合です。

  3. 評価は、「これまでに見たことのない」新しいデータでモデルをテストすることです。通常は、トレーニングとテストでデータを分割しますが、モデルを次のように調整するだけなので、3番目のデータグループを作成することもできます。テストデータでより良い結果を得るには、これはある意味で不正行為のようなものです。これは、ある方法でモデルに評価に使用するデータがどのように使用されるかを伝えているため、過剰適合を引き起こす可能性があるためです。

また、ケラを使用せずにデータを分割したい場合は、sklearn train_test_split()関数を使用することをお勧めします。

使い方は簡単で、次のようになります。

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33)
4
sebrojas