房价预测_房价预测模型 - CSDN

• ## python实现房价预测（一）

万次阅读 多人点赞 2018-09-01 23:01:04
这是一个预测房价的项目，项目来自kaggle的housing。 项目的目的是预测房价，需要从众多可能的影响因子中挑选出最能预测房价的因子来建立模型，用于预测房价。 分析步骤： 1. 理解项目目的，再围绕目的进行分析...
这是一个预测房价的项目，项目来自kaggle的housing。

项目的目的是预测房价，需要从众多可能的影响因子中挑选出最能预测房价的因子来建立模型，用于预测房价。

分析步骤：

1.  理解项目目的，再围绕目的进行分析。本项目的目的根据数据预测房价；

2. 了解数据的分布特征，根据实际项目理解每列数据的意义。在数据分析时，最重要的是要熟悉业务，在业务基础上再分析，事半功倍；

3. 挑选特征。刻画每个特征与目标变量之间的关系，找出最重要的特征；同时，为了避免多重共线性，需剔除掉一个特征与特征之间相关性非常大的特征；

4. 应用交叉验证，对训练集进行建立合适的模型，再在测试集上测试；

5. 最终建立预测房价的模型。

下面是实践部分：

1. 首先查看数据

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.

SalePrice - the property's sale price in dollars. This is the target variable that you're trying to predict.
MSSubClass: The building class
MSZoning: The general zoning classification
LotFrontage: Linear feet of street connected to property
LotArea: Lot size in square feet
Alley: Type of alley access
LotShape: General shape of property
LandContour: Flatness of the property
Utilities: Type of utilities available
LotConfig: Lot configuration
LandSlope: Slope of property
Neighborhood: Physical locations within Ames city limits
Condition2: Proximity to main road or railroad (if a second is present)
BldgType: Type of dwelling
HouseStyle: Style of dwelling
OverallQual: Overall material and finish quality
OverallCond: Overall condition rating
YearBuilt: Original construction date
RoofStyle: Type of roof
RoofMatl: Roof material
Exterior1st: Exterior covering on house
Exterior2nd: Exterior covering on house (if more than one material)
MasVnrType: Masonry veneer type
MasVnrArea: Masonry veneer area in square feet
ExterQual: Exterior material quality
ExterCond: Present condition of the material on the exterior
Foundation: Type of foundation
BsmtQual: Height of the basement
BsmtCond: General condition of the basement
BsmtExposure: Walkout or garden level basement walls
BsmtFinType1: Quality of basement finished area
BsmtFinSF1: Type 1 finished square feet
BsmtFinType2: Quality of second finished area (if present)
BsmtFinSF2: Type 2 finished square feet
BsmtUnfSF: Unfinished square feet of basement area
TotalBsmtSF: Total square feet of basement area
Heating: Type of heating
HeatingQC: Heating quality and condition
CentralAir: Central air conditioning
Electrical: Electrical system
1stFlrSF: First Floor square feet
2ndFlrSF: Second floor square feet
LowQualFinSF: Low quality finished square feet (all floors)
GrLivArea: Above grade (ground) living area square feet
BsmtFullBath: Basement full bathrooms
BsmtHalfBath: Basement half bathrooms
Bedroom: Number of bedrooms above basement level
Kitchen: Number of kitchens
KitchenQual: Kitchen quality
TotRmsAbvGrd: Total rooms above grade (does not include bathrooms)
Functional: Home functionality rating
Fireplaces: Number of fireplaces
FireplaceQu: Fireplace quality
GarageType: Garage location
GarageYrBlt: Year garage was built
GarageFinish: Interior finish of the garage
GarageCars: Size of garage in car capacity
GarageArea: Size of garage in square feet
GarageQual: Garage quality
GarageCond: Garage condition
PavedDrive: Paved driveway
WoodDeckSF: Wood deck area in square feet
OpenPorchSF: Open porch area in square feet
EnclosedPorch: Enclosed porch area in square feet
3SsnPorch: Three season porch area in square feet
ScreenPorch: Screen porch area in square feet
PoolArea: Pool area in square feet
PoolQC: Pool quality
Fence: Fence quality
MiscFeature: Miscellaneous feature not covered in other categories
MiscVal: Value of miscellaneous feature
MoSold: Month Sold
YrSold: Year Sold
SaleType: Type of sale
SaleCondition: Condition of sale
仔细观察每一列特征的含义，以上特征包含建造位置、面积、等级、质量、类型、配套设施、建造时间、出售时间等等。

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline

# 查看数据
# 查看数据集形状
data.shape
# 查看数据集数据类型
data.dtypes


展示部分数据类型，其中包含连续型和离散型数据。

2. 分析目标变量

在分析之前，首先要了解目标，查看目标类型、分布，有无异常值。根据不同的类型选择不同的模型。

[in]: data['SalePrice'].describe()

[out]:

count      1460.000000
mean     180921.195890
std       79442.502883
min       34900.000000
25%      129975.000000
50%      163000.000000
75%      214000.000000
max      755000.000000
Name: SalePrice, dtype: float64

目标变量为连续型，无特别异常值（0或者负数）

再看看目标变量分布：

[in]:sns.distplot(data['SalePrice'])

3. 挑选最佳特征

从80个特征中选出与目标变量SalePrice相关的特征。

a. 针对连续型变量，可以使用“皮尔逊相关系数”找出与目标变量最相关的特征

皮尔逊相关系数是描述两连续性变量线性相关程度的统计量，取值范围[-1,+1]，符号代表相关性正负，数值代表相关性强弱。r=Sxy/(SxSy)

1） 一楼面积

sns.jointplot(x='1stFlrSF',y='SalePrice',data=data)

皮尔逊相关系数0.61，中度正相关

2）房屋面积

sns.jointplot(x='GrLivArea',y='SalePrice',data=data)

皮尔逊相关系数0.71，强正相关

3）泳池面积

sns.jointplot(x='PoolArea',y='SalePrice',data=data)

皮尔逊相关系数0.092，不相关

通过以上数据可以看到，建造面积与销售价格有很强的相关性，而一楼面积相关性相对较低，泳池面积几乎无相关性。

相关性越高代表该特征变化能够带来目标变量的变化，需要注意的是相关性并不代表因果关系，只能说特征对目标的影响较大。

此外，还可以用seaborn里面的线型回归查看拟合直线

sns.lmplot(x='GrLivArea',y='SalePrice',data=data)

b. 针对分类变量，无法使用皮尔逊相关系数，可以通过观察每个分类值上目标变量的变化程度来查看相关性，通常来说，在不同值上数据范围变化较大，两变量相关性较大。

盒须图

1) 房屋材料与质量

sns.boxplot(x='OverallQual',y='SalePrice',data=data)

房屋质量越好，总体来说价格越贵

2）建造年代

sns.boxplot(x='YearBuilt',y='SalePrice',data=data)

房屋建造年代与价格没有明显的相关性

柱状图

使用groupby将价格按照特征分类，再去平均值，使用柱状图展示

grouped = data.groupby('OverallQual')
g1 = grouped['SalePrice'].mean().reset_index('OverallQual')
sns.barplot(x='OverallQual',y='SalePrice',data=g1)

c. 以上两种分析都是针对单个特征与目标变量逐一分析，这种方法非常耗时繁琐，下面介绍一种系统性分析特征与目标变量相关性的方法，通过对数据集整体特征（数值型数据）进行分析，来找出最佳特征。

热力图  sns.heatmap()

首先用计算出两两之间的相关系数data.corr()，再利用热力图显示两两相关性。

%pylab inline
# 设置图幅大小
pylab.rcParams['figure.figsize'] = (15, 10)
# 计算相关系数
corrmatrix = data.corr()
# 绘制热力图，热力图横纵坐标分别是data的index/column,vmax/vmin设置热力图颜色标识上下限，center显示颜色标识中心位置，cmap颜色标识颜色设置
sns.heatmap(corrmatrix,square=True,vmax=1,vmin=-1,center=0.0,cmap='coolwarm')

热力图中，不仅可以看到与SalePrice相关性较大的特征，还可以看到与有两个区域相关性比较集中，一个是TotalBsmtSF与1stFlrSF相关性较高，对目标变量来说，这两个特征具有共线性，还有一个是GarageYrBit/GarageCars/GarageArea这三个特征，在建模时，只需去其中一个作为目标变量的特征即可。

特征较多，且相关性不大的特征可以忽略，选取相关性排前十的特征：

# 取相关性前10的特征
k=10
# data.nlargest(k, 'target')在data中取‘target'列值排前十的行
# cols为排前十的行的index,在本例中即为与’SalePrice‘相关性最大的前十个特征名
cols = corrmatrix.nlargest(k,'SalePrice')['SalePrice'].index
cm = np.corrcoef(data[cols].values.T)
#data[cols].values.T
#设置坐标轴字体大小
sns.set(font_scale=1.25)
# sns.heatmap() cbar是否显示颜色条，默认是；cmap显示颜色；annot是否显示每个值，默认不显示；
# square是否正方形方框，默认为False,fmt当显示annotate时annot的格式；annot_kws为annot设置格式
# yticklabels为Y轴刻度标签值，xticklabels为X轴刻度标签值
hm = sns.heatmap(cm,cmap='RdPu',annot=True,square=True,fmt='.2f',annot_kws={'size':10},yticklabels=cols.values,xticklabels=cols.values)

# 上例提供了求相关系数另一种方法，也可以直接用data.corr(),更方便
cm1 = data[cols].corr()
hm2 = sns.heatmap(cm1,square=True,annot=True,cmap='RdPu',fmt='.2f',annot_kws={'size':10})


由上图可以看出：

1. 'OverallQual', 'GrLivArea'这两个变量与'SalePrice'有很强的线性关系;

2. 'GarageCars', 'GarageArea'与'SalePrice'也有很强的线性关系，但'GarageCars', 'GarageArea'相关性0.88，有很强的共线性，只取其一即可，取与目标变量关系更强的'GarageCars'；

3. 同样地，'TotalBsmtSF', '1stFlrSF'也有很强的共线性，只取其一即可，取'TotalBsmtSF'；

4. 因此，选取的特征有：'OverallQual', 'GrLivArea', 'GarageCars', 'TotalBsmtSF', 'FullBath', 'TotRmsAbvGrd', 'YearBuilt'。

sns.pairplot()

cols1 = ['SalePrice', 'OverallQual', 'GrLivArea', 'GarageCars','TotalBsmtSF', 'FullBath', 'TotRmsAbvGrd', 'YearBuilt']
sns.pairplot(data[cols1],size=2.5)

不管是离散型还是连续型数据，只要是数值型数据，sns.heatmap()都能找出两两特征之间的相关性，但要说明的是，这里的离散型数值型特征在处理时被当成连续型特征计算，因此，离散型数值特征的排序会影响相关性结果。

4. 数据处理

a. Missing value

# isnull() boolean, isnull().sum()统计所有缺失值的个数
# isnull().count()统计所有项个数（包括缺失值和非缺失值），.count()统计所有非缺失值个数
total = data.isnull().sum().sort_values(ascending=False)
percent = (data.isnull().sum()/data.isnull().count()).sort_values(ascending=False)
# pd.concat() axis=0 index,axis=1 column, keys列名
missing_data = pd.concat([total,percent],axis=1,keys = ['Total','Percent'])
missing_data.head(20)

缺失值超过80%的有特征“PoolQC”, "MiscFeature", "Alley", "Fence"，可以认定这些特征无效，可以剔除。

# 处理缺失值，将含缺失值的整列剔除
data1 = data.drop(missing_data[missing_data['Total']>1].index,axis=1)
# 由于特征Electrical只有一个缺失值，故只需删除该行即可
data2 = data1.drop(data1.loc[data1['Electrical'].isnull()].index)
# 检查缺失值数量
data2.isnull().sum().max()

0

5. 建立模型

首先划分数据集，使用sklearn里面的train_test_split()可以将数据集划分为训练集和测试集。

feature_data = data2.drop(['SalePrice'],axis=1)
target_data = data2['SalePrice']

# 将数据集划分为训练集和测试集
from sklearn.model_selection import train_test_split
X_train,X_test,y_train, y_test = train_test_split(feature_data, target_data, test_size=0.3)

a. 线性回归模型

线性回归模型是最简单的模型，实际应用中已经很少用到了，作为基础知识练习

from statsmodels.formula.api import ols
from statsmodels.sandbox.regression.predstd import wls_prediction_std

df_train = pd.concat([X_train,y_train],axis=1)
# ols("target~feature+C(feature)", data=data
# C(feature)表示这个特征为分类特征category
lr_model = ols("SalePrice~C(OverallQual)+GrLivArea+C(GarageCars)+TotalBsmtSF+C(FullBath)+YearBuilt",data=df_train).fit()
print(lr_model.summary())

# 预测测试集
lr_model.predict(X_test)

判定系数R2表示，房价“SalePrice”的变异性的79%，能用该多元线性回归方程解释；

在该多元线性回归方程中，也有很多特征的P_value大于0.05，说明这些特征对y值影响非常小，可以剔除。

# prstd为标准方差，iv_l为置信区间下限，iv_u为置信区间上限
prstd, iv_l, iv_u = wls_prediction_std(lr_model, alpha = 0.05)
# lr_model.predict()为训练集的预测值
predict_low_upper = pd.DataFrame([lr_model.predict(),iv_l, iv_u],index=['PredictSalePrice','iv_l','iv_u']).T
predict_low_upper.plot(kind='hist',alpha=0.4)

除了得到模型外，还可以看看模型预测值是否在置信区间之内：wls_prediction_std(model, alpha=0.05)可以得到显著性水平为0.05的置信区间。由以上直方图可以看到预测值均在置信区间内。

虽然线性回归模型能解释79%的房价，但仍然是比较简易基础的模型，接下来会使用更高级的模型对房价进行预测。


展开全文
• ## 房价预测（完整版）

万次阅读 多人点赞 2018-06-04 15:01:57
题目描述：依据一个房子的全方位信息，包括面积，地段，环境，等等预测出房子的价格 题目详情 题目解答： 首先进行数据的预处理； #数据的读取 import numpy as np import pandas as pd #一般来说源数据的index...

题目描述：依据一个房子的全方位信息，包括面积，地段，环境，等等预测出房子的价格
题目详情
题目解答：
首先进行数据的预处理；

#数据的读取
import numpy as np
import pandas as pd
#一般来说源数据的index那一栏没什么用，我们可以用来作为我们pandas dataframe的index。这样之后要是检索起来也省事儿。
train_df.head()

结合数据描述以及以上输出结果可以大致得出哪些数据需要人为处理一下，题目分别给出了训练集和测试集，这里我们为了方便统一处理，先将二者数据合并，等所有的需要的预处理进行完之后，我们再把他们分隔开。需注意的是SalePrice作为我们的训练目标，只会出现在训练集中，不会在测试集中（要不然你测试什么？）。所以，我们先把SalePrice这一列给拿出来，不让它碍事儿。

prices = pd.DataFrame({"price":train_df["SalePrice"], "log(price + 1)":np.log1p(train_df["SalePrice"])})
prices.hist()

可见，price本身并不平滑。为了我们分类器的学习更加准确，我们会首先把price给“平滑化”（正态化）这里我们使用log1p, 也就是 log(x+1)，避免了复值的问题。
如果我们这里把数据都给平滑化了，那么最后算结果的时候，要记得把预测到的平滑数据给变回去。

#将训练目标单独拿出
#y_train则是SalePrice那一列
y_train = np.log1p(train_df.pop('SalePrice'))
#把剩下的部分合并起来
all_df = pd.concat((train_df, test_df), axis=0)
all_df.shape
y_train.head()

下面进行变量转化，把不方便处理或不一致的数据给统一了，首先，我们注意到，MSSubClass 的值其实应该是一个分类型的，但是Pandas是不会懂这些事儿的。使用时，这类数字符号会被默认记成数字。我们需要把它变回成string

all_df['MSSubClass'].dtypes
all_df['MSSubClass'] = all_df['MSSubClass'].astype(str)
#变成str以后，做个统计
all_df['MSSubClass'].value_counts()

把分类变量转变成数值表达形式时，要注意，数字本身有大小的含义，所以乱用数字会给之后的模型学习带来麻烦。于是我们可以用One-Hot的方法来表达。
pandas自带的get_dummies方法，可以帮你一键做到One-Hot（one-Hot讲解）。

#MSSubClass被分成了12个column，每一个代表一个类。是就是1，不是就是0。
pd.get_dummies(all_df['MSSubClass'], prefix='MSSubClass').head()

#同理，我们把所有的类数据，都给One-Hot了
all_dummy_df = pd.get_dummies(all_df)
all_dummy_df.head()

下面开始处理数值型变量，比如缺失值的处理等

all_dummy_df.isnull().sum().sort_values(ascending=False).head(10)

可以看到，缺失最多的列是LotFrontage处理这些缺失的信息，得靠好好审题。一般来说，数据集的描述里会写的很清楚，这些缺失都代表着什么。在这里，我们用平均值来填满这些空缺。

#计算平均值
mean_cols = all_dummy_df.mean()
mean_cols.head(10)

#用平均值填补缺失值
all_dummy_df = all_dummy_df.fillna(mean_cols)
#查看填补后是否还有缺失值
all_dummy_df.isnull().sum()#.sum()

接着标准化数值型数据，这一步并不是必要，但是得看你想要用的分类器是什么。一般来说，regression的分类器都比较傲娇，最好是把源数据给放在一个标准分布内。不要让数据间的差距太大。这里，我们当然不需要把One-Hot的那些0/1数据给标准化。我们的目标应该是那些本来就是数值型的数据：

#查看哪些数据是数值型的
numeric_cols = all_df.columns[all_df.dtypes != 'object']
numeric_cols

计算标准分布：(X-X’)/s让我们的数据点更平滑，更便于计算。

numeric_col_means = all_dummy_df.loc[:, numeric_cols].mean()
numeric_col_std = all_dummy_df.loc[:, numeric_cols].std()
all_dummy_df.loc[:, numeric_cols] = (all_dummy_df.loc[:, numeric_cols] - numeric_col_means) / numeric_col_std

处理完数据后把数据分回训练集和测试集，开始建模。

#将数据分回训练集和测试集
dummy_train_df = all_dummy_df.loc[train_df.index]
dummy_test_df = all_dummy_df.loc[test_df.index]
#查看训练集和测试集的维度
dummy_train_df.shape, dummy_test_df.shape
#首先选用Ridge Regression模型观察效果
from sklearn.linear_model import Ridge
from sklearn.model_selection import cross_val_score
#把数据框形式转化为numpy Array形式，跟sklearn更配
X_train = dummy_train_df.values
X_test = dummy_test_df.values
#用sklearn自带的cross validation进行模型调参
alphas = np.logspace(-3, 2, 50)
test_scores = []
for alpha in alphas:
clf = Ridge(alpha)
test_score = np.sqrt(-cross_val_score(clf, X_train, y_train, cv=10, scoring='neg_mean_squared_error'))
test_scores.append(np.mean(test_score))
#调参结果可视化
import matplotlib.pyplot as plt
%matplotlib inline
plt.plot(alphas, test_scores)
plt.title("Alpha vs CV Error");

可以看到，alpha在10-20之间时误差达到最小值0.135左右，下面用RF模型，看得出的结果怎么样

from sklearn.ensemble import RandomForestRegressor
max_features = [.1, .3, .5, .7, .9, .99]
test_scores = []
for max_feat in max_features:
clf = RandomForestRegressor(n_estimators=200, max_features=max_feat)
test_score = np.sqrt(-cross_val_score(clf, X_train, y_train, cv=5, scoring='neg_mean_squared_error'))
test_scores.append(np.mean(test_score))
plt.plot(max_features, test_scores)
plt.title("Max Features vs CV Error");

可以看到，用RF模型，误差达到0.137左右。
Bagging把很多的小分类器放在一起，下面我们将小分类器设为Ridge Regression Sklearn已经直接提供了这套构架，我们直接调用就行：

#在这里取alpha=15
from sklearn.linear_model import Ridge
ridge = Ridge(15)
from sklearn.ensemble import BaggingRegressor
from sklearn.model_selection import cross_val_score
#在这里，我们用CV结果来测试不同的分类器个数对最后结果的影响。
#注意，我们在用Bagging的时候，要把它的函数base_estimator里填上小分类器（ridge）
params = [1, 10, 15, 20, 25, 30, 40]
test_scores = []
for param in params:
clf = BaggingRegressor(n_estimators=param, base_estimator=ridge)
test_score = np.sqrt(-cross_val_score(clf, X_train, y_train, cv=10, scoring='neg_mean_squared_error'))
test_scores.append(np.mean(test_score))
import matplotlib.pyplot as plt
%matplotlib inline
plt.plot(params, test_scores)
plt.title("n_estimator vs CV Error");

可以得到，当小分类器个数为20时，误差低于0.132，优于Ridge Regression模型的出的0.135
Boosting比Bagging理论上更高级点，下一个分类器把上一个分类器误分的样本加上更高的权重，这样下一个分类器就能在这个部分学得更加“深刻”。

from sklearn.ensemble import AdaBoostRegressor
params = [10, 15, 20, 25, 30, 35, 40, 45, 50]
test_scores = []
for param in params:
clf = BaggingRegressor(n_estimators=param, base_estimator=ridge)
test_score = np.sqrt(-cross_val_score(clf, X_train, y_train, cv=10, scoring='neg_mean_squared_error'))
test_scores.append(np.mean(test_score))
plt.plot(params, test_scores)
plt.title("n_estimator vs CV Error");

最后，我们来看看XGBoost，这依旧是Boosting框架的模型

from xgboost import XGBRegressor
params = [1,2,3,4,5,6]
test_scores = []
for param in params:
clf = XGBRegressor(max_depth=param)
test_score = np.sqrt(-cross_val_score(clf, X_train, y_train, cv=10, scoring='neg_mean_squared_error'))
test_scores.append(np.mean(test_score))
import matplotlib.pyplot as plt
%matplotlib inline
plt.plot(params, test_scores)
plt.title("max_depth vs CV Error");

令人吃惊的是，深度为5的时候，错误率缩小到0.127
展开全文
• ## Kaggle--房价预测

千次阅读 2018-07-07 21:27:55
房价预测 目录 目录 一、认识数据 二、定性分析 2.1 属性的意义 2.2 属性分析 三、缺失值处理 3.1 缺失值举例 3.2 缺失值统计 3.3 填充缺失值 3.4 格式转换 四、特征分析 4.1 房价分析 4.2 房价属性的...

房价预测

目录

一、认识数据
二、定性分析
2.1 属性的意义
2.2 属性分析

三、缺失值处理
3.1 缺失值举例
3.2 缺失值统计
3.3 填充缺失值
3.4 格式转换

四、特征分析
4.1 房价分析
4.2 房价属性的关系
4.3 相关性
4.5 特征选取

五、回归前的准备
5.1 特征向量化
5.2 测试集预处理

六、回归
6.1梯度提升回归
6.2 提交尝试
6.3 改进再提交

七、总结与展望
八、参考文献

一、认识数据

House Prices数据集分为train（即训练）数据和test（即测试）数据，其中，训练集含有1460个样本，80个属性（包括序号），一个标签（SalePrice，即房价）；测试集含有1459个样本，80个属性。
需要做的工作：根据测试集的属性预测每个样本的房价。

图1

二、定性分析

2.1 属性的意义

SalePrice   以美元出售的房产价格。
MSSubClass  建筑类
MSZoning    城市总体规划分区
LotFrontage 连接物业的街道线
LotArea: Lot size in square feet    方块大小
Street  道路入口类型
Alley   巷类型
LotShape    地产的外形
LandContour 地产的扁平化
Utilities   地产的公用事业类型
LotConfig   地产配置
LandSlope   地产的坡
Neighborhood    城市范围内的物理位置
Condition1  接近主干道或铁路
Condition2  接近主路或铁路
BldgType    住宅类型
HouseStyle  居家风格
OverallQual 整体质量和表面质量
OverallCond 总体状态额定值
YearBuilt   原施工日期
RoofStyle   屋顶类型
RoofMatl    屋顶材料
Exterior1st 房屋外墙
Exterior2nd 外部第二层：房屋外部覆盖物
MasVnrType  圬工单板型
MasVnrArea  砌体单板覆盖面积
ExterQual:  外观材质
ExterCond   外墙材料的现状
Foundation  地基类型
BsmtQual    地下室的高度
BsmtCond    地下室概况
BsmtExposure:   走道或花园式地下室墙
BsmtFinType1    地下室竣工面积质量
BsmtFinSF1  1型成品面积
BsmtFinType2    第二成品区域的质量（如果存在）
BsmtFinSF2  2型成品面积
BsmtUnfSF   地下室面积
TotalBsmtSF 地下室面积总计面积
Heating 暖气方式
HeatingQC   暖气质量与条件
CentralAir  空调
Electrical  电气系统
1stFlrSF    一楼面积
2ndFlrSF    二楼面积
LowQualFinSF    低质量完工面积（所有楼层）
GrLivArea   高档（地面）居住面积
BsmtFullBath    地下室全浴室
BsmtHalfBath    地下室半浴室
FullBath    高档浴室
HalfBath    半日以上洗澡浴室
Bedroom 地下室层以上的卧室数
Kitchen 厨房数量
KitchenQual 厨房品质
TotRmsAbvGrd    总房间（不包括浴室）
Functional  家庭功能评级
Fireplaces  壁炉数
FireplaceQu 壁炉质量
GarageType  车库位置
GarageYrBlt 车库建成年
GarageFinish    车库的内饰
GarageCars  车库容量大小
GarageArea  车库大小
GarageQual  车库质量
GarageCond  车库状况
PavedDrive  铺好的车道
WoodDeckSF  木制甲板面积
OpenPorchSF 外部走廊面积
EnclosedPorch   闭走廊面积
3SsnPorch:  三季走廊面积
ScreenPorch 屏风走廊面积
PoolArea    泳池面积
PoolQC  泳池的质量
Fence   围栏质量
MiscFeature 其他类别的杂项特征
MiscVal 杂项价值
MoSold  月售出
YrSold  年销售
SaleType    销售类型
SaleCondition   销售条件

2.2 属性分析

可以看出，标签为房价，而对于79个属性主要分为几分方面：
（1）房子地理位置：
MSSubClass、MSZoning、LotFrontage、LotArea、Street、Alley、LotShape、LandContour、Utilities、LotConfig、LandSlope、Neighborhood、Condition1、Condition2
（2）房子风格：
BldgType、HouseStyle、OverallQual、OverallCond
（3）房子装修：
ExterCond
（4）地下室：
Foundation、BsmtQual、BsmtCond、BsmtExposure:、BsmtFinType1、BsmtFinSF1、BsmtFinType2、BsmtFinSF2、BsmtUnfSF、TotalBsmtSF
（5）冷暖气：
Heating、HeatingQC、CentralAir、Electrical
（6）居住面积：
1stFlrSF、2ndFlrSF、LowQualFinSF、GrLivArea
（7）功能房间：
BsmtFullBath、BsmtHalfBath、FullBath、HalfBath、Bedroom、Kitchen、KitchenQual、TotRmsAbvGrd、Functional
（8）车库：
GarageType、GarageYrBlt、GarageFinish、GarageCars、GarageArea、GarageQual、GarageCond、PavedDrive
（9）其他面积：
WoodDeckSF、OpenPorchSF、EnclosedPorch、3SsnPorch:、ScreenPorch、PoolArea
（10）销售：
MoSold、YrSold、SaleType、SaleCondition
（11）其他：
Fireplaces、FireplaceQu、PoolQC、Fence、MiscFeature、MiscVal

假如数据真实可靠，则从实际情况考虑，对于一个房子的价格，最重要的属性首先应该有：地理位置、面积、地下室、冷暖气、车库、房子质量，还有会影响到房价的有：销售条件如时间和方式。所以先可以着重讨论这些方面的属性。

三、缺失值处理

3.1 缺失值举例

图中NA就是缺失值：

图2

3.2 缺失值统计

训练集数据缺失情况，  和它们对应的意义为：

图3

3.3 填充缺失值

缺失数据的变量有很多，处理情况可以分为如下几类：
（1）缺失多
直接数据集中剔除哪些存在大量缺失值的变量 缺失量比较多的PoolQC、MiscFeature、Alley、Fence、FireplaceQu是由于房子没有泳池、特殊的设施、旁边的小巷、篱笆、壁炉等设施。 由于缺失量比较多，缺失率超过40%，我们直接移除这几个变量。

（2）车库的属性
由于有些房子没有车库，造成车库相关的属性缺失，对于这种情况，我们有missing填充，同时对于车库建造时间的缺失，我们用1900填充，表示车库是年久的，使其变得不重要。

（3）与装修有关

有些房子重装修过，但是有些房子是没重装修过的，所有有关的属性可能确实。这是使用missing填充装修情况，用0填充装修面积。

（4）其它确实较少的属性
由于Electrical等属性缺失较少，可以使用众数填充：

3.4 格式转换

为了使得特征分析顺利进行，首先对字符串型的属性转换到数值型，其中，字符型的属性为：

转换的规则是：对于字符型属性，按照各个类型的属性的不同取值时房价的均值排高低，按此顺序从低往高，给属性的不同取值赋予1,2,3,4……，使得其变成数值型。

经过转换后的属性全部为数值型，这时有利于进行分析。

四、特征分析

4.1 房价分析

首先对房价进行分析，画出房价的分布图为：

图4

从图中可以看出关于房价分布图有几个特点：
（1）偏离正态分布
（2）有明显的正偏态
（3）有峰值
进一步求得
偏度: 1.882876
峰度: 6.536282

我们可以知道，在数据中房价主要集中在区间[100000,300000]中，而有关小于100000,和大于300000的房价是偏向异常数据，在进一步考虑时，应该适当合理区分这些数据。

4.2 房价属性的关系

在此先分析房价与属性的关系，其中数值型的属性有，字符型的在上面已展示。

在定性前面分析知，面积等属性与房价是有关系的，下面将分析一下它们的关系，部分情况如图所示：

图5

从图中还是很明显地看出， “GrLivArea”和“TotalBsmtSF”似乎与“SalePrice”是线性相关的。这两种关系都是正的，这意味着当一个变量增加时，另一个变量也会增加。 “OverallQual”和“YearBuilt”似乎也与“SalePrice”有关。这种关系似乎在“Overallqual”的情况下更加强烈，在这种情况下，箱型图显示了销售价格是如何随着整体质量而增长的。
相同的情况分析其它属性得到与房价近似正相关关系的属性有：

4.3 相关性

首先进行对数值型的属性进行相关系数分析，期待发现它们之间的相关性。

图6

这个热图是快速浏览特征与价格关系的最好方法。（颜色越深，对应的像个特征的相关性越大）
有两个红色的方块引起了我的注意。第一个是“TotalBsmtSF”和“1stFlrSF”变量，第二个是“GarageX”变量。这两种情况都显示了这些变量之间的相关性有多大。实际上，这种相关性是如此强烈，以至于它可以表明多线性的情况。如果我们考虑这些变量，我们可以得出结论，它们给出的信息几乎是相同的，所以多细胞性确实发生了。热图很好地发现了这种情况，在特征选择的主导问题中，像我们这样的问题，它们是必不可少的工具。
另一件引起我注意的事情是“SalePrice”的相关性。我们可以看到我们著名的“GrLivArea”，“TotalBsmtSF”，以及“OverallQual”与其具有很大相关性。但我们也可以看到许多其他的变量的颜色也很深，这些变量应该被考虑进去。这就是我们接下来要做的。
现在有上面热点图选择与SalePrice 相关性最大的9个特征，进一步分析它们的相关性。

图7

这几个属性之间的信息是否互相包含？或者是，它们之间是否存在线性性？若存在，则可知只需要选取某些属性，就可以代表所有属性，而不必讲所有属性都考虑。

图8

从图中可以看出，确实有些属性之间信息重叠，如GrLivArea 和OverallQual之间就存在正相关性，还有GrLivArea和TotalBsmtSF之间也存在正相关性，OverallQual和TotalBsmtSF存在较弱的正相关性。定性分析可知，地下室面积TotalBsmtSF与居住面积当然有关系，除去没有地下室的极少数房子，其它房子地下室面积大，伴随着房子面积大，反过来也成立。

进一步采用皮尔逊相关分析法对所有属性和房价进行分析：

图9

可以清楚地看出与房价高度相关的属性有：

4.5 特征选取

根据以上讨论，去掉部分互相相关性强的属性，选择作为房价分析的特征有：

五、回归前的准备

5.1 特征向量化

首先采用DictVectorizer进行特征向量化，目的是为了数据归一化（使特征数据方差为1，均值为0）。

5.2 测试集预处理

前面的数据预处理只是对训练集进行，对于测试集，其数据缺失情况如下：

图10

对于选取的属性进行数据预处理，使用均值或众数进行填充缺失值，步骤和训练集的一样。

六、回归

6.1梯度提升回归

现在训练集的选取的属性和标签准备就位，测试集的选取的属性也预处理完毕，可以进行测试集的回归预测了。

6.2 提交尝试

再对输出结果转换为提交要求的格式：

评分标准是均方根误差（RMSE），即是：

提交结果为：0.14922
排名：2497/4989 （50%）

图11

6.3 改进再提交

改进的想法由房价的分布产生，房价分布图为：

图12

根据前面讨论可知，在数据中房价主要集中在区间[100000,300000]中，而有关小于100000,和大于300000的房价是偏向异常数据，在进一步考虑时，应该适当合理区分这些数据。
所以，在此将数据按照房价的大小分为两部分。由于测试集中是没有房价的，在这里想到了GrLivArea属性与房价高度正相关，而且在前面讨论中由于属性间信息重叠，不考虑GrLivArea作为分析房价的特征。
一个很自然的想法是，既然GrLivArea与房价高度正相关，就以GrLivArea作为分隔的属性，将数据分为两部分。经分析GrLivArea的取值，以GrLivArea中值大于等于2500的分为一类，小于2500的分为一类。
现在有4部分数据集：
（1）训练集中GrLivArea大于等于2500的数据集；
（2）训练集中GrLivArea小于2500的数据集；
（3）测试集中GrLivArea大于等于2500的数据集；
（4）测试集中GrLivArea小于2500的数据集；

进行再次回归：
利用上面（1）中数据对（3）进行回归。利用（2）中数据对（4）进行回归。
再次提交得分为：0.14438
排名：2250/4989 （46%）

图13

七、总结与展望

（1）房价预测这个题目看似简单，实质上很有难度，主要是属性很多，而且缺失值也很多，数据预处理有难度。
（2）本文进行数据预处理考虑还简单，可以继续考虑属性间的线性关系程度，以及属性间合并，或属性分拆等。
（3）对于结果，我们还是满意的，经过一番尝试后，排名为45%。若要继续提升，一个方向是将数据集继续分类，分为三类或更多。

八、参考文献

[1]周志华.机器学习[M].北京：清华大学出版社，2016.
[2]Peter Harrington.机器学习实战[M].北京：人民邮电出版社，2013.
[3]韩家炜等.数据挖掘概念与技术[M].北京：机械工业出版社，2012.
[4] House Prices: Advanced Regression Techniques,
https://blog.csdn.net/ns2250225/article/details/72626155
[5] Kaggle房价预测：数据预处理——练习,
https://blog.csdn.net/qilixuening/article/details/75153131
展开全文
• 本资源是基于python实现的Boston Housing 数据集房价预测回归问题，调用了sklearn中5种回归算法对房价进行预测。
• 文章目录机器学习简介小例简单定义机器学习的类别房屋预测问题实战 机器学习简介 小例 先来简单举个例子吧！假如一家公司1月的利润为50万，然后每月增长5%，问其9月利润是多少。按照传统算法，我们知道了该公司1月的...
文章目录机器学习简介小例简单定义机器学习的类别房屋预测问题实战
机器学习简介
小例
先来简单举个例子吧！假如一家公司1月的利润为50万，然后每月增长5%，问其9月利润是多少。按照传统算法，我们知道了该公司1月的利润，知道了月增长率，就可以根据公式计算出相应的结果，而机器学习与传统算法不同的是机器学习是把月份、利润这些数据给到计算机，然后由计算机自动去求解一个函数关系进而求得结果。
传统算法：
1月利润+公式→计算机→结果
机器学习：
前几个月的月份+每月对应的利润→计算机→F（x）（计算机求得的函数关系）→结果
简单定义
然后来看看机器学习的一个简单定义吧~
机器学习是一种实现人工智能的方法
从数据中寻找规律、建立关系，然后根据建立的关系去解决问题
从数据中学习从而实现自我优化与升级
本文就不做过多介绍了，想深入了解的小伙伴可以去看看其他博主的博客哈。
机器学习的类别
1.监督学习：在已有的数据集中，训练数据包括正确结果，知道输入数据与输出结果的关系，并可以根据这种关系建立一个关系模型，在获得新数据后，就可以根据这种关系输出对应结果。
2.无监督学习：训练数据不包括正确结果，让计算机自己去数据中寻找规律。
3.半监督学习：训练数据包含少量结果，可以理解为介于监督学习和无监督学习之间。
4.强化学习：根据每次结果收获的奖惩进行学习，实现优化。就比如让机器人去做一件事，做得好就加5分，做的差就减5分，然后按照第一种方式做事获得的分比第二种方式高，那么机器人就知道第一种方式更好了。按照这种奖惩方式，程序就可以逐步寻找获得高分的方法了。
房屋预测问题实战
基于usa_housing_price.csv数据，以人均收入、房屋年龄、房间数量、区域人口、房屋面积作为输入变量，来预测房屋价格。
好了话不多说，上代码！
这里的csv文件是提前下载好的
#加载数据
import pandas as pd
import numpy as np

预览结果：

再来看一下5个输入变量对应的散点图
%matplotlib inline
from matplotlib import pyplot as plt #导入相关库
fig = plt.figure(figsize=(15,12)) #这里是定义画布大小
fig1 =plt.subplot(231) #231是指两行三列的第一个图，下面的232是指两行三列的第二个图，依次类推
plt.scatter(data.loc[:,'Avg. Area Income'],data.loc[:,'Price']) #获取数据，画出一个散点图
plt.title('Price VS Income') #散点图的名称

fig2 =plt.subplot(232)
plt.scatter(data.loc[:,'Avg. Area House Age'],data.loc[:,'Price'])
plt.title('Price VS House Age')

fig3 =plt.subplot(233)
plt.scatter(data.loc[:,'Avg. Area Number of Rooms'],data.loc[:,'Price'])
plt.title('Price VS Number of Rooms')

fig4 =plt.subplot(234)
plt.scatter(data.loc[:,'Area Population'],data.loc[:,'Price'])
plt.title('Price VS Area Population')

fig5 =plt.subplot(235)
plt.scatter(data.loc[:,'size'],data.loc[:,'Price'])
plt.title('Price VS size')
plt.show() #展示散点图


注意左上角的1e6是代表10的6次方，即2.5所代表值是2500000。
#定义输入变量X_multi
X_multi = data.drop(['Price'],axis=1) #去掉price所在列，因为有5个输入变量，输出结果只有1个，所以去掉price
y = data.loc[:,'Price']
X_multi

预览

可以看到这些数据是5000行5列的
from sklearn.linear_model import LinearRegression #导入相关库
LR_multi = LinearRegression()#建立模型
LR_multi.fit(X_multi,y) #训练模型

这里模型已经训练好了：

#模型预测
y_predict_multi = LR_multi.predict(X_multi)
print(y_predict_multi)

预测结果：

#模型评估
from sklearn.metrics import mean_squared_error,r2_score
mean_squared_error_multi = mean_squared_error(y,y_predict_multi)
r2_score_multi = r2_score(y,y_predict_multi)
print(mean_squared_error_multi,r2_score_multi)

评估结果：

r2越接近1越好，这里达到0.91，模型还算不错
#图形评估
fig6 = plt.figure(figsize=(9,6))
plt.scatter(y,y_predict_multi)


这里y值和y的预测值接近一条45度的直线，可以看出差别不大
X_test = [66000,3,6,20000,150]
X_test = np.array(X_test).reshape(1,-1) #将输入数据转化为数组
print(X_test)

y_test_predict = LR_multi.predict(X_test)
print(y_test_predict)


自己输入一组数据，可以看到预测结果为114万多一点
房价文件已补
链接
提取码：wnkc
以上内容是博主通过学习Flare Zhao老师课程后的一个学习笔记，然后博主也是刚刚学习机器学习不久，有诸多不足的地方还请大家批评指正！ thanks~


展开全文
• 显然，目的肯定是根据现有的数据，来对房价进行预测了，本数据变量较多，这里不再一一叙述，官网下载的数据又对变量进行描述。 首先导入基本的库 1 import numpy as np 2 import pandas as pd 接下来导入...
• ## [实践]房价预测

千次阅读 2017-12-01 00:33:22
回归学习器房价预测实践
• ## 房价预测模型

千次阅读 2019-06-17 09:11:59
房价预测模型的介绍 使用TensorFlow训练模型的工作流
• ## kaggle_房价预测

万次阅读 多人点赞 2018-02-23 11:00:01
本文是博主基于之前练手Kaggle上泰坦尼克的入门分析而做的个人总结此案例是读者经过研究多个Kaggle上大神的kernel经验，加上个人的理解，再加入百分之一的运气得到 的结果此案例的亮点在于特征工程部分，对于变量的...
• ## 线性回归预测房价

千次阅读 2019-10-31 09:34:36
• 波斯顿房价预测模型 残差平方和找到最好的拟合直线 RSS train_data,test_data = boston.random_split(.8,seed = 0) 内置函数linear创建一个线性回归模型（用一种特定的算法牛顿迭代法）graphlab create会自动的...
• 简介 本例出自《Python 深度学习》，自己做了一个简单的总结归纳。 ... 代码 加载数据集 注意：第一次运行时会下载数据集，速度较慢，请耐心等候。 from keras.datasets import boston_housing ...(train_data, train_...
• 一、kaggle简介 kaggle主要为开发商和数据科学家提供举办机器学习竞赛、托管数据库、编写和分享代码的平台，kaggle已经吸引了80万名数据科学家的关注。...二、房价预测 项目地址https://www.kaggle.com/c/house-pr
• ML之回归预测：利用13种机器学习算法对Boston(波士顿房价)数据集【13+1,506】进行回归预测(房价预测)+预测新数据得分 导读 本文章基于前边的一篇文章，对13种机器学习的回归模型性能比较以后，然后利用各个模型对...
• ML之xgboost：利用xgboost算法对Boston(波士顿房价)数据集【特征列分段→独热编码】进行回归预测(房价预测)+预测新数据得分 导读 对Boston(波士顿房价)数据集进行特征工程，分别使用特征列分段技术、独热编码技术...
• 采用线性模型实现房价预测； 案例参照视频课程https://edu.csdn.net/course/detail/7389实现； 代码下载： 链接：https://pan.baidu.com/s/1W9FmC61NK908gm4A75xJQA 提取码：2gm7 数据下载： 链接：...
• 本次测试是对一个房屋售价的数据集进行探索，并找出与售价之间有相关性的特征值建立回归模型，来通过此特征值来预测房价。  下面，开始导入数据集： import pandas as pd df = pd.read_csv("house_data.csv") # ...
• 一、导入库和数据 from sklearn.datasets import load_boston import matplotlib.pyplot as plt dataset = load_boston() ...y_data = dataset.target # 导入目标值（房价） name_data = dataset.featu...
• Tensorflow多变量线性回归（房价预测） 本文章为本人自己写的jupyter笔记，图片显示有一点问题（下面的每个图片都变成同一张图片），所以仅供预览。 需要下载ipynb文件的朋友可以关注我并找到我上传的资源。 ...
• 志强预测中国房价到2020年以后才可能会下降 焦点房地产网 house.focus.cn 2007年09月05日07:17 千龙网
...