机器学习之回归
回归是机器学习中最常见的任务之一,回归(regression)问题预测的是一个连续值,而不是离散标签,比如根据气象数据预测明日气温,或者根据房地产数据估算房价(标量回归问题)。
接下来就以回归问题最经典的波士顿房价为例,了解标量回归问题的基本配置。当然主要是对深度学习的训练与推理建立一个基本的认知,训练结果好坏反而不太重要。
既然是机器学习,了解python是必备的(上手也很容易),使用的也是易上手的keras框架,接着再了解一下numpy,可以上路了。
基于tensorflow.js实现的纯前端小样例请看:线性回归
大纲
-
准备数据
-
构建模型
-
训练模型
-
预测结果
波士顿房价数据集介绍
-
data:样本都有13个数值特征,比如人均犯罪率、住宅的平均房间数、高速公路可达性等
-
target:目标是房价中位数,单位是千美元
由数据集训练出的模型要达到的效果:用户输入13个数值特征数据,预测出一个房价中位数(输入data,输出target)。
准备数据
取值范围差异很大的数据输入到神经网络中是有问题的,这会让模型学习变得困难。对于这类数据,普遍采用的最佳处理方法是对每个特征进行标准化,即对于输入数据的每个特征(输入数据矩阵的每一列),减去特征平均值,再除以标准差,这样得到的特征平均值为0,标准差为1。
这个步骤一般叫做数据的标准化(normalization),目的就是把所有数据都映射到同一个数据空间,一般是[0,1]或[-1,1]范围内,以方便后续模型的学习。
from tensorflow.keras.datasets import boston_housing
(train_data, train_targets), (test_data, test_targets) = boston_housing.load_data()#加载波士顿房价数据集
mean = train_data.mean(axis=0)#平均值
train_data -= mean
std = train_data.std(axis=0)#标准差
train_data /= std
test_data -= mean
test_data /= std
mean方法用于得出数据集的平均值,这是numpy的ndarrays对象自带的方法,同理std是封装好的标准差方法,标准差原理比较繁琐,想了解具体细节可自己去了解。
构建模型
由于样本数量比较小,因此合适的选择是使用一个小的模型。它包含两个中间层,每层有64个单元,一般来说,训练数据越少,过拟合就会越严重,而较小的模型可以降低过拟合。
from tensorflow import keras
from tensorflow.keras import layers
def build_model():
model = keras.Sequential([
layers.Dense(64, activation="relu"),#64个单元,激活函数为relu
layers.Dense(64, activation="relu"),
layers.Dense(1)#最后一层(输出层)
])
model.compile(optimizer="rmsprop", loss="mse", metrics=["mae"])
return model
因为是标量回归(标量回归是预测单一连续值的回归),模型的最后一层只有一个单元,并不需要激活函数。损失函数为均方误差(mean squared error,MSE),预测值与目标值之差的平方,这是回归问题常用的损失函数。
在训练过程中要监控的指标:平均绝对误差(mean absolute error,MAE),它是预测值与目标值之差的绝对值。
训练模型
中间省了评估训练结果,调节超参数的过程,这里直接用所有的数据进行训练,这里数据量比较少,没有再区分出验证集(validation data)。如果想看直观的查看训练效果,可以使用 matplotlib 库绘制验证MAE曲线。
-
epochs 顾名思义就是训练的轮次;
-
batch_size 批次尺寸,即每次完整的正向和反向传播使用的数据量,必须为2的n次幂;这个参数会影响训练的效果,和显存的大小息息相关,以后要注意;
model = build_model() #获取已编译模型
history = model.fit(train_data, train_targets, epochs=150, batch_size=16) #训练模型
test_mse_score, test_mae_score = model.evaluate(test_data, test_targets) #评估训练效果
预测结果
训练好模型后,接着直接用测试集进行预测一下结果,查看预测结果的第一条为 9.514468 (单位:千美元)
>>> predictions = model.predict(test_data)
>>> predictions[0]
array([9.514468], dtype=float32)
总结
-
回归常用的损失函数是均方误差(MSE)
-
常用的回归指标是平均绝对误差(MAE)
-
数据应该先进行预处理
-
如果可用的训练数据少,那么最好使用中间层较少(通常只有一两个)的小模型,以避免严重的过拟合