Keras入门教程
波士顿房价回归 (MPL)
前言
从本篇开始,将对Keras 自带的数据集从中选择部分进行学习
Keras 数据集模块提供的数据。模块中可用的数据如下:
- CIFAR10 小图分类
- CIFAR100 小图像分类
- IMDB电影评论情感分类
- 路透社新闻专线主题分类
- MNIST 手写数字数据库
- Fashion-MNIST 时尚文章数据库
- 波士顿房价回归数据集
关于如何下载数据集,可自行搜索,本文不作讨论。
网盘链接 提取码:1613
包括入门必备的mnist数据集,二分类问题的imdb数据集,多分类的路透社数据集和回归问题的波士顿房价数据集等。
波士顿房价回归数据集的介绍
每个类的观察值数量是均等的,共有 506 个观察,13 个输入变量和1个输出变量。
每条数据包含房屋以及房屋周围的详细信息。其中包含城镇犯罪率,一氧化氮浓度,住宅平均房间数,到中心区域的加权距离以及自住房平均房价等等。
详见如下
CRIM 城镇人均犯罪率
ZN 占地面积超过2.5万平方英尺的住宅用地比例
INDUS 城镇非零售业务地区的比例
CHAS 查尔斯河虚拟变量 (= 1 如果土地在河边;否则是0)
NOX 一氧化氮浓度(每1000万份)
RM 平均每居民房数
AGE 在1940年之前建成的所有者占用单位的比例
DIS 与五个波士顿就业中心的加权距离
RAD 辐射状公路的可达性指数
TAX 每10,000美元的全额物业税率
PTRATIO 城镇师生比例
B 1000(Bk - 0.63)^2 其中 Bk 是城镇的黑人比例
LSTAT 人口中地位较低人群的百分数
MEDV 以1000美元计算的自有住房的中位数
整个数据集包含13个特征,涵盖了用地情况、教育、人种、收入、环保、犯罪等多个方面。(这是一个标准数据集,特征包含的物理因素也是特征工程的参考。) 同时这是一个1970的数据集,出现的一些数据会和现在有明显的差异。
Keras 数据集与 Sklearn 数据集有一定不同之处,Sklearn 数据集包括完整的说明,以及特征名,结构化非常完整,非常适合初学者,而Keras 数据集,相当于 Sklearn 数据集中的data部分,并且已经以0.2的方式分隔好了训练集和验证集,要想了解其具体结构,建议加载 Sklearn 数据集。
MLP 算法 原理
MLP算法 :Multilayer Perceptron (多层感知器算法),简称MLP。
在本章中,让我们编写一个简单的基于 MPL 的 ANN(Artificial Neural Network 人工智能网络) 来进行回归预测。到目前为止,我们只做了基于分类的预测。现在,我们将尝试通过分析先前(连续)值及其影响因素来预测下一个可能值。
回归 MPL 可以模型示如下:
该模型的核心特征如下:
- 输入层由 (13,) 个值组成。
- 第一层,Dense由 64 个单元和带有“普通”内核初始化程序的“relu”激活函数组成。
- 第二层,Dense由 64 个单元和“relu”激活函数组成。
- 输出层,Dense由 1 个单元组成。
- 使用 mse 作为损失函数。
- 使用 RMSprop 作为优化器。
- 使用 accracy 作为指标。
- 使用 128 作为批量大小。
- 使用 500 作为纪元。
第 1 步 - 导入模块
导入必要的模块。
import numpy as np
import pandas as pd
import tensorflow as tf
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import Dense
from tensorflow.keras.optimizers import RMSprop
from keras.callbacks import EarlyStopping
from sklearn import preprocessing
from sklearn.preprocessing import scale
from keras.datasets import boston_housing
%matplotlib inline
2 步 - 加载数据
导入波士顿住房数据集。
(x_train, y_train), (x_test, y_test) = boston_housing.load_data()
boston_housing是Keras提供的数据集。它代表波士顿地区住房信息的集合,每个信息有 13 个特征。
第 3 步 - 处理数据
根据我们的模型更改数据集,以便我们可以输入我们的模型。可以使用以下代码更改数据:
x_train_scaled = preprocessing.scale(x_train)
scaler = preprocessing.StandardScaler().fit(x_train)
x_test_scaled = scaler.transform(x_test)
这里,我们使用 sklearn.preprocessing.scale 函数对训练数据进行了标准化。preprocessing.StandardScaler().fit函数返回一个标量,其中包含训练数据的归一化均值和标准差,我们可以使用 scalar.transform 函数将其应用于测试数据。这将使用与训练数据相同的设置对测试数据进行标准化。
第 4 步 - 创建模型
创建实际模型。
model = Sequential()
model.add(Dense(64, kernel_initializer = 'normal', activation = 'relu',
input_shape = (13,)))
model.add(Dense(64, activation = 'relu'))
model.add(Dense(1))
第 5 步 - 查看模型
model.summary()
'''
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense (Dense) (None, 64) 896
dense_1 (Dense) (None, 64) 4160
dense_2 (Dense) (None, 1) 65
=================================================================
Total params: 5,121
Trainable params: 5,121
Non-trainable params: 0
_________________________________________________________________
'''
第 6 步 - 编译模型
使用选定的损失函数、优化器和指标来编译模型。
model.compile(
loss = 'mse',
optimizer = RMSprop(),
metrics = ['mean_absolute_error']
)
第 7 步 - 训练模型
使用fit()
方法训练模型。
history = model.fit(
x_train_scaled, y_train,
batch_size=128,
epochs = 500,
verbose = 1,
validation_split = 0.2,
callbacks = [EarlyStopping(monitor = 'val_loss', patience = 20)]
)
执行应用程序将提供以下信息作为输出:
Output exceeds the size limit. Open the full output data in a text editor
Epoch 1/500
3/3 [==============================] - 1s 85ms/step - loss: 567.0853 - mean_absolute_error: 21.9822 - val_loss: 627.7556 - val_mean_absolute_error: 23.3098
Epoch 2/500
3/3 [==============================] - 0s 12ms/step - loss: 552.8890 - mean_absolute_error: 21.6590 - val_loss: 615.2046 - val_mean_absolute_error: 23.0383
Epoch 3/500
3/3 [==============================] - 0s 29ms/step - loss: 540.0860 - mean_absolute_error: 21.3707 - val_loss: 600.7081 - val_mean_absolute_error: 22.7281
....
...
Epoch 117/500
3/3 [==============================] - 0s 12ms/step - loss: 8.7713 - mean_absolute_error: 2.0570 - val_loss: 15.0177 - val_mean_absolute_error: 2.6616
Epoch 118/500
3/3 [==============================] - 0s 12ms/step - loss: 8.9660 - mean_absolute_error: 2.0574 - val_loss: 15.4782 - val_mean_absolute_error: 2.6915
在这里,我们使用了回调函数 EarlyStopping。此回调的目的是监控每个 epoch 期间的损失值,并将其与之前的 epoch 损失值进行比较,以找到训练中的改进。如果耐心时间没有改善,那么整个过程将停止。
由于 EarlyStopping fit 在118 次时,就提前停止执行了。
执行 fit 的MAE情况
plt.plot(history.epoch,history.history.get('loss'),label="loss")
plt.xlabel("epoch")
plt.ylabel("MSE")
plt.legend()
第 8 步 - 评估模型
使用测试数据评估模型。
score = model.evaluate(x_test_scaled, y_test, verbose = 0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
执行上述代码将输出以下信息 :
Test loss: 25.384990692138672
Test accuracy: 3.079430341720581
第 9 步 - 预测
最后,使用测试数据预测如下 :
y_train_pred =model.predict(x_train_scaled)
y_test_pred = model.predict(x_test_scaled)
plt.scatter(y_train,y_train_pred,label="train")
plt.scatter(y_test,y_test_pred,label="test")
plt.legend()
上图是以真实值为横坐标,预测值为纵坐标做图。
结论
本文以 keras 波士顿房价回归数据集,只做了建模过程,并没有对数据过多的前处理,也没有讨论过拟合和欠拟合等问题。快速了解建模的整个过程。将在以后的文章专门讨论这些问题。