三种回归模型对朝阳区房价预测的效果对比
一:前言
利用上次爬取的朝阳区房价数据,通过简单线性回归模型、决策树回归模型、xgboost回归模型来进行房价预测效果对比,期间遇到一些问题和解决方法也记录下来。
目的:练习相关sklearn,xgboost模块和学习验证结果的方法。
二:运行环境
- Anaconda Python 3.6
- xgboost 0.7
- scikit-learn 0.19.1
- pandas 0.20.3
安装anaconda 后科学计算相关库就有了,但是xgboost安装没有,需要下载软件编译xgboost的文件。这里我推荐一个更直接的方法:到这里下载对应版本的xgboost
https://www.lfd.uci.edu/~gohlke/pythonlibs/
然后pip安装即可,几秒后你将拥有xgboost模块。
pip install xgboost-0.7-cp36-cp36m-win_amd64.whl
三:引入模块和数据
- 首先来导入相关模块,这里的 learning_curve 用来查看训练的拟合过程,也可以利用validation_curve来确定相关模型里面的最佳参数,比如DecisionTreeRegressord、XGBRegressor中的max_depth需要多次训练找出最佳值。
import pandas as pd
import numpy as np
from sklearn.learning_curve import learning_curve
from sklearn.linear_model import LinearRegression
from sklearn.tree import DecisionTreeRegressor
from xgboost import XGBRegressor
import matplotlib.pyplot as plt
- 下面是导入之前的数据,取出合适的数据做为训练使用。房屋一些大小,房价数目,每平米价格是自变量而价格是因变量,也就是需要预测的对象。
row_df = pd.read_csv('house_price.csv')
df = row_df[row_df.iloc[:,1] !='多']
data_X = df[['rooms','halls','size','unit_price']]
data_y = df.price
四:简单线性回归模型
引入模块和数据后开始构建回归模型,LinearRegression() 是本次用的线性回归,train_sizes=np.linspace(0.0, 1.0, num=30)[1:]
这个在可视化训练过程中对应曲线多少个位置。0不取所以使用切片[1:]。cv=10
采用K折交叉验证 scoring='r2'
表示采用R2的预测得分计算方法 也可以采用均方误差。
train_sizes, train_score, test_score = learning_curve(
LinearRegression(), data_X, data_y, cv=10, scoring='r2',
train_sizes=np.linspace(0.0, 1.0, num=30)[1:])
下面就是求取训练和测试过程中的预测得分情况,然后show出来。
train_score_mean = np.mean(train_score, axis=1)
test_score_mean = np.mean(test_score, axis=1)
plt.plot(train_sizes, train_score_mean, 'o-', color="r",
label="Training")
plt.plot(train_sizes, test_score_mean, 'o-', color="g",
label="Validation")
print(train_score_mean.mean())
print(test_score_mean.mean())
plt.xlabel("Training examples")
plt.ylabel("Score")
plt.legend(loc="best")
plt.show()
通过图示可以看到线性回归的训练过程中。训练和测试的得分趋于一个较为稳定的值
0.925
五:决策树回归模型
决策树的最大深度,经过测试发现16 的时候效果最好,然后采用R2标准来预测得分情况。
train_sizes, train_score, test_score = learning_curve(
DecisionTreeRegressor(max_depth=16), data_X, data_y, cv=10, scoring='r2',
train_sizes=np.linspace(0.0, 1.0, num=30)[1:])
train_score_mean = np.mean(train_score, axis=1)
test_score_mean = np.mean(test_score, axis=1)
plt.plot(train_sizes, train_score_mean, 'o-', color="r",
label="Training")
plt.plot(train_sizes, test_score_mean, 'o-', color="g",
label="Validation")
plt.xlabel("Training examples")
plt.ylabel("Score")
plt.legend(loc="best")
plt.show()
通过图示可以看到决策树回归模型的测试的得分趋于 0.97 附近,效果要比简单的线性回归模型好很多了。
六:xgboost回归模型回归模型
XGBRegressor 经测试每棵树的最大深度在4效果最好,然后采用R2标准来预测得分情况。
这里使用xgboost的过程中遇到一个问题:
AttributeError: 'DMatrix' object has no attribute 'handle'
查看前面报错的信息后确定是:
ValueError: DataFrame.dtypes for data must be int, float or bool.
应该是pandas数据类型错误所所以在使用xgboost训练的时候修改了数据
data_X = df[['rooms','halls','size','unit_price']].astype('int')
train_sizes, train_score, test_score = learning_curve(
XGBRegressor(max_depth=4), data_X, data_y, cv=10, scoring='r2',
train_sizes=np.linspace(0.0, 1.0, num=30)[1:])
train_score_mean = np.mean(train_score, axis=1)
test_score_mean = np.mean(test_score, axis=1)
plt.plot(train_sizes, train_score_mean, 'o-', color="r",
label="Training")
plt.plot(train_sizes, test_score_mean, 'o-', color="g",
label="Validation")
plt.xlabel("Training examples")
plt.ylabel("Score")
plt.legend(loc="best")
plt.show()
通过图示可以看到xgboost回归模型的测试的得分趋于 0.99 附近,效果要比简单的线性回归模型和决策树回归模型好很多。
七:总结
该项目代码以及数据源全部存放于 github.com/rieuse/Machine_Learning
通过三个回归模型的建立,本地调试出最佳参数(决策树和xgboost 的max_depth)然后进行预测,发现决策树的效果比一遍的线性回归模型好一些,但是xgboost的预测效果更好。还有很多未知的知识等着学习,加油。