决策树的局限性
局限性这方面,很明显的一点就是关于决策边界的划分,决策树的决策边界是非常规整的,都是直线,垂直于横轴或者垂直于纵轴
这就导致了绘制出的决策边界很可能不是真实情况的决策边界,如果决策边界是一条斜线,那么决策树的决策边界一定不对,因为画不出来,乂,多捞嗷
而且可能因为数据的数量不够多,虽然能划出决策边界,但是对于未知的数据来说,可能就是不对的
而且决策树对于个别的例子是很敏感的
具体操作体现一下
(在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])
图像如下
决策边界和之前直接不一样了,这就证明了决策树的决策边界是对个别的数据高度敏感的,这是非参数学习的缺点,其很依赖于调参,只有调参才能得到一个好一些的模型
尽管如此,决策树还是很好用的