美文网首页机器学习与计算机视觉Python文集大数据
三种回归模型对朝阳区房价预测的效果对比

三种回归模型对朝阳区房价预测的效果对比

作者: 梅花鹿数据rieuse | 来源:发表于2018-02-18 18:25 被阅读304次

    一:前言

    利用上次爬取的朝阳区房价数据,通过简单线性回归模型、决策树回归模型、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
    

    三:引入模块和数据

    全部代码存放于: https://github.com/rieuse/Machine_Learning/

    1. 首先来导入相关模块,这里的 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
    
    1. 下面是导入之前的数据,取出合适的数据做为训练使用。房屋一些大小,房价数目,每平米价格是自变量而价格是因变量,也就是需要预测的对象。
    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的预测效果更好。还有很多未知的知识等着学习,加油。

    相关文章

      网友评论

      本文标题:三种回归模型对朝阳区房价预测的效果对比

      本文链接:https://www.haomeiwen.com/subject/cxyvtftx.html