zoukankan      html  css  js  c++  java
  • 【笔记】决策树的局限性

    决策树的局限性

    局限性这方面,很明显的一点就是关于决策边界的划分,决策树的决策边界是非常规整的,都是直线,垂直于横轴或者垂直于纵轴

    这就导致了绘制出的决策边界很可能不是真实情况的决策边界,如果决策边界是一条斜线,那么决策树的决策边界一定不对,因为画不出来,乂,多捞嗷

    而且可能因为数据的数量不够多,虽然能划出决策边界,但是对于未知的数据来说,可能就是不对的

    而且决策树对于个别的例子是很敏感的

    具体操作体现一下

    (在notebook中)

    先前已经操作很多遍了,加载好类库,使用鸢尾花的数据集,只使用两个维度的特征,使用DecisionTreeClassifier,设置最大深度为2,使用信息熵的方法,然后使用绘制函数,绘制出图像

      import numpy as np
      import matplotlib.pyplot as plt
      from sklearn import datasets
    
      iris = datasets.load_iris()
      X = iris.data[:,2:]
      y = iris.target
    
      from sklearn.tree import DecisionTreeClassifier
    
      tree_clf = DecisionTreeClassifier(max_depth=2,criterion="entropy")
      tree_clf.fit(X,y)
    
          from matplotlib.colors import ListedColormap
          def plot_decision_boundary(model, axis):
    
              x0,x1 = np.meshgrid(  
                  np.linspace(axis[0],axis[1],int((axis[1]-axis[0])*100)).reshape(-1,1),
                  np.linspace(axis[2],axis[3],int((axis[3]-axis[2])*100)).reshape(-1,1)
              )
              X_new = np.c_[x0.ravel(),x1.ravel()]
        
              y_predict = model.predict(X_new)
              zz = y_predict.reshape(x0.shape)
              
              custom_cmap = ListedColormap(['#EF9A9A', '#FFF59D', '#90CAF9'])
    
              plt.contourf(x0, x1, zz, linewidth=5, cmap=custom_cmap)
    
    
      plot_decision_boundary(tree_clf,axis=[0.5,7.5,0,3])
      plt.scatter(X[y==0,0],X[y==0,1])
      plt.scatter(X[y==1,0],X[y==1,1])
      plt.scatter(X[y==2,0],X[y==2,1])
    

    图像如下

    找出一个点,将其删除掉,然后看一下绘制的决策边界是什么样的,这里删除掉X中索引为138的一行数据,删除y中的索引为138的元素,构成新的数据集

      X_new = np.delete(X,138,axis=0)
      y_new = np.delete(y,138)
    

    对于新的数据集,再使用DecisionTreeClassifier来构建一个新的模型,参数不变,fit操作的对象变成新的数据集,然后绘制图像

      tree_clf2 = DecisionTreeClassifier(max_depth=2,criterion="entropy")
      tree_clf2.fit(X_new,y_new)
    
      plot_decision_boundary(tree_clf2,axis=[0.5,7.5,0,3])
      plt.scatter(X[y==0,0],X[y==0,1])
      plt.scatter(X[y==1,0],X[y==1,1])
      plt.scatter(X[y==2,0],X[y==2,1])
    

    图像如下

    决策边界和之前直接不一样了,这就证明了决策树的决策边界是对个别的数据高度敏感的,这是非参数学习的缺点,其很依赖于调参,只有调参才能得到一个好一些的模型

    尽管如此,决策树还是很好用的

  • 相关阅读:
    hibernate -- HQL语句总结
    Struts2文件上传的大小限制问题
    WZY社区
    MyEclipse2014 优化设置
    如何优化myeclipse.
    棋盘覆盖问题(算法分析)(Java版)
    java 十六进制颜色对照表
    sql server 2012 自定义聚合函数(MAX_O3_8HOUR_ND) 计算最大的臭氧8小时滑动平均值
    oracle 自定义聚合函数(MAX_O3_8HOUR_ND) 计算最大的臭氧8小时滑动平均值
    python 读取全国城市aqi数据,差值生成png图片
  • 原文地址:https://www.cnblogs.com/jokingremarks/p/14341984.html
Copyright © 2011-2022 走看看