【笔记】决策树的局限性

决策树的局限性

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

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

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

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

具体操作体现一下

(在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])

图像如下

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

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

原文地址:https://www.cnblogs.com/jokingremarks/p/14341984.html