决策树和svm一样是一种通用机器学习算法
既可以做回归,也可以做分类
同时也是Random Forest 随机森林的基本组件
安德森鸢尾花卉数据集,是一类多重变量分析的数据集。
这里我们就是用DecisionTreeClassifier简单的fit了这些数据。然后将它输出成一个graphviz文件,使用这个文件我们就可以讲生成的决策树可视化。
当然,只有这个文件的时候我们是什么也看不到的,里面大概长这样:
这个时候我们需要下载Graphviz这个绘图软件
https://graphviz.gitlab.io/_pages/Download/Download_windows.html
安装完之后把安装目录加到环境变量的path里
之后在cmd中输入dot -version检测是否安装成功
切换到生成的dot文件所在目录下,输入
dot -Tpng iris_tree.dot -o iris_tree.png
然后我们获得了这个png
可以看出,我们只是用了花瓣长度和花瓣宽度两个特征去判别这个样本属于哪一种Iris,首先看长度,小于2.45的就直接被判定成是setosa了,大于的再根据宽度判断是versicolor还是virginica。
决策树的一大好处就是不需要非常大的数据量,也不需要特征缩放和中心化
samples指的是这一类中有多少样本。
value告诉你实际上分布的情况是怎样的,比如第一层的左边的节点里有50个样本,这50个样本全是属于setosa类的,然而右节点里有100个样本,50个是versicolor,50个是virginica。
gini指的是这个节点的纯度,第一层的左边的节点50个样本中全是输入setosa类的,所以是纯的,gini为0。右边的节点是versicolor类,但有一半是virginica,所以gini是0.5。第二层左边是versicolor类,有53个样本但其中只有49个真的是versicolor,所以
gini=1-(0/54)2-(49/54)2 -(5/54)2 ≈0.168。
sklean 使用Cart算法,只能生成二叉树,如果是ID3之类的算法一个节点可以有更多子节点。
Decision Tree通常被当成是一种白盒模型,因为看图就明白它所做的预测的原理都是可以被简单地理解的,而随机森林和神经网络算法则通常被当成黑盒模型。
CART 训练算法
全称Classification And Regression Tree
简单地说就是选取一个特征 k 和一个阈值tk,将训练集分割成两部分,寻找k和tk的方法就是找到一组能够产生最纯的子集的(k,tk).
损失函数为
其中G是子集中的不纯度,m是子集中样本数量。
然后它会在子集中做同样的事,,当然我们会加一些制约防止它一直这么干下去。
CART算法是一种贪心算法,通常会给出一个优秀的解,但不一定是最优的选择。不幸的是找出最优的那棵树是一个NP完全问题。
正则化超参数
决策树是一种nonparametric(非参数的)模型,它的参数对训练来说不是很重要,所以很容易就过拟合了。防止过拟合的方法被称作正则化,正则化参数取决于你所用的模型,在sklearn里我们用max_depth来防止过拟合。
DecisionTreeClassifier 有一些其他的参数来规范树的形状。
- min_samples_split(在被分割前这个子集必须至少包含这么多samples)
- min_samples_leaf(一个叶节点里必须至少有那么多samples)
- min_weight_fraction_leaf(大概和上一个一样)
- max_leaf_nodes(最多有多少节点)
- max_features(最多有多少特征用来分割)