机器学习之回归

回归是机器学习中最常见的任务之一,回归(regression)问题预测的是一个连续值,而不是离散标签,比如根据气象数据预测明日气温,或者根据房地产数据估算房价(标量回归问题)。

接下来就以回归问题最经典的波士顿房价为例,了解标量回归问题的基本配置。当然主要是对深度学习的训练与推理建立一个基本的认知,训练结果好坏反而不太重要。

既然是机器学习,了解python是必备的(上手也很容易),使用的也是易上手的keras框架,接着再了解一下numpy,可以上路了。

基于tensorflow.js实现的纯前端小样例请看:线性回归

大纲

  1. 准备数据

  2. 构建模型

  3. 训练模型

  4. 预测结果

波士顿房价数据集介绍

  • 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)

  • 数据应该先进行预处理

  • 如果可用的训练数据少,那么最好使用中间层较少(通常只有一两个)的小模型,以避免严重的过拟合

posted @ 2023-07-14 17:55  Jeff.Zhong  阅读(209)  评论(0编辑  收藏  举报