请到后台主题设置添加
首页 / 房产工具箱资讯

【实战】机器学习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个变量特征来表征房子特点,数据也包括已有的一些真实房价。希望我们能通过这些数据,来预测其他的房子的价格。   当然先下载数据,包括训练数据,测试数据,还有数据描述,提交结果样本,如下图:   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-
版权说明:
1.版权归本网站或原作者所有;
2.未经本网或原作者允许不得转载本文内容,否则将视为侵权;
3.转载或者引用本文内容请注明来源及原作者;
4.对于不遵守此声明或者其他违法使用本文内容者,本人依法保留追究权等。
搜索
最新留言
关注我们
关注我们
微信
关注我们
微博
请到后台主题设置添加

Powered ByZ-Blog.