簡體   English   中英

為什么在相同數據上訓練准確率為 99%,但預測准確率為 81%?

[英]Why is training accuracy at 99% but the prediction accuracy at 81% on the same data?

我查找了與該問題類似的問題,但我仍然不明白為什么它會給出這樣的結果。 model 訓練高達 99% 的准確度是否正常,但是當用於預測相同的精確數據時,它給出的准確度較低,在這種情況下為 81%? 它不應該返回 99% 的准確率嗎?

此外,當我展示新的看不見的數據時,預測准確度是糟糕的 17%。 這肯定是不對的。 據我了解,model 在呈現新數據時應該低於模型的准確度,但不會差到 17%。

這是上下文的代碼。 為了便於閱讀,我放了評論:

# Step 1) Split Data into Training and Prediction Sets
num_split_df_at = int(0.75*len(df))
np_train_data = df.iloc[0:num_split_df_at, columns_index_list].to_numpy()
np_train_target = list(df.iloc[0:num_split_df_at, 4])
np_predict_data = df.iloc[num_split_df_at:len(df), columns_index_list].to_numpy()
np_predict_target = list(df.iloc[num_split_df_at:len(df), 4])

# Step 2) Split Training Data into Training and Validation Sets
x_train, x_test, y_train, y_test = train_test_split(np_train_data, np_train_target, random_state=0)


# Step 3) Reshape Training and Validation Sets to (49, 5)
# prints: "(3809, 245)"
print(x_train.shape)
# prints: "(1270, 245)"
print(x_test.shape)
x_train = x_train.reshape(x_train.shape[0], round(x_train.shape[1]/5), 5)
x_test = x_test.reshape(x_test.shape[0], round(x_test.shape[1]/5), 5)
y_train = np.array(y_train)- 1
y_test = np.array(y_test)- 1
# prints: "(3809, 49, 5)"
print(x_train.shape)
# prints: "[0 1 2 3 4 5 6 7 8 9]"
print(np.unique(y_train))
# prints: "10"
print(len(np.unique(y_train)))

input_shape = (x_train.shape[1], 5)

# Step 4) Run Model
adam = keras.optimizers.Adam(learning_rate=0.0001)
model = Sequential()
model.add(Conv1D(512, 5, activation='relu', input_shape=input_shape))
model.add(Conv1D(512, 5, activation='relu'))
model.add(MaxPooling1D(3))
model.add(Conv1D(512, 5, activation='relu'))
model.add(Conv1D(512, 5, activation='relu'))
model.add(GlobalAveragePooling1D())
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))
model.compile(loss='sparse_categorical_crossentropy', optimizer=adam, metrics=['accuracy'])
    
model.fit(x_train, y_train, batch_size=128, epochs=150, validation_data=(x_test, y_test))
print(model.summary())
model.save('model_1')

# Step 5) Predict on Exact Same Trained Data - Should Return High Accuracy
np_train_data = np_train_data.reshape(np_train_data.shape[0], round(np_train_data.shape[1]/5), 5)
np_train_target = np.array(np_train_target)- 1
predict_results = model.predict_classes(np_train_data)
print(accuracy_score(predict_results, np_train_target))

# Step 6) Predict on Validation Set
np_predict_data = np_predict_data.reshape(np_predict_data.shape[0], round(np_predict_data.shape[1]/5), 5)
np_predict_target = np.array(np_predict_target)- 1
predict_results = model.predict_classes(np_predict_data)
print(accuracy_score(predict_results, np_predict_target))

以下是預測結果:

在此處輸入圖像描述

我的輸入數據與此類似 - 49 天,每天 5 個數據點: 在此處輸入圖像描述

我的 output 可能的分類結果是:

[1 2 3 4 5 6 7 8 9 10]轉換為“sparse_categorical_crossentropy”的[0 1 2 3 4 5 6 7 8 9]

這是因為 Keras 模型的訓練精度/損失是按批次計算的,然后取平均值( 請參見此處)。 相反,驗證指標/性能是在所有傳遞的數據上同時計算的。

這只是為了在這個虛擬示例中進行驗證。 我們訓練一個神經網絡並將相同的訓練數據作為有效數據傳遞。 通過這種方式,我們可以在訓練結束時比較 (a) 訓練 acc、(b) 驗證 acc 和 (c) accuracy_score。 正如我們所見,(b) = (c) 但由於上述原因,(a) 與 (c) 和 (b) 不同

timestamp, features, n_sample = 45, 2, 1000
n_class = 10
X = np.random.uniform(0,1, (n_sample, timestamp, features))
y = np.random.randint(0,n_class, n_sample)

model = Sequential()
model.add(Conv1D(8, 3, activation='relu', input_shape=(timestamp, features)))
model.add(MaxPooling1D(3))
model.add(Conv1D(8, 3, activation='relu'))
model.add(GlobalAveragePooling1D())
model.add(Dropout(0.5))
model.add(Dense(n_class, activation='softmax'))
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    
history = model.fit(X, y, batch_size=128, epochs=5, validation_data=(X, y))

history.history['accuracy'][-1] # (a)
history.history['val_accuracy'][-1] # (b)
accuracy_score(y, np.argmax(model.predict(X), axis=1)) # (c)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM