• 机器学习中用决策树回归器,构建评估模型 (波士顿房价)


    机器学习-------用决策树回归器构建房价评估模型 
     
    刚开始学习机器学习的朋友肯定特别蒙,这个东西确实也特别无聊,尤其看到了一些算法什么的,一个头两个大,所以说,要静下心来,慢慢学 ,用心来,不骄不躁 
    下面有哪些不懂的地方,还有写的错误的地方,欢迎大家指出,谢谢

    最近几十年,房价一直是中国老百姓心中永远的痛,有人说,中国房价就像女人的无肩带文胸,一半人在疑惑:是 什么支撑了它?另一半人在等待:什么时候掉下去? 而女人,永不可能让它掉下来。就算快掉下来了,提一提还是 又上去了.....
    虽然我们不能预测中国房价什么时候崩盘,但是却可以用机器学习来构建房价预测模型,下面我们使用波士顿房价 数据集来建立一个房价评估模型,通过房子所在的地理位置,人口居住特性等因素来综合评估房价。

     
    环境配置如下:

    1)Graphviz 0.8.4 (安装python模块,安装代码: pip install graphviz)

    2)安装软件:下载地址https://graphviz.gitlab.io/_pages/Download/windows/graphviz-2.38.msi

    3)配置环境变量:D:Program Files (x86)Graphviz2.38in

     
    这是我在代码中用到的包,可以根据实际情况来更改
    import sklearn
    import numpy as np
    from matplotlib import pyplot as plt
    import pandas as pd
    import matplotlib
    %matplotlib inline
    matplotlib.rcParams['font.sans-serif']=['SimHei']
    #分割数据集要导的包
    from sklearn.model_selection import train_test_split
     
    from sklearn import datasets              # sklearn自带的datasets中就有Boston房价数据集. 
    housing_data=datasets.load_boston()     #加载波士顿房价数据数据,
    # print(housing_data)
     
     
    dataset_X=housing_data.data              # 获取影响房价的特征向量,作为feaure X
    dataset_y=housing_data.target             # 获取对应的房价,作为label y
    #查看一下他的行与列
    print(dataset_X.shape)
     
    #分割数据集,把测试数据集和训练数据集分开
    train_X,test_X,train_Y,test_Y = train_test_split(dataset_X,dataset_y,test_size=0.2,random_state=30)    #这样,就把数据(2,8)分成了测试集与训练集
     
    #训练集为80%,测试集为20%
    print(train_X.shape,test_X.shape)
     
     
     
    # 构建决策树模型
    from sklearn.tree import DecisionTreeRegressor
    # 决定决策树的最大深度,为 4,关于这个深度,有兴趣了解的同学,可以到这里看一看  ::::    https://www.cnblogs.com/fionacai/p/5894142.html
    decision_regressor =DecisionTreeRegressor(max_depth=4)
    #训练数据
    decision_regressor.fit(train_X,train_Y)
     
    #使用测试集来判断他的好坏
    predict_test_y = decision_regressor.predict(test_X)
     
    #决策树模型得分指标    这是以测试集为标准进行估测
    from sklearn import metrics
    print('平均绝对误差:{}'.format(metrics.mean_squared_error(predict_test_y,test_Y)))
    print('均方误差MSE:{}'.format(metrics.mean_absolute_error(predict_test_y,test_Y)))
    print('解释方差分:{}'.format(metrics.explained_variance_score(predict_test_y,test_Y)))
    print('R2得分:{}'.format(metrics.r2_score(predict_test_y,test_Y)))
    得分结果
     
     
     
              决策树模型的优化
    #优化你的模型,让他的得分更高,这样预测出来的数据会更准确
    for depth in range(2,12):
        decision_regressor_test=DecisionTreeRegressor(max_depth=depth)    
        decision_regressor_test.fit(train_X,train_Y)
        predict_test_y2=decision_regressor_test.predict(test_X)
     
    #优化后的决策树模型得分指标
    from sklearn import metrics
    print('平均绝对误差:{}'.format(metrics.mean_squared_error(predict_test_y2,test_Y)))
    print('均方误差MSE:{}'.format(metrics.mean_absolute_error(predict_test_y2,test_Y)))
    print('解释方差分:{}'.format(metrics.explained_variance_score(predict_test_y2,test_Y)))
    print('R2得分:{}'.format(metrics.r2_score(predict_test_y2,test_Y)))
    得分结果
     
     
           计算不同特征的相对重要性
    这个数据中一共有13个特征,但这13个特征对于房价的影响肯定是不同的,比如从直观上来看,学区房对房价影响肯定 比较大,所以可以计算出各种不同特征对模型的影响,进而在特征比较复杂的情况下,可以忽略掉影响比较小的特征。
    如下部分代码可以将各种特征的相对重要性绘制到图中,这样大家就能直观的看出来了
     
    #  计算不同特征的相对重要性
    def plot_importances(feature_importances, title, feature_names):   
      ''将feature_importance绘制到图表中,便于观察,并把重要性大于5的特征打印出来'''   
      # 将重要性都归一化为0-100之内   
      feature_importances=100.0*(feature_importances/max(feature_importances))       
      #将得分从高到低排序   
      # (np.argsort:将矩阵a按照axis排序(默认升序),并返回排序后的下标 )   
      # (np.flipud:矩阵上下翻转,np.fliplr:矩阵左右反转)   
      index_sorted=np.flipud(np.argsort(feature_importances))   
      # 让X坐标轴上的标签居中显示   
      pos=np.arange(index_sorted.shape[0])+0.5       
      # 画条形图   
      plt.figure()   
      plt.bar(pos,feature_importances[index_sorted],align='center')   
      plt.xticks(pos,feature_names[index_sorted])   
      plt.ylabel('Relative Importance')   
      plt.title(title) 
     
     
       # 把重要性结果打印出来   
      print('{} importance list------>>>>>'.format(title))   
      for importance,name in zip(feature_importances[index_sorted],feature_names[index_sorted]):
        if  importance>5:
          print('feature:{}, importance: {:.2f}'.format(name,importance))  
    decision_regressor7=DecisionTreeRegressor(max_depth=7)      # 最大深度确定为7 
    decision_regressor7.fit(train_X,train_y)       # 对决策树回归模型进行训练
    plot_importances(decision_regressor7.feature_importances_,
                     'DT regressor',housing_data.feature_names)
    plot_importances(ada_regressor.feature_importances_,
                     'AdaBoost Optimized DT regressor',housing_data.feature_names)
     
     
    结局柱状图如下:
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    P4855 MloVtry的idea
    CF343D Water Tree
    CF165D Beard Graph
    P3833 [SHOI2012]魔法树
    P2410 [SDOI2009]最优图像 ZKW最大费用最大流
    P2157 [SDOI2009]学校食堂
    P2407 [SDOI2009]地图复原
    P4008 [NOI2003]文本编辑器
    awk里面执行shell命令
    git 系统中 post-receive 钩子不能正常执行 git pull 解决方法
  • 原文地址:https://www.cnblogs.com/lowbi/p/10667155.html
Copyright © 2020-2023  润新知