Kaggle 房价预测竞赛是典型的机器学习中的回归问题,需要在训练集上对于房间的 N 个特征和房价之间的关系进行拟合,在测试集上,模型即可根据房间特征对房价作出预测。考虑到需要拟合多种特征之间的关系,我尝试设计了一个轻量化的Transformer模型来处理房间特征的自相关性,并对这种关系进行建模,产生预测结果。
- 初步分析:
默认的训练与测试数据提供了 79 栏信息,我们对其中 36 栏进行标准化,并对非数值 ’NA’ 进行数值填充,然后将处理好的信息转化为 one-hot 编码特征,总共 331 个维度。
对于训练集上的特征,我们可视化了不同栏目之间的自相关性,heat map如下:
其中颜色越深代表属性间的相关性越强,可以看到有些栏目间存在很强的相关性(例如GarageCars 和 GarageArea),而有些类之间几乎没有相关性(例如 MSSubClass 和 LogFrontage),这种自相关性对于模型拟合而言是有帮助的,可以避免无关信息的干扰,对相关性强的信息的进行更充分的利用。自然的,采用 Transformer 对这种关系进行建模无疑是合适的。Transformer 可以通过 Self-Attention 获取全局的自相关性,并通过 MLP 对这一关系进行建模,因此从这一出发点,我尝试了 Transformer 架构进行测试。
- 网络结构:
设计的 Transformer 采用经典 Encoder-Decoder 的结构。由于我们处理的不是序列问题,而且输入输出向量长度是给定的,所以不需要 position embedding 和 output embedding,Encoder和 Decoder 采用相同的基本结构,不同之处在于 Decoder 最后一层直接产生预测结果。对于每一个输入向量,线性映射为 q, k, v 三个向量,q 和 k 用于计算其331个维度的Self-Attention map,经过 Softmax 后对 k 进行加权,然后输入三层感知机中进行拟合。
由于 Kaggle 训练数据集很小,因此参数量大的网络很容易过拟合。因此我这里使用的 Transformer 在 Encoder 和 Decoder 部分分别只有一层,降低过拟合风险;同时由于 Self-Attention 的计算加权,Transformer 相比起同等参数量的 MLP 泛化能力更强。
- 实验效果:
我们的模型在Kaggle 房价预测测试集取得了 rmse = 0.12760 的准确率,截至 2021.11.30 21:00 排名 1128。(这个实验结果并没有采用数据预处理和相关的分析,如降维等;可以尝试添加相关的数据预处理操作以取得更好的实验效果)
训练的超参数为:lr = 0.002,weight decay = 2,total epoch = 100,batch size = 64.
我们也尝试了K折交叉验证,但由于测试集标注不公开,所以只能在训练集上进行划分。在训练集上K折交叉验证可以一定程度上反映模型的效果和泛化能力,但是仅供参考。实际的泛化性能还需要测试集的效果来证明。
- 消融实验:
为了证明模型的有效性,我对模型中结构进行了消融实验。
Model | 5-Fold Cross Validation | Test loss (rmse) (on official test dataset) | |
Train loss (rmse) | Test loss (rmse) | ||
MLP (1 Block) | 0.127530 | 0.140763 | 0.15460 |
MLP (2 Blocks) | 0.108675 | 0.163794 | 0.15125 |
Transformer (2 Blocks) | 0.017307 | 0.129986 | 0.12760 |
我们分别尝试了去掉 Self-Attention 的计算(也就是 2 个基本的 3-layer MLP Block),和 1 个最基本的 3-layer MLP Block 在5 折交叉验证下和官方测试集的效果。
结果表明,我们的模型有更好的测试效果。仅仅通过简单叠加 MLP 并不能提升模型的预测效果,通过 Block 之间 Self-Attention 的计算可以提升 MLP 的建模表达能力,也验证了我设计 Transformer 结构的初衷是正确的。
最后,如果觉得这篇文章对你有帮助的话,可不可以麻烦在 Github 上这篇 repo 下点一颗小星星呢?谢谢~~