决策树广泛用于分类和回归问题。比如我们要区分四种动物:鹰、企鹅、海豚、熊,我可以由几个if/else来判断,
import numpy as np
import pandas as pd
import mglearn
import matplotlib.pyplot as plt
import graphviz
from sklearn.model_selection import train_test_split
mglearn.plots.plot_animal_tree()
注意,如果报错 python导入graphviz报错:failed to execute [‘dot’, ‘-Tpdf’, ‘-O’, ‘network.gv’], make sure the Graphviz… ,解决方法如下:
(1)首先pip,
pip install -i https://pypi.doubanio.com/simple/ graphviz
(2)然后去graphviz官网下载对应自己电脑系统的graphviz程序,将graphviz程序安装在电脑上,
(3)先添加用户变量PATH,注意不要删除PATH原有的内容,在原有内容后边加一个英文状态的;,然后将安装后的graphviz程序对应的路径粘贴在;后,点击确定。
(4)然后添加系统变量,因为我的系统变量里没有PATH,所以我新建了PATH,同样的,将安装后的graphviz程序对应的路径粘贴进去,点确定。
(5)然后关掉jupyter notebook,重新打开一次,就可以了。
如果树中某个结点所包含的数据点的目标值都相同,那么这个叶结点就是“纯的”。如果要对新数据点预测,首先判定这个点位于特征空间划分的哪个区域,然后将该区域的多数目标值(如果是纯的叶结点,就是单一目标值)作为预测结果。同样,决策树也可以用于回归任务,方法相同,基于每个结点的测试进行遍历,最终找到新数据点所属的叶结点,这一数据点的输出即为此叶结点中所有训练点的平均目标值。
如果所有叶结点都是纯的叶结点,这样的模型会非常复杂,模型高度过拟合。防止过拟合有两种策略:一种是及早停止树的生长,叫“预剪枝”;另一种是先构造树,然后删除或折叠信息量很少的结点,叫“后剪枝”。
在乳腺癌数据集上详细看一下预剪枝的效果,默认将树完全展开,
from sklearn.datasets import load_breast_cancer
from sklearn.tree import DecisionTreeClassifier
cancer=load_breast_cancer()
X_train,X_test,y_train,y_test=train_test_split(
cancer.data,cancer.target,stratify=cancer.target,random_state=42)
tree=DecisionTreeClassifier(random_state=0)
tree.fit(X_train,y_train)
print('训练集准确度:{:.3f}'.format(tree.score(X_train,y_train)))
print('测试集准确度:{:.3f}'