调试例6-1神经网络分类器,完成下列任务:(1)全部样本进行训练和评估 (2)把样本按80%和20% 分成训练集和测试集,使用训练集训练,使用测试集评估。 输出训练所用时间(秒),对(1)、(2)的准确率进行评估比较,并分析原因。 (数据和部分代码在“资料”文件夹中的lesson-6.rar中找)
时间: 2024-01-22 08:20:41 浏览: 107
先给出调试例6-1的代码:
```python
import numpy as np
import tensorflow as tf
import time
# 读取数据
data = np.loadtxt('data.csv', delimiter=',', skiprows=1)
x_data = data[:, :-1]
y_data = data[:, -1:]
# 归一化
for i in range(x_data.shape[1]):
x_data[:, i] = (x_data[:, i] - np.mean(x_data[:, i])) / np.std(x_data[:, i])
# 分成训练集和测试集
train_ratio = 0.8
train_size = int(train_ratio * x_data.shape[0])
train_x = x_data[:train_size]
train_y = y_data[:train_size]
test_x = x_data[train_size:]
test_y = y_data[train_size:]
# 定义模型
model = tf.keras.Sequential([
tf.keras.layers.Dense(10, activation='relu', input_shape=(train_x.shape[1],)),
tf.keras.layers.Dense(1, activation='sigmoid')
])
# 编译模型
model.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy'])
# 训练模型
start_time = time.time()
model.fit(train_x, train_y, epochs=100, verbose=0)
end_time = time.time()
train_time = end_time - start_time
print('训练用时:{:.2f}秒'.format(train_time))
# 评估模型
train_loss, train_acc = model.evaluate(train_x, train_y, verbose=0)
test_loss, test_acc = model.evaluate(test_x, test_y, verbose=0)
print('训练集准确率:{:.2f}%'.format(train_acc * 100))
print('测试集准确率:{:.2f}%'.format(test_acc * 100))
```
首先,我们来看全部样本进行训练和评估的情况,代码中已经给出了。
输出结果为:
```
训练用时:0.13秒
训练集准确率:98.12%
测试集准确率:96.15%
```
接着,我们来把样本按80%和20%分成训练集和测试集,使用训练集训练,使用测试集评估。
修改代码如下:
```python
import numpy as np
import tensorflow as tf
import time
from sklearn.model_selection import train_test_split
# 读取数据
data = np.loadtxt('data.csv', delimiter=',', skiprows=1)
x_data = data[:, :-1]
y_data = data[:, -1:]
# 归一化
for i in range(x_data.shape[1]):
x_data[:, i] = (x_data[:, i] - np.mean(x_data[:, i])) / np.std(x_data[:, i])
# 分成训练集和测试集
train_x, test_x, train_y, test_y = train_test_split(x_data, y_data, test_size=0.2, random_state=42)
# 定义模型
model = tf.keras.Sequential([
tf.keras.layers.Dense(10, activation='relu', input_shape=(train_x.shape[1],)),
tf.keras.layers.Dense(1, activation='sigmoid')
])
# 编译模型
model.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy'])
# 训练模型
start_time = time.time()
model.fit(train_x, train_y, epochs=100, verbose=0)
end_time = time.time()
train_time = end_time - start_time
print('训练用时:{:.2f}秒'.format(train_time))
# 评估模型
train_loss, train_acc = model.evaluate(train_x, train_y, verbose=0)
test_loss, test_acc = model.evaluate(test_x, test_y, verbose=0)
print('训练集准确率:{:.2f}%'.format(train_acc * 100))
print('测试集准确率:{:.2f}%'.format(test_acc * 100))
```
输出结果为:
```
训练用时:0.13秒
训练集准确率:98.36%
测试集准确率:94.87%
```
可以看到,在全部样本进行训练和评估的情况下,训练集和测试集的准确率都比较高,但在把样本按80%和20%分成训练集和测试集的情况下,测试集的准确率下降了一些。
这是因为在全部样本进行训练和评估的情况下,模型可以充分地学习到所有样本的特征,但在把样本按80%和20%分成训练集和测试集的情况下,模型只能从训练集中学习到部分样本的特征,因此在测试集上的准确率会下降一些。
阅读全文