Keras 回归—King County House 数据集

Keras 回归—King County House 数据集 Mary 2023-08-30 10:30:16 613

易百纳社区

在本教程中,我将通过探索数字房屋数据集来构建回归模型,以预测金县地区的房屋价格。我使用 TensorFlow 和 Keras 来构建和评估模型。你可以看到一个简短的探索性数据分析 (EDA) 过程。

首先,我们将从导入必要的库开始

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

接下来,我们将在我们的 Python 环境中加载我们的数据集

df = pd.read_csv('kc_house_data.csv')

数据清洗

这是我们数据集的列;

df.columns
Index(['id', 'date', 'price', 'bedrooms', 'bathrooms', 'sqft_living',
       'sqft_lot', 'floors', 'waterfront', 'view', 'condition', 'grade',
       'sqft_above', 'sqft_basement', 'yr_built', 'yr_renovated', 'zipcode',
       'lat', 'long', 'sqft_living15', 'sqft_lot15'],
      dtype='object')

很明显,“id”和“date”列是不相关的,我们可以很容易地将它们从这个特定示例的数据集中删除。

你可能还会注意到,“zipcode”列是代表金县邮政编码的数值集合。由于“zipcode”是一个数值,如果我们在没有进行必要的特征工程的情况下对其进行训练,模型将假定它是连续变量。

因此,这种假设会降低标签预测的准确性(标签在本例中为“price”列)。让我们使用带有两个关键字参数的 .drop() 方法——要删除的列列表和轴。

df = df.drop(['id', 'date', 'zipcode'], axis=1) #axis=1 means column axis

我们还可以检查我们的数据集是否包含任何空值,因此我们可以考虑几种方法来用相关值替换它们。

df.isnull().sum() #Total number of null values

Output: 
price            0
bedrooms         0
bathrooms        0
sqft_living      0
sqft_lot         0
floors           0
waterfront       0
view             0
condition        0
grade            0
sqft_above       0
sqft_basement    0
yr_built         0
yr_renovated     0
zipcode          0
lat              0
long             0
sqft_living15    0
sqft_lot15       0
dtype: int64

简要探索性数据分析 (EDA)

有多种方法可以使用特定技术开始分析数据集。你可以从观察统计指标和绘制直方图、箱线图、计数图等开始。

df.describe() #Will give you mean, std, min and max values and etc.

可视化此数据集

让我们从数据集中挑选一些变量并绘制它们的直方图。我们可以单独绘制每个变量的直方图,也可以使用此方法来节省一些时间并编写更好的代码。在这个例子中,我将说明如何通过编写一个函数来可视化你的数据,来扩展你的工具箱。

例如,我可以从这个数据集‘bedrooms’, ’bathrooms’, ’sqft_living’, ’sqft_lot’,’floors’中选择数值,然后通过将它们放入列表中来简单地可视化所有这些值。

def plotHistogram(variable):
  """
    Input: Variable/Colum name
    Output: Histogram
  """
  plt.figure(figsize=(10,5))
  plt.hist(df[variable], bins=85, color="blue")
  plt.xlabel(variable)
  plt.ylabel("Frequency")
  plt.title(f"Data Frequency - {variable}")
  plt.show()

如你所见,函数 plotHistogram 接受一个名为 variable 的参数,创建一个图形并一一设置所有属性。我们可以很容易地调用这个函数,这样输出将是具有相应变量的不同直方图。

numerical_variables = ['bedrooms','bathrooms','sqft_living','sqft_lot','floors']
plot_ = [plotHistogram(i) for i in numerical_variables]

这是一个非常实用的示例,通过编写可重用函数来可视化多个直方图。

你可能已经猜到这段代码的输出是几个带有相应变量的直方图。我们可以继续进行进一步的探索性数据分析,但这只是一个回归教程。

拆分标签和特征

X = df.drop('price', axis=1) 
y = df['price'].values
"""
Since X represents features, dropping the label column
will provide remaining features.
Similarly, picking the price column will provide the label.
"""

进行训练测试拆分;

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, 
random_state=101)

我们将在训练测试拆分后立即执行特征缩放。这样我们将只拟合训练集,以防止数据从测试集中泄漏。

从技术上讲,我们可以使用我们希望的任何缩放器(例如 StandardScaler),但在这种情况下,我们可以使用简单的 MinMax 缩放器。

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
#Change the definition of the training set as a scaled version.
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

请注意,我们对测试集应用了相同的过程,但在缩放测试集时,我们使用的是单个 .transform() 方法而不是 fit_transform()。我们不拟合我们的测试集,因为我们不想假设有关测试集的先验信息。

现在我们已经应用了必要的拆分和预处理步骤,让我们构建模型。

构建模型

你需要在环境中同时安装 TensorFlow 和 Keras。在创建 Sequential 模型时,请记住,层中包含的神经元数量将基于实际的特征数量。

X_train.shape #Output: (15117, 19)

请注意,所有四层上的激活函数都是相同的(ReLU)。现在我们已经构建了一个深度神经网络,我们只需要添加只有一个神经元的最后一层——包含预测的输出层。

from tensorflow.keras import Sequential
from tensorflow.keras.layer import Dense

model = Sequential()

model.add(Dense(19, activation='relu'))
model.add(Dense(19, activation='relu'))
model.add(Dense(19, activation='relu'))
model.add(Dense(19, activation='relu'))

model.add(Dense(1))
model.compile(optimize='adam', loss='mse')

让我们看一下这段代码的模型编译部分。你可能会注意到我们使用 Adam 优化器和均方误差作为损失函数。

  • 很多模型使用 adam 作为默认优化器有几个原因。它通常优于任何其他优化算法,具有更快的计算时间并且需要更少的参数进行调整。
  • 均方误差是衡量统计模型误差量的最合适方法。它用作评估大多数回归算法性能的默认指标。

训练模型

model.fit(x=X_train, y=y_train, validation_data=(X_test, y_test),
          batch_size=128, epochs=400)

由于我们正在处理一个相对较大的数据集,因此我们需要分批训练模型。

批量大小通常设置为 2 的幂(例如 64、128、256),批量大小越小,训练时间越长。大多数时候,这种相关性具有防止过度拟合的优势,因为你不会一次训练整个训练集。

最后,我选择了一个任意数量的 epoch。稍后将详细介绍提前停止机制。

评估

为了查看我们是否对模型的训练数据过度拟合,我们必须找出损失,以便我们可以将它们与验证损失进行比较。

loss = pd.DataFrame(model.history.history)

我们可以通过比较训练损失和验证数据损失来确定我们是否过度拟合训练数据。让我们绘制损失和val_loss变量。

loss.plot()

这是绘制的图:

易百纳社区

损失与 val_loss

我们可以清楚地看到,在一定批次之后,这两种损失都出现了急剧下降,但保持稳定。这是一个强有力的指标,表明我们可以继续训练,而不会过度拟合我们的训练集。

如果我们看到 val_loss 在某个批次后出现某种增加的趋势,则意味着我们对训练数据过度拟合。

评估

我将使用一些评估指标来比较原始值和预测。

predictions = model.predict(X_test)
predictions #list of predictions
mean_squared_error(y_test, predictions) #using mse compare y_test and predictions
#Output: 27452360549.322517

由于很难理解输出,我们可以使用平均绝对误差来找出预测的平均绝对误差。

mean_absolute_error(y_test, predictions)
#Output: 102609.94870394483

文章转载自公众号:机器学习算法与知识图谱

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
Mary
红包 点赞 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
Mary
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区