深度学习回归案例:房价预测
机器学习的另一个重要问题:回归。它预测的是一个连续值而不是离散的标签
逻辑回归不是回归算法,而是分类算法
波士顿房价数据集
506个样本,其中404个训练样本,102个测试样本
In [1]:
1 | import numpy as np |
划分数据集
In [2]:
1 |
|
In [3]:
1 | train_data.shape # 每个样本都是13个特征 |
Out[3]:
1 | (404, 13) |
In [4]:
1 | test_data.shape |
Out[4]:
1 | (102, 13) |
In [5]:
1 | train_targets[:10] |
Out[5]:
1 | array([15.2, 42.3, 50. , 21.1, 17.7, 18.5, 11.3, 15.6, 15.6, 14.4]) |
数据标准化
神经网络中不能输入取值范围差异很大的数据集,需要进行标准化处理。
每个特征的标准化:(原数据 - 特征平均值) / 标准差。 得到的就是特征平均值为0,标准差为1
In [6]:
1 | # numpy实现 |
注意的点:
- 测试集的标准化使用的是训练集的均值和方差
- 我们不能使用在测试上计算得到的任何结果
构建网络
样本量少,可构建2个隐藏层,每层64个单元。较小的网络能够降低过拟合
建模
In [7]:
1 | import tensorflow as tf # add |
网络的特点:
- 最后一层:一个单元,没有激活,是一个线性层(标量回归的典型设置)
- 损失函数mse-均方误差,(y_predict- y_true)^2;回归问题的常用损失函数
- 监控指标mae-平均绝对误差,|y_predict- y_true|;预测值和目标值之差的绝对值
K折交叉验证
原理
当样本数量很少的时候,验证集的划分方式可能会造成验证分数上有很大的方差,无法对模型进行可靠的评估。
最佳方法:使用K折交叉验证
- 将数据划分为K个分区,通常是4或者5
- 实例化K个模型,将模型在K-1个分区上训练,剩下的一个区上进行评估
- 模型的验证分数等于K个验证分数的均值。
如何K折交叉验证:以3折交叉验证为例
代码实现
In [8]:
1 | import numpy as np |
训练模型 + 验证集评估模型
In [9]:
1 | import numpy as np |
In [10]:
1 | all_scores |
Out[10]:
1 | [2.6683619022369385, |
In [11]:
1 | np.mean(all_scores) |
Out[11]:
1 | 2.827095866203308 |
每次运行模型得到的数值还是有很大的差异,但是均值最终还是在2.94接近3,是一个比较可靠的结果。
增加模型训练轮次(修改)
- 将模型训练500次
- 保存每轮的验证分数记录
代码实现
In [14]:
1 | import numpy as np |
计算每个轮次中所有折的MAE的平均值:
In [24]:
1 | len(all_mae_histories) |
Out[24]:
1 | 4 |
In [25]:
1 | len(all_mae_histories[0]) |
Out[25]:
1 | 500 |
In [26]:
1 | average_mae_history = [np.mean([x[i] for x in all_mae_histories]) for i in range(number_epochs)] |
Out[26]:
1 | [6.998382568359375, |
In [27]:
1 | len(average_mae_history) |
Out[27]:
1 | 500 |
可视化:绘制验证分数
In [31]:
1 | import matplotlib.pyplot as plt |
可视化改进版
上面的图形纵轴范围大,且数据的方差大,很难看清图形,重新绘制:
- 删除前面10个点,它们的取值和其他点的取值差异大
- 将每个数据点替换为前面数据点的指数移动平均值,得到光滑的曲线
In [38]:
1 | def smooth_curve(points, factor=0.9): |
训练最终模型
使用最佳参数在整个训练集上进行训练,然后在测试集上进行测试:
In [40]:
1 | model = build_model() |
In [41]:
1 | test_mae_score |
Out[41]:
1 | 18.324810028076172 |
可以看到预测的房价和真实的房价的相差约为1.8万美元
总结
- 回归问题中,损失函数使用的是均方误差MSE
- 回归问题中,评价指标使用的是平均绝对误差MAE
- 如果数据的特征具有不同的取值范围,需要进行数据的归一化,进行数据缩放
- 当数据少的时候,使用K折交叉验证来可靠的评估模型
- 如果训练的数据少,最好使用隐藏层较少的小型网络,以避免严重的过拟合