决策树(三)决策树与Jupyter⼩部件的交互式可视化
简介
  决策树是⼴泛⽤于分类和回归任务的监督模型。在本⽂中,我们将讨论决策树分类器以及如何动态可视化它们。这些分类器在训练数据上构建⼀系列简单的if / else规则,通过它们预测⽬标值。
  在本演⽰中,我们将使⽤sklearn_wine数据集,使⽤sklearn export_graphviz函数,我们可以在Jupyter中显⽰树。
import DecisionTreeClassifier, export_graphviz
from sklearn import tree
from sklearn.datasets import load_wine
from IPython.display import SVG
from graphviz import Source
svg交互是什么from IPython.display import display
# load dataset
data = load_wine()
# feature matrix
X = data.data
# target vector
y = data.target
# class labels
labels = data.feature_names
# print dataset description
print(data.DESCR)
estimator = DecisionTreeClassifier()
estimator.fit(X, y)
graph = port_graphviz(estimator, out_file=None
, feature_names=labels, class_names=['0', '1', '2']
, filled = True))
display(SVG(graph.pipe(format='svg')))
  在树形图中,每个节点包含分割数据的条件(if / else规则)以及节点的⼀系列其他度量。基尼是指基尼杂质,它是节点杂质的量度,即节点内样品的均匀程度。我们说当⼀个节点的所有样本属于同⼀个类时它是纯粹的。在这种情况下,不需要进⼀步拆分,这个节点称为叶⼦。 Samples是节点中的实例数,⽽value数组显⽰每个类的这些实例的分布。在底部,我们看到节点的多数类。当export_graphviz的填充选项设置为True时,每个节点将根据多数类进⾏着⾊。
  虽然易于理解,但通过构建复杂模型,决策树往往会过度拟合数据。过度拟合的模型很可能不会在“看不见的”数据中很好地概括。防⽌过度拟合的两种主要⽅法是修剪前和修剪后。预修剪意味着在创建之前限制树的深度,⽽后修剪是在树构建之后移除⾮信息节点。
  Sklearn学习决策树分类器仅实现预修剪。可以通过若⼲参数来控制预修剪,例如树的最⼤深度,节点保持分裂所需的最⼩样本数以及叶所需的最⼩实例数。下⾯,我们在相同的数据上绘制决策树,这次设置max_depth = 3。
  这个模型不太深,因此⽐我们最初训练和绘制的模型简单。
  除了预修剪参数之外,决策树还有⼀系列其他参数,我们在构建分类模型时尝试优化这些参数。我们通常通过查看准确度指标来评估这些参数的影响。为了掌握参数的变化如何影响树的结构,我们可以再次在每个阶段可视化树。我们可以使⽤Jupyter Widgets(ipywidgets)来构建我们树的交互式绘图,⽽不是每次进⾏更改时都绘制树。
  Jupyter⼩部件是交互式元素,允许我们在笔记本中呈现控件。通过pip和conda安装ipywidgets有两种选择。
⽤pip安装
pip install ipywidgets
jupyter nbextension enable --py widgetsnbextension
⽤conda安装
conda install -c conda-forge ipywidgets
  对于此应⽤程序,我们将使⽤交互式功能。⾸先,我们定义⼀个训练和绘制决策树的函数。然后,我们将此函数与针
对交互式函数感兴趣的每个参数的⼀组值⼀起传递。后者返回我们⽤display显⽰的Widget实例。
import DecisionTreeClassifier, export_graphviz
from sklearn import tree
from sklearn.datasets import load_wine
from IPython.display import SVG
from graphviz import Source
from IPython.display import display
from ipywidgets import interactive
# load dataset
data = load_wine()
# feature matrix
X = data.data
# target vector
y = data.target
# class labels
labels = data.feature_names
def plot_tree(crit, split, depth, min_split, min_leaf=0.2):
estimator = DecisionTreeClassifier(random_state = 0
, criterion = crit
, splitter = split
,
max_depth = depth
, min_samples_split=min_split
, min_samples_leaf=min_leaf)
estimator.fit(X, y)
graph = port_graphviz(estimator
, out_file=None
, feature_names=labels
, class_names=['0', '1', '2']
, filled = True))
display(SVG(graph.pipe(format='svg')))
return estimator
inter=interactive(plot_tree
, crit = ["gini", "entropy"]
, split = ["best", "random"]
, depth=[1,2,3,4]
, min_split=(0.1,1)
, min_leaf=(0.1,0.5))
display(inter)
在此⽰例中,我们公开以下参数:
criterion:衡量节点分裂质量的标准
splitter:每个节点的拆分策略
max_depth:树的最⼤深度
min_samples_split:节点中所需的最⼩实例数
min_samples_leaf:叶节点上所需的最⼩实例数
最后两个参数可以设置为整数或浮点数。浮点数被解释为实例总数的百分⽐。有关参数的更多详细信息,请阅读sklearn类⽂档。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。