• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    利用机器学习预测房价

    项目介绍

    背景:

    DC竞赛比赛项目,运用回归模型进行房价预测。

    数据介绍:

    数据主要包括2014年5月至2015年5月美国King County的房屋销售价格以及房屋的基本信息。

    其中训练数据主要包括10000条记录,14个字段,分别代表:

    目标:

    算法通过计算平均预测误差来衡量回归模型的优劣。平均预测误差越小,说明回归模型越好。

    代码详解

    数据导入

    先导入分析需要的python包:

    #导入类库和加载数据集
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    import seaborn as sns
    %matplotlib inline

    导入下载好的kc_train的csv文件:

    #读取数据
    train_names = ["date",
                   "price",
                   "bedroom_num",
                   "bathroom_num",
                   "house_area",
                   "park_space",
                   "floor_num",
                   "house_score",
                   "covered_area",
                   "basement_area",
                   "yearbuilt",
                   "yearremodadd",
                   "lat",
                   "long"]
    data = pd.read_csv("kc_train.csv",names=train_names)
    data.head()

    数据预处理

    查看数据集概况

    # 观察数据集概况
    data.info()

    从图中可以看出没有任何缺失值,因此不需要对缺失值进行处理。

    拆分数据

    把原始数据中的年月日拆开,然后根据房屋的建造年份和修复年份计算一下售出时已经过了多少年,这样就有17个特征。

    sell_year,sell_month,sell_day=[],[],[]
    house_old,fix_old=[],[]
    for [date,yearbuilt,yearremodadd] in data[['date','yearbuilt','yearremodadd']].values:
        year,month,day=date//10000,date%10000//100,date%100
        sell_year.append(year)
        sell_month.append(month)
        sell_day.append(day)
        house_old.append(year-yearbuilt)
        if yearremodadd==0:
            fix_old.append(0)
        else:
            fix_old.append(year-yearremodadd)
    del data['date']
    data['sell_year']=pd.DataFrame({'sell_year':sell_year})
    data['sell_month']=pd.DataFrame({'sell_month':sell_month})
    data['sell_day']=pd.DataFrame({'sell_day':sell_day})
    data['house_old']=pd.DataFrame({'house_old':house_old})
    data['fix_old']=pd.DataFrame({'fix_old':fix_old})
    data.head()
    

    观察因变量(price)数据情况

    #观察数据
    print(data['price'].describe())

    #观察price的数据分布
    plt.figure(figsize = (10,5))
    # plt.xlabel('price')
    sns.distplot(data['price'])

    从数据和图片上可以看出,price呈现典型的右偏分布,但总体上看还是符合一般规律。

    相关性分析

    自变量与因变量的相关性分析,绘制相关性矩阵热力图,比较各个变量之间的相关性:

    #自变量与因变量的相关性分析
    plt.figure(figsize = (20,10))
    internal_chars = ['price','bedroom_num','bathroom_num','house_area','park_space','floor_num','house_score','covered_area'
                      ,'basement_area','yearbuilt','yearremodadd','lat','long','sell_year','sell_month','sell_day',
                     'house_old','fix_old']
    corrmat = data[internal_chars].corr()  # 计算相关系数
    sns.heatmap(corrmat, square=False, linewidths=.5, annot=True) #热力图
    csdn.net/jlf7026/article/details/84630414

    相关性越大,颜色越浅。看着可能不太清楚,因此看下排名

    #打印出相关性的排名
    print(corrmat["price"].sort_values(ascending=False))

    可以看出house_area,house_score,covered_area,bathroom_num这四个特征对price的影响最大,都超过了0.5。负数表明与price是负相关的。

    特征选择

    一般来说,选择一些与因变量(price)相关性比较大的做特征,但我尝试过选择前十的特征,然后进行建模预测,但得到的结果并不是很好,所以我还是把现有的特征全部用上。

    归一化

    对于各个特征的数据范围不一样,影响线性回归的效果,因此归一化数据。

    #特征缩放
    data = data.astype('float')
    x = data.drop('price',axis=1)
    y = data['price']
    from sklearn.preprocessing import MinMaxScaler
    scaler = MinMaxScaler()
    newX= scaler.fit_transform(x)
    newX = pd.DataFrame(newX, columns=x.columns)
    newX.head()
    

    划分数据集

    #先将数据集分成训练集和测试集
    from sklearn.model_selection import train_test_split
    X_train,X_test,y_train,y_test = train_test_split(newX, y, test_size=0.2, random_state=21)
    

    建立模型

    选择两个模型进行预测,观察那个模型更好。

    #模型建立
    from sklearn import metrics
    def RF(X_train, X_test, y_train, y_test):    #随机森林 
        from sklearn.ensemble import RandomForestRegressor
        model= RandomForestRegressor(n_estimators=200,max_features=None)
        model.fit(X_train, y_train)
        predicted= model.predict(X_test)
        mse = metrics.mean_squared_error(y_test,predicted)
        return (mse/10000)
    def LR(X_train, X_test, y_train, y_test):    #线性回归
        from sklearn.linear_model import LinearRegression            
        LR = LinearRegression()
        LR.fit(X_train, y_train)
        predicted = LR.predict(X_test)
        mse = metrics.mean_squared_error(y_test,predicted)
        return (mse/10000)

    评价标准

    算法通过计算平均预测误差来衡量回归模型的优劣。平均预测误差越小,说明回归模型越好。

    print('RF mse: ',RF(X_train, X_test, y_train, y_test))
    print('LR mse: ',LR(X_train, X_test, y_train, y_test))

    可以看出,随机森林算法比线性回归算法要好很多。

    总结

    对机器学习有了初步了解。但对于数据的预处理,和参数,特征,模型的调优还很欠缺。

    希望通过以后的学习,能不断提高。也希望看这篇文章的朋友和我一起感受机器学习的魅力,更多相关机器学习内容请搜索脚本之家以前的文章或继续浏览下面的相关文章,希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • 如何用Python进行时间序列分解和预测
    • 利用keras使用神经网络预测销量操作
    • 详解用Python进行时间序列预测的7种方法
    • Python实现新型冠状病毒传播模型及预测代码实例
    • Datawhale练习之二手车价格预测
    上一篇:基于python分布式爬虫并解决假死的问题
    下一篇:python3 解决requests出错重试的问题
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    利用机器学习预测房价 利用,机器,学习,预测,房价,