【Python机器学习】构造决策树

通常来说,构造决策树直到所有叶结点都是纯的叶结点,但这会导致模型非常复杂,并且对于训练数据高度过拟合。

为了防止过拟合,有两种常见策略:

1、尽早停止树的生长,也叫预剪枝

2、先构造树,但随后删除或折叠信息量很少的结点,也叫后剪枝。

预剪枝的限制条件可能包含限制树的最大深度、限制叶结点的最大数目、规定一个结点中数据点的最小数目。

如果不防止过拟合:

python 复制代码
from sklearn.tree import DecisionTreeClassifier,export_graphviz
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
from sklearn.datasets import load_breast_cancer
import graphviz


plt.rcParams['font.sans-serif'] = ['SimHei']

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('训练集score:{:.3f}'.format(tree.score(X_train,y_train)))
print('测试集score:{:.3f}'.format(tree.score(X_test,y_test)))

可以看到,训练集上精度是100%,但测试集的精度只有93.7%。

防止过拟合,比如限制决策树的深度为4:

python 复制代码
tree=DecisionTreeClassifier(max_depth=4,random_state=0)

可以看到,虽然训练集的精度下降,但是测试集的精度有所提升。

还可以用tree模块的export_graphviz函数来将树可视化。这个函数会生成一个dot文件,然后用graphviz读取这个文件并可视化(通过生成pdf文件的方式):

python 复制代码
export_graphviz(tree,out_file='tree_1.dot',class_names=['malignant','benigh'],feature_names=cancer.feature_names,impurity=False,filled=True)
with open('tree_1.dot') as f:
    dot_graph=f.read()
g=graphviz.Source(dot_graph)
g.render('决策树可视化')
相关推荐
萤火阳光18 分钟前
43|Python 异步生态深度:aiohttp/aiomysql/aioredis 全链路异步实战
开发语言·网络·python
Ronaldinho Gaúch26 分钟前
梯度消失与梯度爆炸
人工智能·深度学习·机器学习
威联通安全存储26 分钟前
云原生数据湖:QuObjects 本地 S3 对象存储解析
python·云原生
chushiyunen29 分钟前
大模型评测、质量保证、datasets数据集、LmEval工具
开发语言·python
新知图书1 小时前
【图书推荐】《Python大数据分析师的算法手册》
python·数据分析
apcipot_rain1 小时前
Python 脚本生成目录树
开发语言·python
港股研究社1 小时前
广汽年报里的隐线:组织改革、生态协同与修复起点
python
Sirius.z1 小时前
第T11周:优化器对比实验
python
loriloy1 小时前
Python 环境管理工具 pyenv-win (windows版本)
windows·python·pyenv-win
William Dawson2 小时前
【Java Stream 流:高效、优雅的集合操作 ✨】
java·windows·python