10 kaggle:预测房价
10.1 下载和缓存数据集
1 | import hashlib |
10.2 访问和读取数据集
1 |
|
正在从http://d2l-data.s3-accelerate.amazonaws.com/kaggle_house_pred_train.csv下载data\kaggle_house_pred_train.csv...
正在从http://d2l-data.s3-accelerate.amazonaws.com/kaggle_house_pred_test.csv下载data\kaggle_house_pred_test.csv...
(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
10.3 数据预处理
- 缺失值用均值代替
- 为了将所有特征放到一个共同的尺度上,将特征缩放到均值为0,单位方差:
$$x \leftarrow \frac{x-\mu} \sigma$$ - 标准化数据有两个原因:
- 方便优化
- 因为我们不知道哪些特征是相关的,所以我们不想让惩罚分配给一个特征的系数比分配给其他任何特征的系数更大
- 离散值处理:独热编码:如MSZoning列包含值:‘RL’和‘RM’。创建两个新的指标列MSZoning_RL和MSZoning_RM,值为0,1.可以用pandas自动实现
1 | ## 2标准化 |
(2919, 331)
10.4 训练
- 先训练一个带有损失平方的线性模型,线性模型可以提供一种健全性检查,以查看数据中是否存在有意义的信息。如果线性模型不能做得比随机猜测更好,那么可能存在数据处理错误。如果一切顺利,线性模型可以作为基线模型(baseline)
- Adam优化器主要吸引力在于对初始学习率不那么敏感
1 | loss= nn.MSELoss() |
- 对于误差,更关心相对误差,例如北京房价预测差了10万与阳新放假预测差了10万是不同的。
- 可以用价格预测的对数来衡量差异。将$\sigma for |log y - log \hat y|$转换为$e^{-\sigma} \leq \frac{\hat y}{y} \leq e^{\sigma}$这使得预测价格的对数与真实标签价格的对数之间出现以下均方根误差:
$$\sqrt{\frac1n\sum_{i=1}^n\left(\log y_i-\log\hat{y}_i\right)^2}$$
1 | def log_rmse(net, features, labels): |
10.5 K折交叉验证
- 有助于模型选择和超参数调整。我们首先需要定义一个函数,在K折交叉验证过程中返回第i折的数据。具体地说,它选择第i个切片作为验证数据,其余部分作为训练数据。每次在K − 1个子集上进行训练,并在剩余的一个子集上进行验证。
1 | def get_k_fold_data(k, i, X, y): |
- 训练K次,并返回训练和验证误差的平均值
1 | import os |
10.6 模型选择
- 使用未调优的超参数
1 | k, num_epochs, lr, weight_decay, batch_size=5, 100, 5, 0, 64 |
折1, 训练log rmse 0.170100, 验证log rmse 0.156652
折2, 训练log rmse 0.162041, 验证log rmse 0.188112
折3, 训练log rmse 0.163980, 验证log rmse 0.168341
折4, 训练log rmse 0.167889, 验证log rmse 0.154215
折5, 训练log rmse 0.163577, 验证log rmse 0.183105
5-折验证:平均训练log rmse:0.165517,平均验证log rmse:0.170085
10.7 提交Kaggle预测
- 使用所有的数据进行训练,将预测保存在csv文件
1 | def train_and_pred(train_features, test_features, train_labels, test_data, |
训练log rmse:0.162509