Press "Enter" to skip to content

通过时间序列分析提升回归模型的健壮性—第二部分

对新加坡HDB二手房屋转售价格的案例研究。在本文中,我们展示了如何将时间序列分析纳入线性回归模型,提高模型的预测能力。

Robbie Down在Unsplash上的照片

之前…

欢迎来到本文的第二部分!

在第一部分中,我们成功地建立了一个时间序列模型,具体是使用了SARIMA(季节性自回归移动平均)。此外,我们通过进行可视检查和评估其平均绝对误差(MAE),来评估我们建立的模型。

通过时间序列分析增强回归模型的稳健性 — 第1部分

在本文中,我们展示了如何将时间序列分析纳入线性回归模型中,提高模型的…

pub.towardsai.net

(要获取从数据提取到建立回归模型的完整代码,请随时查看我的GitHub代码库)

正如标题所示,本文不仅限于时间序列分析。在第二部分中,我们将转向如何预测新加坡HDB的价格,并利用我们的时间序列模型作为回归特征,以增强我们回归模型的预测能力。

说到这一点之前,让我们回到我们干净的数据集,并进行一些特征工程。

cleandata.head()
经作者清理过的数据集

特征工程

特征工程是构建预测模型的另一个关键阶段。这是一个我们修改现有特征或创建新特征的过程。特征工程的主要目标是将我们的数据转换为模型可以轻松消化的格式。从本质上讲,特征工程构成了我们预测模型的基本构建模块。

我们进行特征工程的方式取决于数据类型。因此,在我们的案例中,执行特征工程的初始步骤是将特征分为三组:分类特征、时间特征和数值特征。

分类特征

根据我们对分类特征的分析,可以明显看出“flat_type”和“storey_range”具有序数特征。尽管有序特征具有自然顺序,但需要注意的是,不同类别之间的数字差异并不一定携带特定信息。有趣的是,当我们将“flat_type”和“storey_range”与“resale_price”一起考虑时,我们观察到几乎线性关系。

按平面类型平均价格 — 作者提供的图片
按楼层范围平均价格 — 作者提供的图片

因此,我们可以通过使用有序编码器将这些序数特征转换为数值特征来简化我们的预测模型。这种转换有助于消除模型中的不必要的复杂性,同时保留重要信息。

np.sort(cleandata['flat_type'].unique())
‘flat_type’经过序数编码后的图像-作者提供
np.sort(cleandata['storey_range'].unique())
‘storey_range’经过序数编码后的图像-作者提供

时间特征

时间特征是与时间序列数据相关的一组特征。这些特征可以是日期时间、数值或分类数据的形式。在之前的节中,特别是在预处理阶段,我们从‘resale_date’中创建了新的特征‘resale_year’和‘resale_month’。与‘flat_type’和‘storey_range’不同,我们发现‘resale_month’并没有与‘resale_price’线性相关。相反,‘resale_month’代表了数据集的季节性特征。因此,我们需要将‘resale_month’从数值转换为分类。从‘resale_month’,我们还创建了新特征‘resale_quarter’。

其他时间特征是我们从时间序列分析中获得的新特征。这些特征包括预测、趋势和滞后变量。对于预测和趋势特征,我们可以直接从我们的SARIMA模型中获取它们。对于滞后变量,我们从预测中创建了它们。虽然滞后变量的最佳数量是三个(基于ARIMA参数p = 3),但我们选择创建了四个滞后变量。通过增加一个额外的变量,我们旨在检查这种调整对回归模型行为的影响。

有了新的时间特征后,我们可以将这些特征无缝地集成到清理后的数据集中。

数值特征

数值特征的形式良好,因此不需要进行任何修改。

特征选择

照片作者:Edu Grande,摄影:Unsplash

在成功进行特征工程后,我们将数据集重命名为newdata。获得newdata后,下一步是选择将输入模型的最相关特征。

首先,我们将数据集中的数值列分组并运行相关性测试。通过这个测试,我们可以进行两个步骤的选择。第一个步骤是将特征与目标进行比较,即‘resale_price’。

从下面的热力图中,我们可以观察到‘resale_price’与这些数值特征有一定程度的关系,从中度关系到强关系。但我们也观察到一些特征之间存在强关联,说明存在多重共线性。

我们知道‘remaining_lease’是‘lease_commence_year’的一个函数。因此,我们可以只删除其中一个特征。因此我们删除了‘remaining_lease’。此外,我们还观察到‘floor_area_sqm’和‘flat_type’之间有非常强的相关性,因此我们可以从数据集中删除‘flat_type’。

相关性表1— 图片由作者提供

与此同时,对于我们从SARIMA中获得的时间特征,所有特征都与目标变量有适度相关性。此外,它们之间也存在多重共线性。鉴于此,我们目前不会删除任何特征,因为我们想知道这些特征的哪种组合在回归模型中效果最好。

相关性表2 — 作者的图片

对于分类特征,我们采取了一种更直接的方法。从下面的图片可以看出,’block’和’street_name’的唯一类别数非常大,分别为2671和565。值得注意的是,包含非常多类别的分类特征往往会增加模型的复杂性,并且很容易导致过拟合。因此,我们决定删除这些特征。

cat = newdata.select_dtypes(exclude = 'number') #categorical/qualitativefor i, column in enumerate(cat.columns):    print(f'{column}'.title(), ': 包含', cat[column].nunique(), '个值')
分类特征的类别大小 — 作者的图片

确定了哪些特征进入回归模型之后,我们可以进入下一个阶段,构建回归模型。

线性回归

Clément Hélardot的照片,来自Unsplash

在线性回归中,它是一种监督学习技术,其目标是基于与一个或多个自变量的关系来预测因变量的值。线性回归的一个关键特征是,因变量(也称为目标)由连续的数值组成,而自变量(也称为特征)可以由数值或分类值组成。

在我们的HDB案例中,我们构建线性回归模型,以预测’resale_price’的值,该值基于其与特征(’floor_area_sqm’,’storey_range’等)的关系。为了构建一个稳健的预测模型,首先我们需要建立一个基准模型。基准模型是一个必要的起点,它展示了模型应该表现如何以及如何改进。

基准模型

众所周知,我们的目标是看看如何组合时间序列分析有助于改善回归预测。因此,我们创建一个不包含时间组成部分的基准模型,除了原始数据集中固有的那些组件,即’resale_date’及其直接导出的派生变量,即’resale_year’,’resale_month’和’resale_quarter’。因此,对于基准模型,我们实际上创建了一种仅依赖于传统线性回归的情景。

下面是我们基准模型中使用的特征和目标的组合:

feat.head()
基准模型的特征 — 作者的图片

模型构建

值得注意的是,因为我们的数据集包含分类特征,我们需要创建虚拟变量。在我们的情况下,我们使用Pandas进行一位有效编码创建虚拟变量。

从下面的截图中可以看出,由于创建了虚拟变量,特征数量从9个增加到了62个。

dummies = pd.get_dummies(feat, drop_first= True, prefix_sep= '--')dummies.head()
包含虚拟变量的特征 — 作者提供的图像

在创建虚拟变量之后,我们的下一步是将数据分割成训练集和测试集。我们使用的分割标准与时间序列分析中使用的标准相同,即最后12个月形成测试集,而之前的月份成为训练集。在我们的特定情况下,这种分割结果在测试集和训练集之间大致呈20:80的比例。在分割数据后,我们可以开始构建模型。

(在此分析中,我们不会涉及回归系数或每个特征的统计显著性等细节。但是,完整的回归模型摘要,您可以在我的GitHub存储库中查看。)

import statsmodels.api as smLinearRegression = sm.OLS(y_train, sm.add_constant(X_train)).fit()

模型评估

与我们在时间序列分析部分所做的类似,为了评估回归模型的性能,我们将采用两种方法——指标评估和可视化评估。这两种方法相互配合,为我们提供了对模型有效性的全面理解。

评估的起点是评估回归模型的残差图,以检查模型的同方差性。首先,我们评估训练集的残差。从下面的图片中可以观察到,我们可以看到在较低的价格范围内,实际数据在回归线周围分散得相当均匀。然而,随着价格的增加,实际数据与回归线的离散程度变得更大。另外,残差的直方图紧随标准化后接近零的正态分布钟形曲线,均值为-1.13e-11。

基准模型训练集残差分析 — 作者提供的图像

另外,从测试集得到的结果更加不令人满意。从下面的图像中可以观察到,随着价格的增加,实际数据与回归线的分散程度更大。此外,直方图虽然遵循正态分布的钟形曲线,但并未接近零,均值为-0.73。

基准模型测试集残差分析 — 作者提供的图像

同时,我们用来评估回归模型有效性的关键指标是调整R平方、训练集平均绝对误差(MAE)和测试集MAE。这些指标在衡量模型的准确性和其泛化能力方面非常重要。

这些指标的数值如下:

  • 调整R平方:86.19%

调整R平方的值衡量了我们预测模型能够解释数据方差的能力,同时还对模型的复杂性进行了惩罚。在实际应用中,它表示模型中的自变量(特征)能够解释因变量(目标)的值的程度。调整R平方值为86.19%,考虑到我们正在尝试建模的是房屋价格,而房屋价格的预测涉及到人类行为,可以认为这是一个相当高的值。在回归模型中,调整R平方值越高(离100%越近),通常是一个理想的特征。

  • 训练集MAE:S$47,453
  • 测试集MAE:S$59,158

与时间序列分析中一样,对于MAE的值,我们需要将其与月均价格的均值(S$483,783)进行比较。这意味着MAE值范围为月均价格均值的9.8%至12.2%。尽管这些值相对于月均价格均值而言相对较小,但如果能进一步减少这些误差值,效果会更好。

另一个评估模型的角度是检查我们的回归模型能否很好地进行时间序列预测。因此,我们生成了图表来可视化实际数据集的月均价格、训练预测和测试预测。

预测与实际,基准模型-作者图片

通过对上面的图表进行检查,我们可以发现一些重要的见解。显然,我们的基准模型能够相当好地捕捉季节性。然而,该模型显然面临捕捉趋势的挑战。从绿色阴影区域可以看出,训练预测(绿色线)经常偏离实际值相当远。测试预测(紫色线)也存在更大的误差,如紫色阴影区域所示,进一步表明该模型难以捕捉趋势。

总体而言,我们综合评估的结果,包括视觉和度量评估,表明需要对当前模型进行改进。

改进模型

通过使用不同特征和数据转换的各种组合进行了大量实验后,我们最终得到了一个增强的模型。新模型应提高鲁棒性,同时又避免不必要的复杂性,以保持可解释性。

更好的模型包括了使用SARIMA进行时间序列分析得到的特定特征的融合,这些特征是趋势和第三滞后。此外,通过使用Box-Cox转换对目标(’resale_price’)进行数据转换,模型的性能可能更加稳健。

feat.head()
改进模型的特征-作者图片

模型构建

在建立改进模型的过程中,我们采用了与基准模型相同的处理方法。通过执行相同的步骤,我们可以有效地将改进模型的性能与基准模型进行比较。唯一值得注意的区别是改进模型的目标需要进行逆转换,以将其恢复到原始单位。

模型评估

与基准模型一样,我们首先评估改进模型的残差。需要注意的是,除非对残差进行标准化,否则无法将改进模型的残差分析结果与基准模型的残差分析结果进行比较,因为每个模型的目标单位不同。

改进模型的训练残差分析-作者图片

通过观察上述回归图,我们可以发现改进模型产生了更均匀分布的残差,而不是基准模型的残差。这一发现表明模型的鲁棒性得到了改善。此外,如果我们参考测试数据集,下面显示的回归图也呈现出均匀分布的数据,暗示我们正在正确的轨道上!

改进模型的测试残差分析-作者图片

同时,改进模型的评估指标值如下:

  • 调整后的 R 平方:89.61%
  • 训练数据集的 MAE:S$40,114
  • 测试数据集的 MAE:S$42,432

改进模型的调整后 R 平方值高于基准模型。同时,改进模型的训练数据集和测试数据集的 MAE 值较基准模型更小。这些变化进一步表明了模型的改善。

最后,我们想检查改进模型的时间序列方面。从下面的图表可以看出,我们的改进模型在实际值和预测值之间的差距明显小于基准模型,如绿色和紫色阴影区所示。

实际与预测对比,改进模型 — 作者提供的图像

指标比较

为了更容易进行比较,我将指标总结在以下表格中:

回归指标比较 — 作者提供的图像
时间序列指标比较 — 作者提供的图像

通过在表格中比较基准模型和改进模型的MAE值,我们可以看出,第二个模型的评估指标,特别是平均绝对误差,通过将时间序列纳入回归模型而得到了很大的改进。

这很酷。那又怎样?

我们终于成功构建了一个线性回归模型,通过结合SARIMA技术来捕捉数据的时间序列特性。话虽如此,可能有人开始问一个关键的问题 — 为什么这很重要?我们如何在实际情况中利用预测模型?

嗯,预测模型的主要用途之一是为数据驱动的决策提供支持。在充满信息的世界中,预测建模帮助我们将来自历史数据的信息转化为未来的预测,这些预测可以作为可行的洞察。

在我们的具体情况下,预测建模的一个直接应用是帮助组屋业主在确定其单位的最佳定价时做出明智决策,如果他们希望出售自己的房产。设置正确的价格非常重要,因为定价过低会导致收益损失,而定价过高则可能阻碍潜在买家。

话虽如此,该模型也有其局限性。在实际情况下,时间序列预测面临的主要问题之一是模型随时间推移可靠性的减弱。通常情况下,当我们预测更远的未来时,产生的误差会变大,使我们的预测不太准确。这在涉及人类行为的情况下尤为明显,例如预测房屋未来的价格。

因此,该模型最适合在短期内使用,例如未来的6至12个月。在此期限后,最好通过更新训练数据来修订模型。

关键要点

  1. 线性回归作为最基本的机器学习技术之一,结合经典的时间序列分析技术如SARIMA,可以使其更加健壮。
  2. 组屋业主可以利用该模型来帮助他们确定合适的价格,如果他们希望出售自己的房产。
  3. 由于其限制,该模型应在较短的时间范围内使用,例如6个月或12个月。
  4. 如果打算将该模型用于较长时间,重要的是定期更新训练数据。

最后,非常感谢您读到最后!我希望您发现我的文章有用和启发性。

进一步阅读:

[1] M. Badole, 多重线性回归:一份全面指南, 2021. [在线]. 可用:https://www.analyticsvidhya.com/blog/2021/05/multiple-linear-regression-using-python-and-scikit-learn/ [访问日期:2023年10月30日]

[2] 《Geeks for Geeks》,“使用Statsmodels在Python中进行线性回归”,2022。[在线]. 可获取:https://www.geeksforgeeks.org/linear-regression-in-python-using-statsmodels/ [访问日期:2023年10月30日]

Leave a Reply

Your email address will not be published. Required fields are marked *