python - 测试精度高于训练精度
问题描述
为什么测试准确率高于我的训练准确率?验证准确性并非如此。是因为我拆分数据集的方式吗?
修改网络不起作用,所以我猜我在数据集准备部分做错了。
该数据集由恶意软件和正常活动的数据包捕获组成。dataset.txt 文件总共包含 777 行和 28 列。
#converting dataset and labels to numpy arrays
x = np.genfromtxt("dataset.txt", delimiter=",")
y = np.genfromtxt("label.txt", delimiter=",")
#handling missing values
x[np.isnan(x)] = 0
#shuffling the data
indices = np.arange(x.shape[0])
np.random.shuffle(indices)
x = x[indices]
y = y[indices]
#dividing the dataset into train and test
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=0)
#building the model
def build_model():
model = models.Sequential()
model.add(layers.Dense(32, activation='relu', input_shape=(28,)))
model.add(layers.Dense(32, activation='relu'))
model.add(layers.Dense(32, activation='relu'))
model.add(Dropout(0.2))
model.add(layers.Dense(1, activation='sigmoid'))
model.compile(optimizer='rmsprop', loss='binary_crossentropy',
metrics=['accuracy'])
return model
'''cross validation
k = 5
num_val_samples = len(x_train) // k
all_scores = []
for i in range(k):
print('fold #', i)
x_val = x_train[i * num_val_samples: (i + 1) * num_val_samples]
y_val = y_train[i * num_val_samples: (i + 1) * num_val_samples]
partial_x_train = np.concatenate([x_train[:i * num_val_samples],
x_train[(i + 1) * num_val_samples:]], axis=0)
partial_y_train = np.concatenate([y_train[:i * num_val_samples],
y_train[(i + 1) * num_val_samples:]], axis=0)
model = build_model()
model.fit(partial_x_train, partial_y_train,epochs=20, batch_size=16,
verbose=0)
val_loss, val_acc = model.evaluate(x_val, y_val, verbose=0)
all_scores.append(val_acc)
print(all_scores)
val_acc = np.mean(all_scores)
print(val_loss , val_acc)
'''
#training the model with the entire training dataset
model = build_model()
model.fit(x_train, y_train, epochs=20, batch_size=16)
#confusion matrix
y_pred = model.predict(x_test)
y_pred = (y_pred > 0.5)
result = confusion_matrix(y_test, y_pred)
print ('Confusion Matrix:')
print(result)
#calculating the test accuracy
model_acc = accuracy_score(y_test, y_pred)
print('Test Accuracy:')
print(model_acc)
解决方案
这是因为 keras 报告了每个 epoch 的运行平均准确度。对于少数时期,这意味着在一个时期结束时,您的模型比该时期的平均水平要好。
这也可能是由于测试集中随机有“更容易”的样本,但如果你在代码的同一部分随机拆分它,每次运行都不会发生这种情况。
推荐阅读
- javafx - 将 TextField 文本设置为 TableView 列中的数据
- python - 在特定列中添加行总和并存储在同一数据框pyspark中
- google-apps-script - 如何限制用户对社区连接器脚本的访问?
- c - 使用c中的系统调用附加到文件
- java - 从 Java 代码运行 Android shell 命令返回空输出
- python - 在 docxtpl (DocxTemplate) 和 Jinja2 中使用 UTF-8
- flutter - 颤振 | 使用 Chrome DevTools 检查 Android SQLite 数据库 | VSCode
- angular - 如何以角度创建多个可折叠卡片
- javascript - 如何在垫表行中显示图标?
- r - 问题训练 XGB 模型 - sparkxgb, sparklyr