目录
一、问题
问题1:数据输入
问题2:output和target维度不匹配
问题3:NLP中处理数据有哪些方法?
二、改进
改进1:改变归一化函数
改进1.1:用StandardScaler替换MinMaxScale
改进1.2:数据正态化
改进2:使用随机搜索的方法来找到最优参数
改进2.1:使用随机搜索的方法来寻找最优的参数
改进3:模型改进
改进3.1:将机器学习模型转换为Transformer模型
问题描述:
本项目旨在利用包含 79 个解释变量的数据集,预测爱荷华州埃姆斯市住宅的最终价格。数据集提供了房屋的详细信息,如地理位置、面积、房间数量、建筑材料等。我们将通过数据预处理、特征工程、模型选择和训练、模型评估等步骤,构建一个准确的房价预测模型。
一、问题
问题1:数据输入
提问:在用Transformer进行预测的时候,怎么处理输入数据呢?
思考:理想方式是处理成什么样的数据呢?(1468*79*64)
方法1:把1468 * 79转化成str list,然后放入Word2Vec中,就可以变成1468*79*64型数据
方法2:把1468 * 79转化成整数数值,然后放入nn.Embedding中,就可以变成1468*79*64型数据
提升都不大
问题2:output和target维度不匹配
提问:输入数据维度是(32,79,64),最后Encoder输出的维度是(32,79,1),这很正常,但是Target的维度是(32,1),这个时候又该怎么调整这个输出以达到维度合适呢?
方法1:x.mean(dim = 1) 在79的那个维度上取平均值,然后就变成了(32,1)
方法2:flatten + linear 没办法提升
问题3:NLP中处理数据有哪些方法?
这是问题1的引申问题,garbage in garbage out原则
二、改进
改进1:改变归一化函数
改进1.1:用StandardScaler替换MinMaxScale
改进效果:有效果,由0.21提升到0.178
原因:在进入Transformer结构之前,数据进行标准化,StandardScaler比MinMaxScaler好,在训练集和测试集上,MinMaxScaler效果很好,但是实际效果很差。在inverse_transform的时候MinMaxScaler有很大的误差!
在Transformer或者Stacking上都有提升
改进1.2:数据正态化
改进效果:有效果,由0.178提升到0.174
原因:既然改进1有效果,那就在这个方向上继续改进,加入了下面这段代码,将数据正态化,原因是StandardScaler在正态分布上的效果更好。
scaler_norm_saleprice = PowerTransformer(method='yeo-johnson')
改进2:使用随机搜索的方法来找到最优参数
改进2.1:使用随机搜索的方法来寻找机器学习最优的参数
改进效果:没有很大改变
改进2.2:减小模型的规模,减少每次训练的数据量
改进效果:没有很大改变
因为数据量不够多,减小模型的规模,减少训练的数据量,来帮助收敛
改进3:模型方面改进和优化
改进3.1:将机器学习模型转换为Transformer模型
改进效果:有效果,0.17到0.14
原因:建模用的Transformer模型甚至只用了6层Encoder,数据也没处理,模型架构也很粗糙,参数也没有调整,效果就有很大提升
Transformer方面:
优化1:在处理好了数据之后,用nn.Embedding和标准的Position Embedding;
优化2:调整超参数;