Kaggle项目实战:房价预测

参考文章

https://www.kaggle.com/marsggbo/kaggle

github源代码

https://github.com/LeoLeos/house-prices-advanced-regression-techniques

学习过程

  • 理解问题 : 观察每个变量特征的意义以及对于问题的重要程度
  • 研究主要特征 : 也就是最终的目的变量----房价
  • 研究其他变量 : 研究其他多变量对“房价”的影响的他们之间的关系
  • 基础的数据清理 : 对一些缺失数据、异常点和分类数据进行处理
  • 测试假设
Created with Raphaël 2.2.0 分析,找出对因变量房价影响较大的自变量 选出这些自变量 进行机器学习拟合 预测 yes no

代码过程

导入第三方库

# 导入需要的模块
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# 用来绘图的,封装了matplot
# 要注意的是一旦导入了seaborn,
# matplotlib的默认作图风格就会被覆盖成seaborn的格式
import seaborn as sns

from scipy import stats
from scipy.stats import  norm
from sklearn.preprocessing import StandardScaler
from sklearn import preprocessing
from sklearn import linear_model, svm, gaussian_process
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
import warnings
warnings.filterwarnings('ignore')

加载数据

data_train = pd.read_csv("train.csv")

#预览数据头
#print(data_train)

#数据总体信息描述
#print(data_train['SalePrice'].describe())

#画出某一属性,可视化
sns.distplot(data_train['SalePrice'])
plt.show()

在这里插入图片描述
发现拖尾,使用对数画图

sns.distplot(np.log(data_train["SalePrice"]))
plt.show()

在这里插入图片描述
发现呈状态分布

  • 对每个变量画出与房价的点图
#选取LotArea分析
varName = "LotArea"
data_train.plot.scatter(x=varName, y="SalePrice", ylim=(0, 800000))
plt.show()

#选取GrLivArea分析
varName = "GrLivArea"
data_train.plot.scatter(x=varName, y="SalePrice", ylim=(0, 800000))
plt.show()

#选取TotalBsmtSF分析
varName = "TotalBsmtSF"
data_train.plot.scatter(x=varName, y="SalePrice", ylim=(0, 800000))
plt.show()

#选取MiscVal,GarageArea,GarageCars分析
varName = ["MiscVal", "GarageArea", "GarageCars"]
for i in range(len(varName)):
    data_train.plot.scatter(x=varName[i], y="SalePrice", ylim=(0, 800000))
plt.show()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 画出各个变量对房价影响的蜡烛图
#类别特征分析
#选取CentralAir分析
varName = "CentralAir"
fig = sns.boxplot(x=varName, y="SalePrice", data=data_train)
fig.axis(ymin=0, ymax=800000)
plt.show()

#分析OverallQual
varName = "OverallQual"
fig = sns.boxplot(x=varName, y="SalePrice", data=data_train)
fig.axis(ymin=0, ymax=800000)
plt.show()

#选取YearBuilt
varName = "YearBuilt"
plt.subplots(figsize=(30, 15))
fig = sns.boxplot(x=varName, y="SalePrice", data=data_train)
fig.axis(ymin=0, ymax=800000)
# 将x轴的年份垂直显示
plt.xticks(rotation=90)
plt.show()

#选取YearBuilt
varName = "YearBuilt"
data_train.plot.scatter(x=varName, y="SalePrice", ylim=(0, 800000))
plt.show()

#选取Neighborhood
varName = "Neighborhood"
plt.subplots(figsize=(30, 15))
fig = sns.boxplot(x=varName, y="SalePrice", data=data_train)
fig.axis(ymin=0, ymax=800000)
plt.xticks(rotation=90)
plt.show()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 画出各个变量之间的相关性程度热力图
#关系矩阵,判断两个变量的相关性程度
corrmat = data_train.corr()
f, ax = plt.subplots(figsize=(20, 9))
sns.heatmap(corrmat, vmax=0.8, square=True)
plt.show()

在这里插入图片描述
发现以下变量对房价影响较大
OverallQual:总评价
YearBuilt:建造年份
ToatlBsmtSF:地下室面积
1stFlrSF:一楼面积
GrLiveArea:生活区面积?
FullBath:浴室?what。。。到底什么意思,知道的麻烦说一下
TotRmsAbvGrd:总房间数(不包括浴室)
GarageCars:车库可容纳车辆数
GarageArea:车库面积

  • 故选取前十个变量对房价影响较大,画出相关度热力图
#房价关系矩阵
k  = 10 # 关系矩阵中将显示10个特征
cols = corrmat.nlargest(k, 'SalePrice')['SalePrice'].index
cm = np.corrcoef(data_train[cols].values.T)
sns.set(font_scale=1.25)
hm = sns.heatmap(cm, cbar=True, annot=True, square=True, fmt='.2f', annot_kws={'size': 10}, yticklabels=cols.values, xticklabels=cols.values)
plt.show()

在这里插入图片描述

  • 绘画出这十个变量 关系点图
#绘制关系点图
sns.set()
cols = ['SalePrice','OverallQual','GrLivArea', 'GarageCars','TotalBsmtSF', 'FullBath', 'TotRmsAbvGrd', 'YearBuilt']
sns.pairplot(data_train[cols], size = 2.5)
plt.show()

在这里插入图片描述

机器学习方法预测房价

  • 加载数据并预处理划分测试集和训练集
#sklearn机器学习
# 获取数据
cols = ['OverallQual','GrLivArea', 'GarageCars','TotalBsmtSF', 'FullBath', 'TotRmsAbvGrd', 'YearBuilt']
x = data_train[cols].values
y = data_train['SalePrice'].values
x_scaled = preprocessing.StandardScaler().fit_transform(x)
y_scaled = preprocessing.StandardScaler().fit_transform(y.reshape(-1,1))
X_train,X_test, y_train, y_test = train_test_split(x_scaled, y_scaled, test_size=0.33, random_state=42)

分别使用三个训练模型训练并预测,选出一个模型误差值小的

#分类器训练
clfs = {
        'svm':svm.SVR(),
        'RandomForestRegressor':RandomForestRegressor(n_estimators=400),
        'BayesianRidge':linear_model.BayesianRidge()
       }
for clf in clfs:
    try:
        clfs[clf].fit(X_train, y_train)
        y_pred = clfs[clf].predict(X_test)
        print(clf + " cost:" + str(np.sum(y_pred-y_test)/len(y_pred)) )
    except Exception as e:
        print(clf + " Error:")
        print(str(e))

输出结果

svm cost:-18.002439870767585
RandomForestRegressor cost:-2.885446368667191 BayesianRidge cost:-17.191504693239327

故选用RandomForestRegressor 模型

  • 训练模型并保存
#选用随机森林
cols = ['OverallQual','GrLivArea', 'GarageCars','TotalBsmtSF', 'FullBath', 'TotRmsAbvGrd', 'YearBuilt']
x = data_train[cols].values
y = data_train['SalePrice'].values
X_train,X_test, y_train, y_test = train_test_split(x, y, test_size=0.33, random_state=42)

clf = RandomForestRegressor(n_estimators=400)
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
#输出预测值
print(y_pred)

# 保存clf,共下面计算测试集数据使用
# rfr = clf

#误差值
error = sum(abs(y_pred - y_test))/len(y_pred)

  • 加载要预测的数据,并填充一些Null值
#加载之前训练好的模型
# 之前训练的模型
rfr = clf
data_test = pd.read_csv("test.csv")
#判断数据内部是否有Null值,如果有,则改为本属性的均值
print(data_test[cols].isnull().sum())
#查看GarageCars总体描述
print(data_test['GarageCars'].describe())
#TotalBsmtSF总体描述
print(data_test['TotalBsmtSF'].describe())

#填充Null值
#发现GarageCars,GarageArea,TotalBsmtSF有Null值,故用平均值填充
data_test['GarageCars']=data_test['GarageCars'].fillna(data_test['GarageCars'].mean())
data_test['GarageArea']=data_test['GarageArea'].fillna(data_test['GarageArea'].mean())
data_test['TotalBsmtSF']=data_test['TotalBsmtSF'].fillna(data_test['TotalBsmtSF'].mean())
print(data_test[cols].isnull().sum())

  • 预测测试集,并将结果保存
#预测测试集中的值
x = data_test_x.values
y_te_pred = rfr.predict(x)
print(y_te_pred)

print(y_te_pred.shape)
print(x.shape)

#格式化预测出来的房价值
prediction = pd.DataFrame(y_te_pred, columns=['SalePrice'])
#合并
result = pd.concat([ data_test['Id'], prediction], axis=1)
# result = result.drop(resultlt.columns[0], 1)
#result.columns

#保存预测结果
# 保存预测结果
result.to_csv('./Predictions.csv', index=False)

结果还不是很好,还需要改进

发布了72 篇原创文章 · 获赞 3 · 访问量 882

猜你喜欢

转载自blog.csdn.net/weixin_39025679/article/details/104782684