主要涉及内容:数据可视化 、机器学习建模分析
使用工具:python精细绘图方法库matplotlib、python机器学习方法库scikit-learn
原理:
可视化:由于房屋条件数据集的特殊性,考虑将所有对与房屋价格具有重要影响的房屋条件进行直接的可视化分析,略过描述性统计分析部分,将数据之间的关联更加直接的展示出来。
机器学习(线性回归):回归分析是一种预测性的建模分析技术,它通过样本数据学习目标变量和自 变量之间的因果关系,建立数学表示模型。基于新的自变量,此模型可预测相应 的目标变量。回归问题将 y 称为目标变量,{X1,X2,…,Xd}称为自变量,d 为 自变量的维度。回归分析的目标就是利用历史数据找出它们之间的映射关系,然 后预测房屋价格。 𝑦 = 𝑓(𝑥),𝑓(𝑥) = 𝜔1 ∗ 𝑥1 + 𝜔2 ∗ 𝑥2 + ⋯ + 𝜔𝑑 ∗ 𝑥𝑑 + 𝑏 回归模型的学习是一个有监督学习的过程。基于给定的数据集,线性回归分 析学习一个线性模型,即获得模型参数{𝜔1,𝜔2, … ,𝜔𝑑, 𝑏}(通常称𝜔𝑖为回归 系数,其中,i=1,2,…,d,b 为截距),使得模型在数据集上预测的误差最小。
数据集样式:(某地区不同住房条件对比与房屋价格预测 housing.csv)
实验目的:将“价格price”作为因变量,其余数据作为自变量。通过数据可视化观察各数据分布特征和关联性;通过线性回归模型训练尝试进行预测。
可视化代码:
import matplotlib.pyplot as plt
import pandas as pd
from pandas import Series
filename = 'C:\\Users\\Desktop\\newhousing.csv'
data = pd.read_csv(filename)
data["price"].plot(kind="hist", bins=10, title="Price")
plt.show()
data = pd.read_csv(filename)
data["area"].plot(kind="hist", bins=10, title="Area")
plt.show()
data = pd.read_csv(filename)
data["areaperbedroom"].plot(kind="hist", bins=10, title="Area Per Bedroom")
plt.show()
plt.figure
plt.scatter(data["bedrooms"], data["price"], s=10, c="r", marker="s", label="Bedrooms")
plt.xlim(0, 7)
plt.ylim(1750000, 14000000)
plt.title("Bedrooms")
plt.xlabel("Bedrooms")
plt.ylabel("Price")
plt.grid()
plt.legend(loc="upper right")
plt.show()
plt.figure
plt.scatter(data["bathrooms"], data["price"], s=10, c="r", marker="s", label="Bathrooms")
plt.xlim(0, 5)
plt.ylim(1750000, 14000000)
plt.title("Bathrooms")
plt.xlabel("Bathrooms")
plt.ylabel("Price")
plt.grid()
plt.legend(loc="upper right")
plt.show()
plt.figure
plt.scatter(data["stories"], data["price"], s=10, c="r", marker="s", label="Stories")
plt.xlim(0, 5)
plt.ylim(1750000, 14000000)
plt.title("Stories")
plt.xlabel("Stories")
plt.ylabel("Price")
plt.grid()
plt.legend(loc="upper right")
plt.show()
plt.figure
plt.scatter(data["parking"], data["price"], s=10, c="r", marker="s", label="Parking")
plt.xlim(-0.2, 3.5)
plt.ylim(1750000, 14000000)
plt.title("Parking")
plt.xlabel("Parking")
plt.ylabel("Price")
plt.grid()
plt.legend(loc="upper right")
plt.show()
运行结果:
price、area、areaperbedroom数据的频率分布直方图:
stories、bedrooms、parking数据与price的关系散点图:
图表分析:略
线性回归模型代码:
import pandas as pd
from sklearn import model_selection
from sklearn import metrics
from sklearn.linear_model import LinearRegression
print("在全数据集上训练线性回归模型预测制热能耗,计算模型性能:RMSE以及R2")
filename = 'C:\\Users\\Desktop\\newhousing.csv'
data = pd.read_csv(filename)
X = data.iloc[:, 1:15] # 自变量
y = data.iloc[:, 0] # Price
linreg = LinearRegression()
linreg.fit(X, y)
print("截距 intercept: ", linreg.intercept_, "\n回归系数 coefficient: \n\t", linreg.coef_) # 截距+回归系数
y_pred = linreg.predict(X)
err = metrics.mean_squared_error(y, y_pred) # RMSE
print('[RMSE] The mean square error is: {:2f}'.format(err)) # RMSE
predict_score1 = linreg.score(X, y) # R^2
print('[R^2] The decision coefficient is: {:2f}'.format(predict_score1), "\n") # R^2
print("将数据集划分训练集和测试集,在训练集上训练线性回归模型,分析模型在训练集和测试集上的性能")
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.125,
random_state=1) # 以0.125的比例切分
linregTr = LinearRegression()
linregTr.fit(X_train, y_train)
print("截距 intercept: ", linregTr.intercept_, "\n回归系数 coefficient: \n\t", linregTr.coef_) # 截距+回归系数
y_train_pred = linregTr.predict(X_train)
y_test_pred = linregTr.predict(X_test)
train_err = metrics.mean_squared_error(y_train, y_train_pred) # RMSE
test_err = metrics.mean_squared_error(y_test, y_test_pred) # RMSE
print('[RMSE] The mean square error of train and test are: {:2f},{:2f}'.format(train_err, test_err))
predict_score2 = linregTr.score(X_test, y_test) # R^2
print('[R^2] The decision coefficient is: {:2f}'.format(predict_score2))
运行结果:
全数据集准确率达到0.683、以12.5%划分训练集和测试集时准确率达到0.691,符合预期。通过此模型将能够在的给定房屋的几项特殊关键数据条件下,较为准确的预测房屋价格。
改进部分:
本文中基于线性回归模型建立了房价预测模型,其最终的测试效果十分良好, 但是在实际环境中,房价的确定还有许多不可预测的因素在其中,同时我们还要考虑到以下问题: 1.忽略掉的房屋其他条件在一定程度同样会影响房屋价格 2.还要加入政策与该地区人均收入水平等因素。若后期准确率无法达到预期值还需要使用更多其他机器学习模型进行预测分析。
分析结论:
本文中通过 545 套房屋条件数据的分析,得出了该地区房屋条件的总体情况,同时分析出在这些条件中对房价影响最高的几项因素,通过这些因素建立了线性 回归模型,在理想化的条件下对房屋价格进行了准确的预测。首先根据分析结果得到了以下结论: 1.该地区房屋面积总体较大,领先于全国平均水平; 2.该地区房屋主要户型中卧室数量位于正常范围内,户型主要针对中年人; 3.该地区房屋以别墅、平房为主,该地土地资源紧张程度低; 4.该地房屋价格高于全国平均水平,属于经济较发达地区。