• 机器学习之回归


    回归是机器学习中最常见的任务之一,回归(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)

    • 数据应该先进行预处理

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

  • 相关阅读:
    JAVA 时间戳
    华为云云耀云服务器L实例评测|centos系统搭建git私服
    javaScript 使用indexOf 撸一下模糊查询
    记录:R语言生成热图(非相关性)
    猿创征文|基于libevet的C++高并发、易扩展HTTP服务迭代之路
    队列【Java】
    VHDL硬件描述语言(二)VHDL程序的基本结构
    flutter_gen依赖
    Redis未授权访问漏洞实战
    【Android】 屏幕录制screenrecord为什么这么快?
  • 原文地址:https://www.cnblogs.com/edwardloveyou/p/17554658.html