作为深度学习基础内容的总结,我们将对前面学习的内容学以致用。下面,让我们动手实战一个Kaggle比赛:房价预测。
Kaggle公司(网站地址:https://www.kaggle.com )2010年在墨尔本成立,是一个主要为开发商和数据科学家提供举办机器学习竞赛、托管数据库、编写和分享代码的平台,深受机器学习爱好者的喜爱。
项目简介
房价预测是kaggle的一个经典的回归预测项目。
我们可以在房价预测⽐赛的⽹⻚上了解⽐赛信息和参赛者成绩,也可以下载数据集并提交⾃⼰的预测结果。
该⽐赛的网页地址是https://www.kaggle.com/c/house-prices-advanced-regression-techniques
这个比赛的数据用了79个解释性变量(几乎)描述了爱荷华州埃姆斯市住宅的方方面面,从而预测房价最终价格。
1.获取和读取数据集
⽐赛数据分为训练数据集和测试数据集。两个数据集都包括每栋房⼦的特征,例如街道类型、建造年份、房顶类型、地下室状况等特征值。这些特征值有连续的数字、离散的标签甚⾄是缺失值“na”。只有训练数据集包括了每栋房⼦的价格,也就是标签。我们可以访问⽐赛⽹⻚,在网页的“Data”标签中下载这些数据集。
下载后的文件夹包括四个文件:
train.csv - 训练数据
test.csv - 测试数据
data_description.txt - 对各个特征的说明文档
sample_submission.csv - 预测结果提交示例
训练数据集包括 1460 个样本、80 个特征和 1 个标签
测试数据集包括 1459 个样本和 80 个特征。我们需要将测试数据集中每个样本的标签预测出来。
查看前 4 个样本的前 4 个特征、后 2 个特征和标签(SalePrice)
2.数据集预处理
对连续数值的特征做标准化(standardization):设该特征在整个数据集上的均值为μ,标准差为σ。那么,我们可以将该特征的每个值先减去μ再除以σ得到标准化后的每个特征值。对于缺失的特征值,我们将其替换成该特征的均值。
我们标准化数据有两个原因:首先,它方便优化。 其次,因为我们不知道哪些特征是相关的, 所以我们不想让惩罚分配给一个特征的系数比分配给其他任何特征的系数更大。
我们用峰度(Kurtosis)与偏度(Skewness)来量测SalePrice数据正态分布特性如下:
3.训练模型
我们使⽤⼀个基本的线性回归模型和平⽅损失函数来训练模型。
房价就像股票价格一样,我们关心的是相对数量,而不是绝对数量。因此,我们更关心相对误差(y-y’)/y,而不是绝对误差(y-y’)。
例如,如果我们在俄亥俄州农村地区估计一栋房子的价格时,假设我们的预测偏差了 10 万美元, 然而那里一栋典型的房子的价值是 12.5 万美元, 那么模型可能做得很糟糕。 另一方面,如果我们在加州豪宅区的预测出现同样的10万美元的偏差, (在那里,房价中位数超过400万美元) 这可能是一个不错的预测。
解决这个问题的一种方法是用价格预测的对数来衡量差异,这也是比赛中官方用来评价提交质量的误差指标,即将
这使得预测价格的对数与真实标签价格的对数之间出现以下均方根误差:
其中y1, . . . , yn为预测值, y’1, . . . , y’n 为对应的真实标签。
训练代码
4.K折交叉验证
K折交叉验证简介
在机器学习建模过程中,通行的做法通常是将数据分为训练集和测试集。测试集是与训练独立的数据,完全不参与训练,用于最终模型的评估。在训练过程中,经常会出现过拟合的问题,就是模型可以很好的匹配训练数据,却不能很好在预测训练集外的数据。如果此时就使用测试数据来调整模型参数,就相当于在训练时已知部分测试数据的信息,会影响最终评估结果的准确性。通常的做法是在训练数据再中分出一部分做为验证(Validation)数据,用来评估模型的训练效果。
验证集在训练中扮演K折交叉验证的作用
验证数据取自训练数据,但不参与训练,这样可以相对客观的评估模型对于训练集之外数据的匹配程度。模型在验证数据中的评估常用的是交叉验证,又称循环验证。它将原始数据分成K组(K-Fold),将每个子集数据分别做一次验证集,其余的K-1组子集数据作为训练集,这样会得到K个模型。这K个模型分别在验证集中评估结果,最后的误差MSE(Mean Squared Error)加和平均就得到交叉验证误差。交叉验证有效利用了有限的数据,并且评估结果能够尽可能接近模型在测试集上的表现,可以做为模型优化的指标使用。
简单解释,将训练集分为k份,每次将其中一份作为验证集,其余做训练集。它返回第i折交叉验证时所需要的训练和验证数据。
交叉验证代码
5.模型选择
我们使用一组未经调优的超参数并计算交叉验证误差,可以改动这些超参数来尽可能减小平均测试误差。
train rmse: 0.150013
上述代码执行完之后会生成一个submission.csv文件,该文件符合kaggle的提交格式,可以直接将结果再kaggle比赛链接进行提交。
总结
有时候你会发现⼀组参数的训练误差可以达到很低,但是在k折交叉验证上的误差可能反⽽较⾼。这种现象很可能是由过拟合造成的。因此,当训练误差降低时,我们要观察k折交叉验证上的误差是否也相应降低。
留言与评论(共有 0 条评论) “” |