1项目介绍
基于kaggle网站所提供的爱荷华州埃姆斯的住宅数据信息,预测每间房屋的销售价格,数据的标签SalePrice是连续性数据,因此可以判定这是一个回归问题。
最终目标:预测每一个房屋的销售价格。对于测试集中的每个ID,预测SalePrice变量的值
判定标准:根据预测值的对数与观察到的销售价格的对数之间的均方根误差(RMSE)评估提交的内容(采取对数意味着预测昂贵房屋和廉价房屋的错误将同等影响结果).
数据描述:数据来源于kaggle网站。数据分为训练数据集和测试数据集。两个数据集都包括每栋房⼦的特征,如街道类型、建造年份、房顶类型、地下室状况等特征值。这些特征值有连续的数字、离散的标签甚⾄是缺失值“na”。只有训练数据集包括了每栋房⼦的价格,也就是标签。训练数据和测试数据分别各有1460条,数据的特征列有79个,期中35个是数值类型的,44个类别类型
2模型代码分布及作用介绍
2.1获取和读取数据集
2.1.1加载依赖库(torch):
| import torch |
2.1.2加载数据:
| train_data = pd.read_csv('train.csv') test_data = pd.read_csv('test.csv') |
2.1.3查看一下训练集,测试集的特征(维度):
| print(train_data.shape) print(test_data.shape) print(train_data.iloc[0:4, [0, 1, 2, 3, -3, -2, -1]]) |
结果:
| (1460, 81) (1459, 80) Id MSSubClass MSZoning LotFrontage SaleType SaleCondition SalePrice 0 1 60 RL 65.0 WD Normal 208500 1 2 20 RL 80.0 WD Normal 181500 2 3 60 RL 68.0 WD Normal 223500 3 4 70 RL 60.0 WD Abnorml 140000 |
2.1.4去除特征id,提高训练模型的准确度(第⼀个特征是Id,它能帮助模型记住每个训练样本,但难以推⼴到测试样本):
| all_features= pd.concat((train_data.iloc[:, 1:-1],test_data.iloc[:, 1:])) |
2.2预处理数据
2.2.1对连续数值的特征做标准化
| numeric_features = all_features.dtypes[all_features.dtypes !='object'].index all_features[numeric_features] =all_features[numeric_features].apply(lambda x: (x - x.mean()) / (x.std())) # 标准化后,每个特征的均值变为0,所以可以直接⽤0来替换缺失值 all_features = all_features.fillna(0) |
2.2.2将离散数值转成指示特征
| # dummy_na=True将缺失值也当作合法的特征值并为其创建指示特征 all_features = pd.get_dummies(all_features, dummy_na=True) all_features.shape # (2919, 354) |
2.2.3通过 values 属性得到NumPy格式的数据,并转成 ndarray ⽅便后⾯的训练
| n_train = train_data.shape[0] train_features = torch.tensor(all_features[:n_train].values.astype(np.float32)) test_features = torch.tensor(all_features[n_train:].values.astype(np.float32)) train_labels = torch.tensor(train_data.SalePrice.values.astype(np.float32)).view(-1, 1) |
2.3训练模型
2.3.1使⽤⼀个基本的线性回归模型和平⽅损失函数来训练模型
| loss = torch.nn.MSELoss() def get_net(feature_num): net = nn.Linear(feature_num, 1) for param in net.parameters(): nn.init.normal_(param, mean=0, std=0.01) return net |
2.3.2使用对数均⽅根误差评价模型
| def log_rmse(net, features, labels): with torch.no_grad(): # 将⼩于1的值设成1,使得取对数时数值更稳定 clipped_preds = torch.max(net(features), torch.t |

该博客基于kaggle的住宅数据预测房屋销售价格,是回归问题。介绍了获取和读取数据集、预处理数据、训练模型、K折交叉验证、模型选择和预测等步骤。还测试了不同loss函数、学习率、优化算法等,分析结果表明数据预处理能提高模型效果,并给出遇到问题的解决方法。
最低0.47元/天 解锁文章
339

被折叠的 条评论
为什么被折叠?



