Kaggle竞赛入门实战——机器学习预测房屋价格

【机器学习】最经典案例:房价预测(完整流程:数据分析及处理、模型选择及微调) 完整流程:数据分析及处理、模型选择及微调、结果分析 阅读详情

   这篇文章是介绍一个完整的机器学习小项目——预测房屋价格,它是Kaggle竞赛中入门级的题目,和我们比较熟悉的泰坦尼克号生存预测处于同一等级。在之前介绍KNN算法时,曾用过这个数据集,但只是通过简单的建模帮助理解KNN的思想,本文会更加全面地介绍完成一个小项目的流程,如何在科学分析的辅助下预测出我们需要的目标值。

在分析之前我们应该提前明确我们的目的,中途可能需要处理的问题,可以归纳成以下几点:

  • 了解标签变量:可以通过目标变量大致分析出解决问题是需要分类算法还是回归算法。

  • 粗略了解特征:因为特征标签都为英文,所以理解标签含义是最基本的,观察每个特征的特点,是数值型的、还是字符型的;是离散的、还是连续的;粗略联想一下各个特征与目标变量间的联系。

  • 数据预处理:针对性处理数据集中的缺失数据和异常数据。

  • 研究主要特征:数据集中可能只有一部分特征与目标变量间相关性极强,重点分析这些特征与目标变量间的联系。

  • 选择性处理其他特征:除主要特征外,可能主观上认为某些特征也会影响目标变量,也可以选择性分析一下。

  • 建模工作:选出最适合该问题的模型,进行建模、调参等操作。

由于每个人的习惯不同,所以处理问题时的先后顺序、选择的方法自然也不同,比如说处理缺失值的方法就有很多种,本文提及的流程、方法只是个人的一点小思路,希望给伙伴们参考,但绝不局限于此,不论算法还是模型不都应该向更优处发展嘛。

首先一定要大致了解一下测试数据集,上图只是数据集的一小部分,共80个特征+一个目标变量“SalePrice”,共有1460个样本。很明显这个问题是需要通过房子的一些特征预测出相应的价格,所以建模可以选择回归类算法。

缺失值处理

这个数据集许多特征都或多或少的含有一些缺失值,针对缺失值个数的多少,采取的处理方式也不同,像一些特征的缺失值占样本个数超过三分之二,那么这些特征的意义也不大,所以选择舍去这些特征:

# 很多特征还不及数据个数的三分之一,所以选择舍去
data.drop(columns = ['Alley','FireplaceQu','PoolQC','Fence','MiscFeature'],axis = 1,inplace = True)

而对于缺失值较少的数值型特征,根据情况可以选择填充众数、中位数和平均数:

#填补数值型缺失值
data['LotFrontage'].fillna(data['LotFrontage'].median(),inplace = True)
data['MasVnrArea'].fillna(data['MasVnrArea'].mean(),inplace = True)

而数据集中本身含有很多字符型特征,而对于这类特征的缺失值,是没有中位数和平均数一说的,可以随机填充或者填充出现频率最多的元素,这里我选择了后者:

#获得含有缺失值的字符型特征标签
miss_index_list = data.isnull().any()[data.isnull().any().values == True].index.tolist()
miss_list = [] #存元素
for i in miss_index_list: #注意需要reshape规格
    miss_list.append(data[i].values.reshape(-1,1))

这里填充缺失值的方式可以用上述方式,但前提是需要另写一个函数计算特征的众数,另一种方式就是利用sklearn中自带的API进行填充:

from sklearn.impute import SimpleImputer
#用众数填补数值型变量
for i in range(len(miss_list)):
    imp_most = SimpleImputer(strategy='most_frequent') #实例化,参数选择众数
    imp_most = imp_most.fit_transform(miss_list[i]) #训练
    data.loc[:,miss_index_list[i]] = imp_most #替换原来的一列

当然这种方式也适用于数值型,其中参数strategy也是可选的,像均值、中位数、众数和自定义这几种,代码中most_frequent就代表众数。对于填充缺失值的方式,numpy和pandas应用较多,但这种利用API填充也比较便利,可以当成一次拓展,自己了解一下。

处理字符型特征

对于某些回归类算法,比如线性回归,是通过计算继而预测出最后的目标变量,所以训练时传入字符型元素是不合法的。但如果利用随机森林可以避免,因为由决策树构成的随机森林只注重样本特征的分布,但现在我们并不知道哪一种模型更适合该问题,因为最后我们要从中挑选出一个最优的,那么我们在处理数据时就要兼顾我们将要选择的所有模型。

这里选择利用哑变量(也称独热编码)处理字符型数据,可能有的人比较陌生,但介于篇幅问题不在过多阐述,可以自行查询一下,或者过段时间也会写一篇文章单独讲一下变量处理的相关知识。

我们只针对字符型特征进行哑变量转化,所以需要索引出字符型类的特征:

data_ = data.copy() #在一个新的数据集上操作
ob_features = data_.select_dtypes(include=['object']).columns.tolist()

然后就可以通过sklearn中自带的API对字符型特征进行哑变量转换:

#哑变量/独热编码
from sklearn.preprocessing import OneHotEncoder
OneHot = OneHotEncoder(categories='auto')#实例化
result = OneHot.fit_transform(data_.loc[:,ob_features]).toarray()#训练

打印一下result输出如下:这个矩阵中的每一列可以看成一个新的特征,而每个特征只包含0和1两个元素,其中1代表有、0代表没有。比如Street特征中包含两个元素Grvl和Pave,而这两个元素就可以通过哑变量转化形成两个新的特征。Street特征中为Grvl的样本在Gral新一列中就为1,在Pave新一列中就为0,其他特征也是如此。

#获取特征名
OneHotnames = OneHot.get_feature_names().tolist()
OneHotDf = pd.DataFrame(result,columns=OneHotnames)

利用get_feature_names方法可以获取特征的标签,将上述矩阵转化为一个DataFrame:

过滤方差

因为转化为哑变量之后许多特征都是由0和1组成的,仍然用Street举例,会不会有种可能就是所有样本的Street中的元素都为Grvl呢?如果这样哑变量转化后的Grvl一列皆为1,而Pave一列皆为0,那么这两个新的特征对于最后的目标变量的预测是没有一点用处的,是可以直接删去的,所以利用方差过滤掉类似的情况,将阈值设为0.1,方差低于0.1的特征都将被过滤掉。

from sklearn.feature_selection import VarianceThreshold
#过滤掉方差小于0.1的特征
transfer = VarianceThreshold(threshold=0.1)
new_data1 = transfer.fit_transform(data_)
#get_support得到的需要留下的下标索引
var_index = transfer.get_support(True).tolist()
data1 = data_.iloc[:,var_index]

最后利用该方法过滤掉了188个特征,原本的270个特征还剩下82个特征。

相关性过滤

82个特征仍然太多了,一定还有一些无关紧要的特征,需要继续特征降维,如果一个特征对于目标变量的预测有帮助,那么这个特征与目标变量间一定有某种联系,那么这个特征与目标变量之间的相关性一定是比较高的,所以可以通过特征与目标变量间的相关系数过滤一些特征。

#皮尔逊相关系数
from scipy.stats import pearsonr
pear_num = [] #存系数 
pear_name = [] #存特征名称
feature_names = data1.columns.tolist()
#得到每个特征与SalePrice间的相关系数
for i in range(0,len(feature_names)-1):
    print('%s和%s之间的皮尔逊相关系数为%f'%(feature_names[i],feature_names[-1],pearsonr(data1[feature_names[i]],data1[feature_names[-1]])[0]))
    if (abs(pearsonr(data1[feature_names[i]],data1[feature_names[-1]])[0])>0.5):
        pear_num.append(pearsonr(data1[feature_names[i]],data1[feature_names[-1]])[0])
        pear_name.append(feature_names[i])

我们设定阈值为0.5,留下相关系数绝对值大于0.5的特征,因为不止正相关有影响,负相关也是对预测有一定作用的。

经过滤后只剩下13个特征,上述计算的是特征与目标变量之间的相关性,我们可以再从特征与特征之间的相关性找一找联系,可不可以再降几维呢?

  • TotalBsmtSF(房间总数)和GrLivArea(地面以上居住面积)相关系数0.83;

  • GarageCars(车库可装车辆个数)和GarageArea(车库面积)相关系数0.88;

  • TotalBsmtSF(地下室总面积)和1stFlrSF(第一层面积)相关系数0.82;

个人觉得可以将TotalBsmtSF和GrLivArea都保留,因为房间面积和房间总数不会过于冲突,可能在房间面积相同的情况下,房间个数越多的房子价格会更高一些呢?而剩下的四个特征从意思上就有一些冲突,可以取GarageArea和otalBsmtSF两个特征。

可视化分析

我们可以通过可视化验证一下过滤后的特征与目标变量之间是否存在上文我们预想的某种联系,这里推荐用箱线图绘制数据较为离散的特征、用散点图绘制数据较为连续的特征,前者方便比较,后者方便观察分布,利于找出联系。

可以看到OverallQual(总体评价)对于价格的影响真的巨大,所以买卖口碑真的是非常重要呀,其他离散特征与目标变量间的联系也是具有很明显的趋势的。

散点图可视化出的结果也是非常明显,所以我们选取的这几个特征都是不错的,但是这不代表其他特征与目标变量之间没有联系,之前也提及过可以选取一些主观上感觉有联系的特征再进行二次分析。我自己猜测Neighborhood(地理位置)和HeatingQC(加热质量)对于价格应该会有影响,但是可视化出的结果显示联系并不大。

选模、调参

模型测试我选择用线性回归和随机森林,由于线性回归对传入数据的要求以及要通过均方误差判断哪一个模型更优,所以需要先对训练集和测试集进行标准化,然后计算两个模型对应的均方误差,代码如下:

#计算模型的均方误差
clfs = {'rfr':RandomForestRegressor(),
      'LR':LinearRegression()}
for clf in clfs:
        clfs[clf].fit(x_train_sta,y_train_sta)
        prediction = clfs[clf].predict(x_test_sta)
        print(clf + " RMSE:" + str(np.sqrt(metrics.mean_squared_error(y_test_sta,prediction))))
'''
rfr RMSE:0.38292937665826626
LR RMSE:0.5534982168680332
'''     

在不调整参数的情况下,rfr的均方误差小于LR,随机森林在该问题上是要优于线性回归的,所以选定随机森林作为最后建模要用的算法,然后利用网格搜索或者学习曲线对算法进行调参。

这里省略很多很多调参步骤。

最后我自己尝试调出的最佳参数如下,调参之后的模型得分大约为84%,前后相比大约提高了大约2%。

rf = RandomForestRegressor(n_estimators=300,max_depth =20,
                          max_features =5,min_samples_leaf =2,
                          min_samples_split=2)
grid = GridSearchCV(rf,param_grid=param_grid,cv = 5)
grid.fit(x_train,y_train)
rf_reg = grid.best_estimator_#最佳模型

可以在模型的基础上分析一下特征重要程度,其中OverallQual(总体评价)和GrLivArea(居住面积)两者重要程度占比就已经超过五成,反观x32_Unf(未完成地下室面积)和x29_TA(厨房质量)影响甚微。

需要对测试集做与训练集一致的操作,例如缺失值处理、哑变量转化等,然后索引出测试集中这些重要特征并传入建好的模型中,得出最终的预测结果"SalePrice",然后将"Id"和"SalePrice"导出一个名为submission的csv文件,最后需要在Kaggle需要上传这份文件,就可以得到自己的排名啦。

submission_Id = pd.read_csv("house_test.csv",usecols=['Id'])
SalePrice = pd.DataFrame(test_value_y,columns=['SalePrice'])
Submission = pd.concat([submission_Id,SalePrice],axis=1)
Submission.to_csv("submission.csv",index = False)

总结

综上可以发现完成一个小项目五成的时间用来处理分析数据、四成的时间用来调参、最后一成时间用来选模建模,而最终模型的好坏五成取决数据本身、四成取决于你的特征工程、最后一成取决于你的调参,所以需要把更多时间更多精力放在数据处理、特征工程上才能得到让自己满意的一个结果。

后台回复“房价预测”可获取源码供参考

数据挖掘笔记Ⅰ——探索性数据分析(房租预测) 任务一、认识数据,要求如下: 了解比赛的背景 分类问题还是回归问题 熟悉比赛的评分函数 对训练集数据的探索性分析 基本统计函数,数据总览: 训练集的总体情况 变量类别分类 缺失值分析 特征值分析 是否有单调特征列(单调的特征列很大可能是时间) 特征nunique分布 统计特征值出现频次大于100的特征 Label分布 0、调包导数 首先,调用可能用的到的包。导入源数据; #coding:utf... 阅读详情

相关推荐

3-3 实验2--探索性数据分析及特征工程(2课时)

建议课时:2课时 练习目的 掌握探索性数据分析基本方法 掌握特征工程的基本方法 对比特征工程带来的模型效果提升 练习内容 结合《第三章 数据探索分析与特征工程》介绍的知识与技能,完成以下练习: 探索数据集中的变量相关性,及单个特征呈现的规律 对原始变量进行特征工程,生成新的特征 使用特征工程后的特征优化模型,对比模型表现 整个实验仍按照机器学习的基本工作流程来进行。 问题定义 本次练习来源于Kaggle举办的一次数据竞赛,希望用机器学习来解决:预测“生”与“死”的二分类问题。为了对比与实验1的模型效

weixin_51775736的博客 4056

Kaggle竞赛入门教程案例

Kaggle入门新手教程(房价预测案例)Kaggle房价预测竞赛链接与背景介绍竞赛代码解析导入工具包数据加载数据预处理异常值初筛插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 Kaggle房价预测 对于刚刚入门机器学习的童孩来说,如何快速地通过不同实战演练以提高代码能力和流程理解是一个需要

JR_Smith1的博客 4519

kaggle房价预测模型总结

房价预测任务 目标:根据房屋属性预测每个房子的最终价格。 任务流程: (一):分析数据指标 不同指标对结果的影响 连续值与离散值的情况 (二):观察数据正太性 数据变换操作 (三):数据预处理 缺失值填充 标签转换 (四):建模预测房价 (一):分析数据指标 先总体查看数据的特征值与目标值: 特征值: MSSubClass:建筑类 mszoning:一般的分区分类 LotFron...

Rick_Restart的博客 5153

kaggle房价预测代码

写这篇博客之前,我自己完成了这道题,kaggle的分数是0.14777,排名前百分之60,不是很满意,然后花了两天的空闲时间读了一份前百分之十,一份前百分之15的人的代码,比较了一下他们代码,发现了很多共同点,这些就是以后我需要注意的,总结来看学到了不少知识,在这里我按照一份代码讲解一下这个题,同时记录一下收获。 我看了他们的代码发现,他们都用了集成学习Stacking方法,这是我从来没有听说过...

lyy的博客 4423

Kaggle实战入门(二)之房价预测Housing Prices Competition

这是博主第二个kaggle项目,Housing Prices Competition。这个项目是基于波士顿房价改编的数据集对房子的价格进行预测。虽然是基于波士顿房价数据集,但改编过后有着80多个数据特征,还是有一定难度的。下面给大家分享一下我的做法把,同样地在kaggle上排到了前10%的成绩。 Part1.数据导入和初步分析 先来初步观察一下我们这次要用到的数据集 import numpy as np import pandas as pd import seaborn as sns import ma

kiligso的博客 5599

kaggle上面有哪些适合机器学习新手的比赛和项目

Titanic 是 Kaggle 上最经典的新手比赛之一,旨在预测泰坦尼克号上的乘客是否能够幸存。这个比赛不仅数据集相对简单,而且涵盖了从数据预处理到模型训练的完整流程,非常适合初学者学习和实践。

xiamu_CDA的博客 3261

kaggle教程--房屋价格预测代码

https://www.kaggle.com/c/home-data-for-ml-course import pandas as pd TRAIN_PATH = '/opt/work/jupyter/data/kaggle/house_price/train.csv' TEST_PATH = '/opt/work/jupyter/data/kaggle/house_price/test.csv'...

赵子的博客 1206

Kaggle 竞赛——房屋价格预测

作者:禅与计算机程序设计艺术 1.简介 房价是一个十分复杂的经济学命题。相信大家都知道国际上对房价影响巨大的原因之一就是居住环境的改变。随着人口的增长,城市的建设,教育的普及,社会的进步等因素的作用,房价的上涨速度也在加快。同时,房价也受到许多因素的影响,比如政策法规、经济危机、社会矛盾等等。房价预测可

AI天才研究院 600

kaggle实战之房价预测,了解一下?

在学习完各种高大上的机器学习理论知识(线性回归、逻辑回归、分类决策树、随机森林等等)之后,也许你会问这玩意儿到底有什么用?? 也许你已经按捺不住想自己好奇的心,想找到实际的数据练练手?? Talk is cheap, show me the code! 本篇文章就是用 kaggle 平台上实际的数据带你走进机器学习的世界,来看看,所谓的数据挖掘或者机器学习实际应用到底是怎么样一个过程。 1....

AI黑板报的专栏 4862

Kaggle 竞赛入门指南

本文介绍Kaggle竞赛全流程

m0_73328294的博客 1126

Kaggle房屋价格预测项目实战指南

Kaggle成立于2010年,是一个全球性的数据科学竞赛平台,它为数据科学家提供了一个展示才华、解决问题和相互学习的场所。通过解决行业中最有趣和最具挑战性的问题,Kaggle竞赛不断推动数据科学领域的发展和创新。对于个人而言,参加Kaggle竞赛不仅能积累实战经验、提升技术能力,还能在全球范围内建立起专业声誉。机器学习领域包含广泛的算法,这些算法可以分为监督学习、无监督学习、半监督学习和强化学习等类别。在房价预测这类监督学习任务中,主要关注的是如何根据历史数据预测未来的输出值。

weixin_28235889的博客 471

Kaggle官方教程之机器学习入门

Kaggle官方教程之机器学习入门 Kaggle机器学习课程翻译,本课程介绍了如何建立决策树模型和随机森林模型对房价进行预测。

菜鸡养成手册 1717

Kaggle房屋价格预测完整项目

本文还有配套的精品资源,点击获取 简介:该项目源自Kaggle平台上的数据科学竞赛,参与者通过分析和建模来预测房屋价格。Jupyter Notebook的使用为数据处理、分析和可视化提供了便捷的工作环境。竞赛涉及数据预处理、特征工程、模型选择、评估等多个数据科学关键环节。参赛者必须运用各种机器学习模型和技术来优化预测性能。 1. 数据科学竞赛介绍 数据科学竞...

weixin_29092787的博客 1007

Kaggle课程 — 机器学习入门 Intro to Machine Learning

学习Machine Learning的核心概念, 然后创建你的第一个模型.

迷途小书童问天的博客 2136

RentPricePredict:机器学习模型,用于预测房屋租金价格

房屋租金预测 机器学习模型,用于确定类似的邮政编码(以租金中位数计)以及近年来美国租金波动较大(正数或负数)的地区。 源数据来自Zillow实测租金指数(ZORI): Zillow数据集的中位数租金价格是按地理区域(按月)排序的,其中包含2014年至2020年的7年数据。 它包括美国前100个都会区,并在其中按邮政编码细分了租金中位数。 数据还针对单位类型和大小等市场偏斜特征进行了因素调整/调整。 市场的住所类型可能完全不同,并且考虑到了不同市场之间的差异。 我在此项目中创建的ML模型将说明特定市场的中位数租金随时间的变化,并且根据当前的趋势,可以预测未来几年哪些市场可能会继续看到中位数租金的增加或减少。

VC Spyglass调试秘籍:从Lint报错到代码修复的完整工作流

本文详细介绍了VC Spyglass调试的完整工作流,重点解析了如何高效定位和修复Lint检查中常见的XMRE-L跨模块引用错误。通过对比GUI与命令行(vc_static_shell)双模式调试技巧,并结合TCL脚本实现批量处理与规则豁免,帮助数字设计工程师系统化地提升代码调试效率与质量。

weixin_29246195的博客 585
上一篇: 又跌!6月全国程序员工资新统计,太扎心
下一篇: 收藏 | 机器学习数据集汇总收集
机器学习算法那些事
博客等级 码龄9年 1633粉丝 62原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值