使用 Keras 进行回归
介绍
深度学习是当今数据科学领域最热门的话题之一。这并不奇怪,因为大量令人着迷的应用程序正在使用深度学习进行开发,例如自动驾驶汽车、色彩恢复、自然语言处理、自动机器翻译、图像分类等等。
目前有很多深度学习库,但最受欢迎的是 TensorFlow、Keras 和 PyTorch。尽管 TensorFlow 和 Pytorch 非常受欢迎,但它们并不容易使用,而且学习曲线陡峭。因此,对于许多从业者来说,Keras 是首选。
Keras 库是用于构建深度学习模型的高级 API,因其易用性和简单性而受到青睐,有助于快速开发。通常,使用 Keras 构建非常复杂的深度学习网络只需几行代码即可实现。
在本指南中,我们将重点介绍如何使用 Keras 库构建回归模型。
使用 Keras 进行回归
回归是一种用于预测连续标签的监督式机器学习算法。其目标是根据评估标准生成一个代表某些观察数据的“最佳拟合”的模型。
我们将要介绍的深度学习神经网络的基本架构由三个主要部分组成。
输入层:这是输入训练观测值的地方。预测变量的数量也通过神经元在这里指定。
隐藏层:这些是输入层和输出层之间的中间层。深度神经网络在此组件中学习数据中涉及的关系。
输出层:这是从前两层发生的事情中提取最终输出的层。在回归问题的情况下,稍后的输出将有一个神经元。
问题陈述
失业是任何国家面临的主要社会经济和政治问题,因此,管理失业是任何政府的主要任务。但要管理经济中的失业,预测失业也是必不可少的。这就是本指南的目标。本指南将使用 Keras 构建深度学习回归模型来预测失业率。
本项目使用的数据来自 https://research.stlouisfed.org/fred2 提供的美国经济时间序列数据。数据包含 574 行和 5 个变量,如下所述:
- psavert - personal savings rate.
- pce - personal consumption expenditures, in billions of dollars.
- uempmed - median duration of unemployment, in weeks.
- pop - total population, in thousands.
- unemploy- number of unemployed in thousands (dependent variable).
评估指标
我们将使用均方根误差 (RMSE) 来评估模型的性能,这是回归问题常用的指标。简单来说,RMSE 测量残差或误差的平均幅度。从数学上讲,它计算为预测值和实际值之间平方差的平均值的平方根。
步骤
以下是使用 Keras 实现回归模型时通常遵循的步骤。
步骤 1——加载所需的库和模块。
第 2 步——加载数据并执行基本数据检查。
步骤 3-为特征和响应变量创建数组。
步骤4-创建训练和测试数据集。
步骤5-定义、编译和拟合Keras回归模型。
第 6 步-根据测试数据进行预测并计算评估指标。
以下部分将介绍这些步骤。
步骤 1 - 加载所需的库和模块
# Import required libraries
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import sklearn
# Import necessary modules
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from math import sqrt
# Keras specific
import keras
from keras.models import Sequential
from keras.layers import Dense
第 2 步 - 读取数据并执行基本数据检查
第一行代码将数据读入为 pandas 数据框,而第二行代码打印形状 - 5 个变量的 574 个观测值。第三行给出数值变量的汇总统计信息。我们可以看到所有变量的“计数”均为 574,这等于数据集中的记录数。这意味着我们没有缺失值。
df = pd.read_csv('regressionexample.csv')
print(df.shape)
df.describe()
(574, 5)
个人消费支出 | 流行音乐 | 普萨韦尔 | 医学 | 失业 | |
---|---|---|---|---|---|
数数 | 574 | 574 | 574 | 574 | 574 |
意思是 | 4,844 | 2,57,189 | 8 | 9 | 7,772 |
标准 | 3,579 | 36,731 | 3 | 4 | 2,642 |
分钟 | 507 | 1,98,712 | 2 | 4 | 2,685 |
25% | 1,582 | 2,24,896 | 6 | 6 | 6,284 |
50% | 3,954 | 2,53,060 | 8 | 8 | 7,494 |
75% | 7,667 | 2,90,291 | 11 | 9 | 8,691 |
最大限度 | 12,162 | 3,20,887 | 17 | 二十五 | 15,352 |
步骤 3 - 为特征和响应变量创建数组
第一行代码创建了目标变量的对象,而第二行代码为我们提供了所有特征的列表,不包括目标变量“unemploy”。
第三行对预测变量进行归一化。这很重要,因为变量的单位差异很大,可能会影响建模过程。为了防止这种情况,我们将通过将预测变量缩放到 0 到 1 之间来进行归一化。
第四行显示标准化数据的摘要。我们可以看到,所有独立变量现在都已在 0 到 1 之间缩放。目标变量保持不变。
target_column = ['unemploy']
predictors = list(set(list(df.columns))-set(target_column))
df[predictors] = df[predictors]/df[predictors].max()
df.describe()
个人消费支出 | 流行音乐 | 普萨韦尔 | 医学 | 失业 | |
---|---|---|---|---|---|
数数 | 574 | 574 | 574 | 574 | 574 |
意思是 | 0.40 | 0.80 | 0.47 | 0.34 | 7,772 |
标准 | 0.29 | 0.11 | 0.18 | 0.16 | 2,642 |
分钟 | 0.04 | 0.62 | 0.11 | 0.16 | 2,685 |
25% | 0.13 | 0.70 | 0.32 | 0.24 | 6,284 |
50% | 0.33 | 0.79 | 0.45 | 0.30 | 7,494 |
75% | 0.63 | 0.90 | 0.62 | 0.36 | 8,691 |
最大限度 | 1 | 1 | 1 | 1 | 15,352 |
步骤 4 - 创建训练和测试数据集
前几行分别创建独立变量 (X) 和因变量 (y) 的数组。第三行将数据分为训练数据集和测试数据集,而第四行打印训练集 (4 个变量的 401 个观测值) 和测试集 (4 个变量的 173 个观测值) 的形状。
X = df[predictors].values
y = df[target_column].values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30, random_state=40)
print(X_train.shape); print(X_test.shape)
(401, 4)
(173, 4)
第 5 步 - 构建深度学习回归模型
我们将使用 Keras 中的深度学习构建回归模型。首先,我们将定义模型。下面的第一行代码调用 Sequential 构造函数。请注意,我们将使用 Sequential 模型,因为我们的网络由线性堆叠的层组成。第二行代码代表第一层,它指定激活函数和输入维度的数量,在我们的例子中是 4 个预测变量。然后,我们在隐藏层的第三行和第四行代码中重复相同的过程,这次没有 input_dim 参数。最后一行代码创建了一个带有一个节点的输出层,该节点应该输出以千为单位的失业人数。
隐藏层中使用的激活函数是修正线性单元(ReLU)。它是使用最广泛的激活函数,因为它具有非线性的优点,并且能够不同时激活所有神经元。简而言之,这意味着一次只激活少数神经元,从而使网络稀疏且非常高效。
# Define model
model = Sequential()
model.add(Dense(500, input_dim=4, activation= "relu"))
model.add(Dense(100, activation= "relu"))
model.add(Dense(50, activation= "relu"))
model.add(Dense(1))
#model.summary() #Print model Summary
下一步是定义一个优化器和训练的损失度量。均方误差是我们的损失度量,“adam”优化器是我们的最小化算法。“adam”优化器的主要优点是我们不需要像梯度下降那样指定学习率;从而为我们节省了优化模型学习率的任务。我们使用下面代码的第一行完成了这个任务。
第二行代码在训练数据集上拟合模型。我们还提供了参数 epochs,它表示训练迭代次数。我们已经进行了 20 次 epoch。
model.compile(loss= "mean_squared_error" , optimizer="adam", metrics=["mean_squared_error"])
model.fit(X_train, y_train, epochs=20)
Epoch 1/20
401/401 [==============================] - 0s 1ms/step - loss: 68136318.3441 - mean_squared_error: 68136318.3441
Epoch 2/20
401/401 [==============================] - 0s 133us/step - loss: 68101432.0698 - mean_squared_error: 68101432.0698
Epoch 3/20
401/401 [==============================] - 0s 125us/step - loss: 67985495.1022 - mean_squared_error: 67985495.1022
Epoch 4/20
401/401 [==============================] - 0s 134us/step - loss: 67665023.0524 - mean_squared_error: 67665023.0524
Epoch 5/20
401/401 [==============================] - 0s 127us/step - loss: 66899397.2868 - mean_squared_error: 66899397.2868
Epoch 6/20
401/401 [====================
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~