現在、ニューラルネットワークとフィット関数を使用してデータをトレーニングしています。
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)
Kerasのドキュメントによれば、「検証データは、シャッフル前に、提供されたxおよびyデータの最後のサンプルから選択されます。」これは、分割後にシャッフルが発生することを意味します。デフォルトとしてtrueを設定するので、データをシャッフルしたくない場合は、falseに設定できます
トレーニングデータで良い結果が得られ、評価データで悪い結果が得られるかどうかは、通常、モデルが過剰適合していることを意味します。過剰適合は、モデルが非常に特定のシナリオで学習し、新しいデータで良好な結果を達成できない場合です。
評価は、「これまでに見たことのない」新しいデータでモデルをテストすることです。通常は、トレーニングとテストでデータを分割しますが、モデルを次のように調整するだけなので、3番目のデータグループを作成することもできます。テストデータでより良い結果を得るには、これはある意味で不正行為のようなものです。これは、ある方法でモデルに評価に使用するデータがどのように使用されるかを伝えているため、過剰適合を引き起こす可能性があるためです。
また、ケラを使用せずにデータを分割したい場合は、sklearn train_test_split()
関数を使用することをお勧めします。
使い方は簡単で、次のようになります。
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33)