本文正在参与「金石方案 . 分割6万现金大奖」
前语
本文的主要内容是运用 cpu 版别的 tensorflor-2.1 完结对 Auto MPG 数据集的回归猜测任务。
本文大纲
- 获取 Auto MPG 数据
- 对数据进行处理
- 建立深度学习模型、并完结模型的装备和编译
- 运用 EarlyStoping 完结模型练习
- 运用测验数据对模型进行评价
- 运用模型进行猜测
- 展现没有进行归一化操作的练习进程
1. 获取 Auto MPG 数据并进行数据的归一化处理
(1)Auto MPG 数据集描述了轿车燃油效率的特征值和标签值,咱们经过模型的学习能够从特征中找到规则,最终以最小的差错来猜测方针 MPG 。
(2)咱们运用 keras 自带的函数能够直接从网络上下载数据保存到本地。
(3)每行都包含 MPG 、气缸、排量、马力、分量、加快、车型年份、原产地等八列数据,其中 MPG 便是咱们的标签值,其他都是特征。
dataset_path = keras.utils.get_file("auto-mpg.data", "http://archive.ics.uci.edu/ml/machine-learning-databases/auto-mpg/auto-mpg.data")
column_names = ['MPG','气缸','排量','马力','分量', '加快', '车型年份', '原产地']
raw_dataset = pd.read_csv(dataset_path, names=column_names, na_values = "?", comment='\t', sep=" ", skipinitialspace=True)
dataset = raw_dataset.copy()
2. 对数据进行处理
(1)由于数据中存在一些空值,会影响咱们关于特征的计算和方针的猜测,所以将数据中存在空数据的行删除去。
dataset = dataset.dropna()
(2)由于“原产地”这一列一共只有 1、2、3 三种值,分别表明三个国家,所以咱们将他们各自提出来独自做成一列,这样就相当于给每个国家类别转换成了 ont-hot 。
origin = dataset.pop('原产地')
dataset['阿美莉卡'] = (origin == 1)*1.0
dataset['殴们'] = (origin == 2)*1.0
dataset['小日本子'] = (origin == 3)*1.0
(3)依照一定的比例,取 90% 的数据为练习数据,取 10% 的数据为测验数据。
train_datas = dataset.sample(frac=0.9, random_state=0)
test_datas = dataset.drop(train_dataset.index)
(4) 这儿主要是运用一些内置的函数来查看练习集对每一列数据的各种常见的计算方针状况,主要有 count、mean、std、min、25%、50%、75%、max ,这样省去了咱们后边的计算,直接运用即可。
train_stats = train_datas.describe()
train_stats.pop("MPG")
train_stats = train_stats.transpose()
(5)数据中的 MPG 便是咱们需求猜测的回归方针,咱们将这一列从练习集和测验会集弹出,独自做成标签。 MPG 意思便是 Miles per Gallon ,这是一个衡量一辆轿车在邮箱中只加一加仑汽油或柴油时能够行进多少英里的中要方针。
train_labels = train_datas.pop('MPG')
test_labels = test_datas.pop('MPG')
(6)这儿主要是对练习数据和测验数据进行归一化,将每个特征应独立缩放到相同规模,由于当输入数据特征值存在不同规模时,不利于模型练习的快速收敛,我在文章最终的第七节中放了一张没有进行数据归一化后模型练习评价方针,能够看到很乱七八糟。
def norm(stats, x):
return (x - stats['mean']) / stats['std']
train_datas = norm(train_stats, train_datas)
test_datas = norm(train_stats, test_datas)
3. 建立深度学习模型、并完结模型的装备和编译
这儿主要是建立深度学习模型、装备模型并编译模型。
(1)模型主要有三层:
- 第一层主要是一个全连接层操作,将每个样本的一切特征值输入,经过 relu 激活函数的非线性改变,最终输出一个 64 维的向量。
- 第二层主要是一个全连接层操作,将上一层的 64 维的向量,经过 relu 激活函数的非线性改变,最终输出一个 32 维的向量。
- 第三层主要是一个全连接层操作,将上一层的 32 维的向量,最终输出一个 1 维的成果,这其实便是输出猜测的回 MPG 。
(2)模型中优化器这儿选用 RMSprop ,学习率为 0.001 。
(3)模型中的损失值方针是 MSE ,MSE 其实便是均方差,该计算参数是模型猜测值和原始样本的 MPG 值差错的平方和的均值。
(4)模型的评价方针选用 MAE 和 MSE ,MSE 和上面的相同,MAE 是平均绝对差错,该计算参数指的便是模型猜测值与原始样本的 MPG 之间绝对差错的平均值。
def build_model():
model = keras.Sequential([ layers.Dense(64, activation='relu', input_shape=[len(train_datas.keys())]),
layers.Dense(32, activation='relu'),
layers.Dense(1) ])
optimizer = tf.keras.optimizers.RMSprop(0.001)
model.compile(loss='mse', optimizer=optimizer, metrics=['mae', 'mse'])
return model
model = build_model()
4. 运用 EarlyStoping 完结模型练习
(1)这儿运用练习集数据和标签进行模型练习,一共需求进行 1000 个 epoch ,并且在练习进程中选取练习数据的 20% 作为验证集来评价模型效果,为了防止存在过拟合的现象,这儿咱们用 EarlyStopping 技能来进行优化,也便是当经过一定数量的 epoch (咱们这儿定义的是 20 )后没有改善效果,则自动中止练习。
early_stop = keras.callbacks.EarlyStopping(monitor='val_loss', patience=20)
history = model.fit(train_datas, train_labels, epochs=1000, validation_split = 0.2, verbose=2, callbacks=[early_stop])
练习进程的方针输出如下,能够看到到了第 106 次 epoch 之后就中止了练习:
Train on 282 samples, validate on 71 samples
Epoch 1/1000
282/282 - 0s - loss: 567.8865 - mae: 22.6320 - mse: 567.8865 - val_loss: 566.0270 - val_mae: 22.4126 - val_mse: 566.0270
Epoch 2/1000
282/282 - 0s - loss: 528.5458 - mae: 21.7937 - mse: 528.5459 - val_loss: 526.6008 - val_mae: 21.5748 - val_mse: 526.6008
...
Epoch 105/1000
282/282 - 0s - loss: 6.1971 - mae: 1.7478 - mse: 6.1971 - val_loss: 5.8991 - val_mae: 1.8962 - val_mse: 5.8991
Epoch 106/1000
282/282 - 0s - loss: 6.0749 - mae: 1.7433 - mse: 6.0749 - val_loss: 5.7558 - val_mae: 1.8938 - val_mse: 5.7558
(2)这儿也展现的是模型在练习进程,运用练习集和验证集的 mae 、mse 制作的两幅图片,咱们能够看到在抵达 100 多个 epoch 之后,练习进程就终止了,防止了模型的过拟合。
5. 运用测验数据对模型进行评价
loss, mae, mse = model.evaluate(test_datas, test_labels, verbose=2)
print("测验集的 MAE 为: {:5.2f} MPG ,MSE 为 : {:5.2f} MPG".format(mae, mse))
输出成果为:
测验集的 MAE 为: 2.31 MPG ,MSE 为 : 9.12 MPG
6. 运用模型进行猜测
咱们选取了一条测验数据,运用模型对其 MPG 进行猜测。
predictions = model.predict(test_data[:1]).flatten()
predictions
成果为 :
array([15.573855], dtype=float32)
而实践的测验样本数据 MPG 为 15.0 ,能够看出与猜测值有 0.573855 的差错,其实咱们还能够建立更加杂乱的模型,挑选更加多的特征来进行模型的练习,理论上能够达到更小的猜测差错。
7. 展现没有进行归一化操作的练习进程
咱们将没有进行归一化的数据在练习进程中的方针状况进行展现,能够看出来练习的方针乱七八糟。所以一般状况下咱们引荐对数据做归一化,有利于模型练习的快速收敛。