【实战】机器学习Kaggle入门:房价预测比赛(手把手附源代码)

前面已经有了两篇机器学习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  进行数据转换。

 

三.建立模型

因之前合并了数据进行特征处理,这里把数据集拆分还原为训练集和测试集。

 

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。虽然这个准确度是很不错,说明算法起到了预测的效果,但提示需要注意,对训练集的预测准确度高的模型不一定就对测试集的预测效果要好,因为可能出现”过拟合“,导致模型的泛化能力不强。

平均值

综合两个模型的预测值,取最简单的平均。

 

四、提交结果

提交结果时要知道结果是什么形式,我们打开官方提交结果样式,如下,需要保存为.csv格式,且只有Id,和对应的房价SalePrice。

所以要先从测试集取出test_df.index ,并与最后预测的房价’SalePrice‘进行组合。

至此,结果文档已经产生。

来看下生成结果文档ensemble_ridge_randomForest.csv:

 

检查完格式,就可以将文件提交到kaggle 房价预测项目中,就算完成了!

 

至于排名多少,大家 可以试试提交哦!

 

此文结束,后续还会以该案例进行扩展,用到bagging,xgboost等高逼格算法。通过不同的研究尝试达到算法的理解,思路的整理。

请继续关注和我一起玩kaggle有趣项目吧。

-end-

(如需获得源代码,
请联系微信:ai_hellohello)
  • 27
    点赞
  • 235
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值