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

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

 
环境配置如下:

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.38\bin

 
这是我在代码中用到的包,可以根据实际情况来更改
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)
 
 
结局柱状图如下: