前言

当你在买房子的时候会考虑什么?房子的面积?地理位置?产权年限?是否有地下室?多少楼层?是否学区房?交通是否便利?周围设施是否完整?等等。。。没错,当你想要的要求越来越高时,房子的价格也会越来越高,那么如何根据不同的要求来预测房价呢?这就是该篇博文要讲的内容。感谢kaggle,可以让我们获得那么多的数据来建立模型~~~

好了,其实要求很简单啦,就是根据房子不同的特征(包括面积、位置、产权等)来预测房价!

训练数据

kaggle中的数据大多数是以.csv文件保存,这篇博文所涉及的数据亦是如此,下面来看下训练数据吧:


希望你没有密集恐惧症,一条数据包括房子的各个特征值以及销售价格~这里每条数据一共79个特征,1460个训练数据,1459个测试数据,分别保存在train.csv和test.csv文件中。

实现过程

main.py

import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
import matplotlib.pyplot as plt  # Matlab-style plotting
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.metrics import mean_absolute_error
from DataClassify import DataClassify
color = sns.color_palette()
sns.set_style('darkgrid')
import warnings
from DataHandle import *
def ignore_warn(*args, **kwargs):pass
warnings.warn = ignore_warn #ignore annoying warning (from sklearn and seaborn)
from scipy import stats
from scipy.stats import norm, skew #for some statistics
from sklearn.preprocessing import LabelEncodertrain_data_dir='C:/Users/18301/Desktop/data/train.csv'
test_data_dir='C:/Users/18301/Desktop/data/test.csv'train,test=read_csv_data(train_data_dir,test_data_dir)
train,test,train_ID,test_ID=drop_id(train,test)#Now drop the  'Id' colum since it's unnecessary for  the prediction process.
#check again the data size after dropping the 'Id' variable
print("\nThe train data size after dropping Id feature is : {} ".format(train.shape))
print("The test data size after dropping Id feature is : {} ".format(test.shape))
#把训练数据和测试数据连接到一起,方便后面的统一处理和编码
#这里是记录train和test各有多少数据,既然有连接,到后面处理结束,必然还会有分开,这是用来分开数据的参照
ntrain,ntest,y_train,all_data=get_train_data(train,test)
#[2919,79]
#在这里输出缺失值最严重的前20个特征
all_data_na = (all_data.isnull().sum() / len(all_data)) * 100
all_data_na = all_data_na.drop(all_data_na[all_data_na == 0].index).sort_values(ascending=False)[:30]
missing_data = pd.DataFrame({'Missing Ratio' :all_data_na})
# 把一些丢失比较严重的值输出
print(missing_data.head(20))
#填充缺失值
all_data=fill_misss_data(all_data)
#判断还有没有未填补的缺失值
all_data_na = (all_data.isnull().sum() / len(all_data)) * 100
all_data_na = all_data_na.drop(all_data_na[all_data_na == 0].index).sort_values(ascending=False)
missing_data = pd.DataFrame({'Missing Ratio' :all_data_na})
print(missing_data.head())#对一些类别变量进行编码,使其转换成可供机器学习模型处理的数值变量
all_data,train,test=labelencoder(all_data,ntrain)
train_X, val_X, train_y, val_y = train_test_split(train, y_train,random_state = 0)
classifier=DataClassify(train_X, val_X, train_y, val_y)classifier.decision_tree_reg()
classifier.random_forest_reg()
classifier.gradient_boost_reg()
classifier.mlp_reg()
classifier.svr_reg()
classifier.ridge_reg()#根据结果,可看出梯度提升回归模型效果最好,故采用该回归模型
_GBR = GradientBoostingRegressor()
_GBR.fit(train, y_train)
predictions = _GBR.predict(test)
print(predictions)
submission = pd.DataFrame(predictions, columns=['SalePrice'])
submission.insert(0, 'id', test_ID)
# Export Submission
submission.to_csv('C:/Users/18301/Desktop/data/submission.csv', index = False)#把结果写进提交文件中

DataHandle.py

from sklearn.preprocessing import LabelEncoder
import pandas as pddef read_csv_data(train,test):train_data=pd.read_csv(train)test_data=pd.read_csv(test)return train_data,test_datadef drop_id(train_data,test_data):train_data_ID = train_data['Id']test_data_ID = test_data['Id']train_data.drop("Id", axis=1, inplace=True)test_data.drop("Id", axis=1, inplace=True)return train_data,test_data,train_data_ID,test_data_IDdef get_train_data(train_data,test_data):ntrain = train_data.shape[0]ntest = test_data.shape[0]y_train = train_data.SalePrice.valuesall_data = pd.concat((train_data, test_data)).reset_index(drop=True)# 把train_data中的SalePrice数据给剔除掉all_data.drop(['SalePrice'], axis=1, inplace=True)print("all_data size is : {}".format(all_data.shape))return ntrain,ntest,y_train,all_datadef fill_misss_data(all_data):# 缺失值的填充,关于缺失值填充内容,可以参考pandas相关介绍all_data["PoolQC"] = all_data["PoolQC"].fillna("None")all_data["MiscFeature"] = all_data["MiscFeature"].fillna("None")all_data["Alley"] = all_data["Alley"].fillna("None")all_data["Fence"] = all_data["Fence"].fillna("None")all_data["FireplaceQu"] = all_data["FireplaceQu"].fillna("None")all_data["LotFrontage"] = all_data.groupby("Neighborhood")["LotFrontage"].transform(lambda x: x.fillna(x.median()))for col in ('GarageType', 'GarageFinish', 'GarageQual', 'GarageCond'):all_data[col] = all_data[col].fillna('None')for col in ('GarageYrBlt', 'GarageArea', 'GarageCars'):all_data[col] = all_data[col].fillna(0)for col in ('BsmtFinSF1', 'BsmtFinSF2', 'BsmtUnfSF', 'TotalBsmtSF', 'BsmtFullBath', 'BsmtHalfBath'):all_data[col] = all_data[col].fillna(0)for col in ('BsmtQual', 'BsmtCond', 'BsmtExposure', 'BsmtFinType1', 'BsmtFinType2'):all_data[col] = all_data[col].fillna('None')all_data["MasVnrType"] = all_data["MasVnrType"].fillna("None")all_data["MasVnrArea"] = all_data["MasVnrArea"].fillna(0)all_data['MSZoning'] = all_data['MSZoning'].fillna(all_data['MSZoning'].mode()[0])# 在这里有舍弃了一个特征,原因是这个特征对房价的贡献不大,可以舍弃all_data = all_data.drop(['Utilities'], axis=1)all_data["Functional"] = all_data["Functional"].fillna("Typ")all_data['Electrical'] = all_data['Electrical'].fillna(all_data['Electrical'].mode()[0])all_data['KitchenQual'] = all_data['KitchenQual'].fillna(all_data['KitchenQual'].mode()[0])all_data['Exterior1st'] = all_data['Exterior1st'].fillna(all_data['Exterior1st'].mode()[0])all_data['Exterior2nd'] = all_data['Exterior2nd'].fillna(all_data['Exterior2nd'].mode()[0])all_data['SaleType'] = all_data['SaleType'].fillna(all_data['SaleType'].mode()[0])all_data['MSSubClass'] = all_data['MSSubClass'].fillna("None")return all_datadef labelencoder(all_data,ntrain):cols = ('FireplaceQu', 'BsmtQual', 'BsmtCond', 'GarageQual', 'GarageCond','ExterQual', 'ExterCond', 'HeatingQC', 'PoolQC', 'KitchenQual', 'BsmtFinType1','BsmtFinType2', 'Functional', 'Fence', 'BsmtExposure', 'GarageFinish', 'LandSlope','LotShape', 'PavedDrive', 'Street', 'Alley', 'CentralAir', 'MSSubClass', 'OverallCond','YrSold', 'MoSold')# process columns, apply LabelEncoder to categorical featuresfor c in cols:lbl = LabelEncoder()lbl.fit(list(all_data[c].values))all_data[c] = lbl.transform(list(all_data[c].values))# shape# print('Shape all_data: {}'.format(all_data.shape))all_data = pd.get_dummies(all_data)train = all_data[:ntrain]test = all_data[ntrain:]return all_data,train,test

DataClassify.py

from sklearn.tree import DecisionTreeRegressor
from sklearn.svm import SVR
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.neural_network import MLPRegressor
from sklearn.linear_model import Ridge   #进行岭回归
from sklearn.metrics import mean_absolute_error
from sklearn.ensemble import RandomForestRegressorclass DataClassify:def __init__(self,train_X, val_X, train_y, val_y):self.train_X=train_Xself.val_X=val_Xself.train_y=train_yself.val_y=val_ydef decision_tree_reg(self):# 定义第一个回归模型,决策树回归melbourne_model = DecisionTreeRegressor()# Fit modelmelbourne_model.fit(self.train_X, self.train_y)# get predicted prices on validation dataval_predictions = melbourne_model.predict(self.val_X)# 测试该模型的误差print("决策树回归的平均绝对误差", mean_absolute_error(self.val_y, val_predictions))def random_forest_reg(self):# 定义第二个回归模型,随机森林回归模型forest_model = RandomForestRegressor()forest_model.fit(self.train_X, self.train_y)melb_preds = forest_model.predict(self.val_X)print("随机森林回归的平均绝对误差", mean_absolute_error(self.val_y, melb_preds))def svr_reg(self):# 定义第三个回归模型,svm回归模型l_svr = SVR(kernel='linear')l_svr.fit(self.train_X, self.train_y)l_svr_preds = l_svr.predict(self.val_X)print("SVM的平均绝对误差", mean_absolute_error(self.val_y, l_svr_preds))def gradient_boost_reg(self):# 定义第四个回归,提升树模型gbr = GradientBoostingRegressor()gbr.fit(self.train_X, self.train_y)gbr_preds = gbr.predict(self.val_X)print("梯度提升树的平均绝对误差", mean_absolute_error(self.val_y, gbr_preds))def mlp_reg(self):# 定义第五个回归,神经网络模型回归reg = MLPRegressor()reg.fit(self.train_X, self.train_y)y_pred = reg.predict(self.val_X)print("神经网络模型的平均绝对误差", mean_absolute_error(self.val_y, y_pred))def ridge_reg(self):# 定义第六个回归模型clf = Ridge(alpha=.5)clf.fit(self.train_X, self.train_y)clf_pred = clf.predict(self.val_X)print("岭回归模型的平均绝对误差", mean_absolute_error(self.val_y, clf_pred))

最终结果

对test.csv进行预测,得出结果如下:

id  SalePrice
1461    121047.8755
1462    162053.193
1463    174579.2029
1464    179096.3525
1465    199370.339
1466    172438.738
1467    167993.2324
1468    160644.6524
1469    186415.6287
1470    130224.7314
1471    208229.4251
1472    95848.75736
1473    96142.64045
1474    155273.6439
1475    142582.5748
1476    407136.9535
1477    260408.147
1478    306125.4007
1479    267499.5249
1480    495985.9761

训练数据

本博文训练使用的数据可从SalePrice Data 处下载。

Kaggle实战之房价预测相关推荐

  1. Kaggle实战之 房价预测案例

    房价预测案例(进阶版) 这是进阶版的notebook.主要是为了比较几种模型框架.所以前面的特征工程部分内容,我也并没有做任何改动,重点都在后面的模型建造section Step 1: 检视源数据集 ...

  2. 动手学深度学习:3.16 实战Kaggle比赛:房价预测

    3.16 实战Kaggle比赛:房价预测 作为深度学习基础篇章的总结,我们将对本章内容学以致用.下面,让我们动手实战一个Kaggle比赛:房价预测.本节将提供未经调优的数据的预处理.模型的设计和超参数 ...

  3. 超详解pytorch实战Kaggle比赛:房价预测

    详解pytorch实战Kaggle比赛:房价预测 教程名称 教程地址 机器学习/深度学习 [李宏毅]机器学习/深度学习国语教程(双语字幕) 生成对抗网络 [李宏毅]生成对抗网络国语教程(双语字幕) 目 ...

  4. [Kaggle] Housing Prices 房价预测

    文章目录 1. Baseline 1. 特征选择 2. 异常值剔除 3. 建模预测 2. 待优化特征工程 房价预测 kaggle 地址 参考文章:kaggle比赛:房价预测(排名前4%) 1. Bas ...

  5. Python机器学习/数据挖掘项目实战 波士顿房价预测 回归分析

    Python机器学习/数据挖掘项目实战 波士顿房价预测 回归分析 此数据源于美国某经济学杂志上,分析研究波士顿房价( Boston HousePrice)的数据集. 在这个项目中,你将利用马萨诸塞州波 ...

  6. kaggle房价预测特征意思_Kaggle实战-波士顿房价预测

    本文数据集来自Kaggle波士顿房价预测项目https://www.kaggle.com/c/house-prices-advanced-regression-techniques/data 1.数据 ...

  7. Kaggle经典项目——房价预测

    写在前面: 这篇文章旨在梳理kaggle回归问题的一个基本流程.博主只是一个数据分析刚入门的新手,有些错漏之处还请批评指正.很遗憾这个项目最后提交的Private Score只达到了排行榜的TOP13 ...

  8. kaggle小白入门——房价预测top2%~top1%

    入门第二战,达到了top1%的分数,有点小兴奋,不过也有可能为公分的提高使模型过拟合了,但入门赛貌似也只能追求公分的提高. 言归正传,开战. 一.导包 # 数据处理及可视化 import numpy ...

  9. 数据科学家之路 实战2---Kaggle房价预测

    第一个O2O我其实主要讲了思路,大部分的代码并没有去实现.究其原因还是因为能力不够......感觉天池的题目前对我还是有点难了,找不到下手点.所以还是先回归kaggle,希望仔细研究几个题目后再转战天 ...

  10. 线性回归实战【房价预测】

    前言 本文属于 线性回归算法[AIoT阶段三],这里截取自其中一段内容,方便读者理解和根据需求快速阅读.本文通过公式推导+代码两个方面同时进行,因为涉及到代码的编译运行,如果你没有 NumPyNumP ...

最新文章

  1. golang log日志
  2. C++:17---函数指针
  3. Kotlin习惯用语和编码风格[转自Kotlin中文文档]
  4. 自定义 QTreeView
  5. autocad r14 win7补丁_AutoCAD R14几个实用补丁
  6. PyQt5开发桌面程序二(获取公网ip)
  7. 微博首席架构师杨卫华:新浪微博技术架构分析
  8. amd显卡风扇调节_解决办法:设置显卡风扇速度的教程方法
  9. 计算机网络:数据链路层
  10. 《战神3》GDC技术制作团队研讨报导
  11. Windows与网络基础:Windows基本命令-目录文件操作
  12. labelme_json_to_dataset不能转换关键点的问题
  13. Linux ps state sl+是什么意思
  14. 【4.10 博弈论详解】
  15. STATA画图命令(三)
  16. 中医诊所管理系统哪一类实用 ?
  17. 计算机专业英语名词解释大汇总
  18. module ‘open3d‘ has no attribute ‘xxx‘
  19. 从.gdf格式的脑电数据中获得脑电数据,通道名称,采用频率。
  20. MacOS Catalina 10.15.5 解决 brew install svn 报错Error: You are using macOS 10.15. We do not provide…

热门文章

  1. 诡异的dp(凸多边形分割):catalan数
  2. Amazon AWS S3 上传文件 并获取公用url
  3. 面向对象的JavaScript-008-Function介绍
  4. Bregman 散度
  5. 解决PID 4、NT Kernal占用80、445等端口
  6. oracle 简单job
  7. C# 匿名对象的写法
  8. js实现页面滚动,菜单固定
  9. QA:阿里云K8s启动容器后无法访问网络
  10. python3闭包通俗解释_python通俗解说闭包