机器学习Kaggle入门:房价预测比赛
前面已经有了两篇机器学习Kaggle入门的笔记,
机器学习Kaggle入门,经典又兼具备趣味性的泰坦尼克号问题
第一个问题是分类问题,第二个问题是回归问题。
两个案例主要是展示了特征工程的魅力,如何利用第三方库快速的实现模型搭建。
现在这篇文章,会侧重介绍kaggle的实际操作”现场“,方便大家去跟着思路学习进入到kaggle的真实世界,不仅知道怎么做模型预测,还知道数据在哪下载,在哪提交。
其次,这个房价预测的比赛相比之前的两个案例是特征多了很多,面对特征突然”爆炸“,本文提供简单的处理思路。
进入主题
官网:
https://www.kaggle.com/c/house-prices-advanced-regression-techniques
先看下项目描述:
Competition Description
Ask a home buyer to describe their dream house, and they probably won't begin with the height of the basement ceiling or the proximity to an east-west railroad. But this playground competition's dataset proves that much more influences price negotiations than the number of bedrooms or a white-picket fence.
With 79 explanatory variables describing (almost) every aspect of residential homes in Ames, Iowa, this competition challenges you to predict the final price of each home.
简而言之就是,我们这里有一些房子的信息数据,它包括79个变量特征来表征房子特点,数据也包括已有的一些真实房价。希望我们能通过这些数据,来预测其他的房子的价格。
数据下载
当然先下载数据,包括训练数据,测试数据,还有数据描述,提交结果样本,如下图:
File descriptions
-
train.csv - the training set
-
test.csv - the test set
-
data_description.txt - full description of each column, originally prepared by Dean De Cock but lightly edited to match the column names used here
-
sample_submission.csv - a benchmark submission from a linear regression on year and month of sale, lot square footage, and number of bedrooms
好了,迫不及待的要开始了!!!
一、老思路分析选取特征
第一阶段采用老思路,对数据特征进行分析,知道哪些特征重要。
1.导入必要库
pandas ,matplotlib.pyplot ,seaborn,numpy,
warning 用来屏蔽警告这种令人讨厌又不影响结果的提示。
2.导入数据
还是老套路,pd.read_csv('xxxx.csv') ,运行脚本与数据csv文档不在一个文件地址下,需要带上地址。
3.观察数据
观察数据,做到心中有数,至少了解数据是什么形式的,有个整体印象。
81列,其中特征80个,包含预测标签1个,特征标签79个。
了解数值型数据的分布,如下:
这个表展示的数据都为数值型的数据,有38个特征是数字型。
4.浏览特征字段
看到这些词汇,感觉增长了见识。不怕字段多,多了可以少嘛!来看看这些特征的中文含义。(有点多,要不挑几个看看好了,比如地上面积,地下室面积,车库大小等)
-
SalePrice: 销售价格
MSSubClass: 建筑类
LotFrontage: 直线距离
LotArea:土地面积(平凡英尺)
Street: 路的类型
Alley : 胡同类型
LotShape:房产的形状(是否规则)
LandCounter: 房产的平坦度
Utitles: 公共设备 设施
LotConfig: 划分配置
LandSlope:斜坡程度
Neighborhood: 在Ames city范围的物理位置
Condition1:接近各种条件
Condition2: 接近各种条件
BldgType :住宅的类型
HouseStyle :住宅的风格
OverallQual :给房屋整体材料和装修评分
OverallCond: 为房屋的整体状况评分
YearBuilt: 建造日期
YearRemodAdd: 重新改造日期
RoofStyle :屋顶的类型
RoofMatl :屋顶材料
Exterior1st:房屋外部覆盖物
Exterior2nd:房屋外部覆盖物(不止一种)
MasVnrType :砌体单板类型
MasVnrArea :单位买诺记的砌体木皮面积
ExterQual : 外部材料的质量评价
ExterCond: 评估外部材料的现状
Foundation :基础类型
BsmtQual : 评估地下室的高度
BsmtCond :评估地下室的一般状况
BsmtExposure :出口或花园墙壁曝光程度
BsmtFinType1 :地下室完工面积比
BsmtFinSF1 :类型1完成平方英尺
BsmtFinType2 :地下室完工面积比(如果不止一种)
BsmtFinSF2 :类型2完成平方英尺
BsmtUnfsF :未完成的地下室平方英尺
TotalBsmtSF :地下室总面积
Heating QC: 热暖质量和条件
CentraAir : 是否有*空调
Electrical :电气系统
1stFlrSF:一楼平方英尺
2ndFlrSF:二楼平方英尺
LowQualFinSF:低质量完成平方英尺(所有地板)
GrLivArea:高于(地面)居住面积的平方英尺
BsmtFullBath:地下室完整的浴室
BsmtHalfBath:地下室半浴室
FullBath:高档浴室
HalfBath:高于等级的半浴室
Bedroom :地上的卧室
Kitchen: 高档厨房
KitchenQual :厨房质量评估
TotRmsAbvGrd :高档卧室(不包括浴室)
Functional :家庭功能
FireplaceQu :壁炉数量
FireplaceQu :壁炉质量
GarageType : 车库位置
GarageYrBlt :车库建成年份
GarageFinish : 车库的内部完成
GarageCars: 车容量为单位的车库大小
GarageArea : 以平方英尺为单位的车库大小
GarageQua: 车库质量
GarageCond :车库条件
PavedDrive :铺设车道
WoodDeckSF:木甲板面积(平方英尺的)
OpenPorchSF:打开门廊面积(以平方英尺)
EnclosedPorch:封闭门廊面积(以平方英尺)
3SsnPorch:门廊(三个平方英尺的)
ScreenPorch:屏幕门廊面积(平方英尺的)
PoolArea:以平方英尺为单位的泳池面积
PoolQC:泳池质量
Fence : 栅栏质量
MiscFeature :杂项功能未在其他类别中涵盖
MiscVal:杂项功能的价值
MoSold:月销量(MM)
YrSold:已售出年份(YYYY)
SaleType:销售类型
SaleCondition:销售条件
5.看看数据的统计是否有缺失值
字段太多,截取了开始的部分,共1460行数据记录,如果统计的非空记录少于1460,说明有缺省值。
6.看看标签的数据,分布情况
房价没有空缺值
平均价格18.0921万,
最小值为3.49万,最大值为75.5万。 (美元哈)
数据分布稍微左偏。
7.如何选择特征?
看相关系数
与房价saleprice越相关,颜色越浅,
人眼观察:从图中看出,OverallQual,GrLiveArea,TotalBsmtSF, 1stFlrSF,GarageCars.都是相关系数比较靠前。
凭眼力,也许不好分出10个特征。
代码解决:
根据数字大小,得出相关性前十的特征:OveralQual , GrLivArea, GarageCars , GarageArea ,TotalBsmtSF, 1stFlrSF ,FullBath, TotRmsAbvGrd ,YearBuilt 。
至此拿这十个特征就可以开始训练了,这次我们不这样,毕竟70个特征,用10个有点浪费,这一次,想都用起来看看。
二、利用所有特征来训练
1.读取数
2.对标签房价处理
使之尽量成正太分布形式。使用log,并单独作为y ,且从数据中移除(pop)。
3.联合数据
将训练集和测试集合并进行特征处理(将测试集接在训练集后面),等特征处理完毕后再拆分出来单独训练和预测。
将训练集和测试集,前后连接,合起来2919条数据,特征还是79个。
4.One-hot处理
我们注意到MSSubClass_20是类别型数据,看看:
数字本身大小的含义会在模型中有影响,所以为了避免分类时的数值影响,
采用pandas自带的get_dummies方法,实现one-hot .
MSSSubClass 被我们分成了12个column ,每一个代表一个Category, 是就是1,不是就是0。
同样,将所有的category数据,都给One-Hot 。
经过处理后的特征变为了288个。
5.缺失值处理
看看还有多少缺失值,数值型的数据还存在缺失值。
缺失值最多的是LotFrontage :Linear feet of street connected to property
意思是与街道的直线距离,GarageYrBlt :车库修建年份,等。
这里我们采用各特征已有数据的平均值来填充。代码如下:
填充后检查,缺失值数目为0,验证均已经填充完毕。
6.标准化数据,归一化
对于各个特征的数据范围不一样,影响诸如线性回归的效果不明显的问题。
模型相对喜欢归一化的数据。
以上都是整型数值型数据,在此将对每个特征数据进行归一化处理,这里使用标准化:(X-X')/S 进行数据转换。
7.建立模型
因之前合并了数据进行特征处理,这里把数据集拆分还原为训练集和测试集。
1)线性回归
Ridge Regression 岭回归
导入第三方库,包括岭回归 和交叉验证函数。
拟定不同的50个参数,通过交叉验证选取适合的参数。
交叉验证,存储不同的alpha下,均方误差,通过绘图不同参数下的误差曲线查看最好的参数。
绘图如下:
图中看出:alpha=10~20时,score达到0.135 处于误差最低。
2)Random Forest随机森林
随机森林主要参数:
-
n_estimators:表示森林里树的个数;
-
max_features:随机选择特征集合的子集合,并用来分割节点。
将树的个数作为变量,定子集0.3倍的特征,来探索多少树个数能得到好的效果。
同样是采用交叉验证的方式。
作图:
上图中看到树的个数 n_estimators取150是其中最佳的点,均方误差为0.1372 .
3)集成学习Ensemble
选取了岭回归和随机森林两种算法,并通过类举法得到相应的好参数。
将两种”好参数“条件下的算法结果进行综合,取平均数,得到的预测值将会更准确。
进行预测,并将数据进行指数转换(因为前面有对房价数据进行log处理)。
代码中我们打印了岭回归预测准值为0.98。虽然这个准确度是很不错,说明算法起到了预测的效果,但提示需要注意,对训练集的预测准确度高的模型不一定就对测试集的预测效果要好,因为可能出现”过拟合“,导致模型的泛化能力不强。
平均值
综合两个模型的预测值,取最简单的平均。
8.提交结果
提交结果时要知道结果是什么形式,我们打开官方提交结果样式,如下,需要保存为.csv格式,且只有Id,和对应的房价SalePrice。
所以要先从测试集取出test_df.index ,并与最后预测的房价’SalePrice‘进行组合。
至此,结果文档已经产生。
来看下生成结果文档ensemble_ridge_randomForest.csv:
检查完格式,就可以将文件提交到kaggle 房价预测项目中,就算完成了!
至于排名多少,大家 可以试试提交哦!
此文结束,后续还会以该案例进行扩展,用到bagging,xgboost等高逼格算法。通过不同的研究尝试达到算法的理解,思路的整理。
请继续关注和我一起玩kaggle有趣项目吧。
-end-
(如需获得源代码,
请联系微信:ai_hellohello)