理解CART决策树

CART算法html

原理

CART全称为Classification and Regression Tree。node

回归树

相比ID3,CART遍历全部的特征和特征值,而后使用二元切分法划分数据子集,也就是每一个节点都只会分裂2个分支。接着计算数据子集的总方差来度量数据子集的混乱程度,总方差越小数据子集越纯,最后选择总方差最小的划分方式对应的特征和特征值,而二元切分的依据就是将小于等于这个特征值和大于这个特征值的数据划分为两块。这里说的总方差通常就是经过数据子集的样本输出值的均方差 * 数据子集的样本个数来计算。最后的输出结果是取各叶子节点数据的中位数或均值。python

分类树

相比ID3,CART通常选择基尼不纯度来代替信息增益的方式度量数据子集的不纯度。基尼不纯度越小,数据纯度越高。相比回归树,分类树对于离散或者连续特征的处理都是采用二元切分的方式,可是在数据子集的混乱程度的计算上,是用基尼不纯度替代总方差的方式。git

基尼不纯度的定义:从一个数据集中随机选取子项,度量其被错误的划分到其余组里的几率。github

先不着急理解这句话,先看下面对基尼不纯度的表达式的解释。算法

  • 假设一个数据集中有K个类别,第k个类别的几率为p_k, 则基尼系数的表达式为:

    上面的公式中,p_k表示第k个类别出现的几率,那么1-p_k显然就是当前数据集中,除了第k个类别之外的其余全部类别出现的几率,因此二者相乘就是当前数据集中,第k个类别和其余全部类别都出现的几率,这个几率越高,数据集越不纯。
    如今再看上面的定义,应该就好理解了吧。
  • 对于个给定的样本D,假设有K个类别, 第k个类别的数量为CkCk,则样本D的基尼系数表达式为:
  • 对于样本D,若是根据特征A的某个值a,把D分红D1和D2两部分,则在特征A的条件下,D的基尼系数表达式为:

算法库调用

在scikit-learn库中的决策树算法是使用了调优过的CART算法,既能够作分类,又能够作回归。windows

代码

分类树对应DecisionTreeClassifier,回归树对应DecisionTreeRegressor。代码示例和参数说明以下:dom

from sklearn.tree import DecisionTreeClassifier
clf_dt = DecisionTreeClassifier()
clf_dt.fit(train_X, train_y)
predictions_dt = clf_dt.predict(test_X)[:,None]

参数

参数 DecisionTreeClassifier DecisionTreeRegressor
criterion 特征选择标准。可使用"gini"或者"entropy",前者表明基尼系数,后者表明信息增益。通常说使用默认的基尼系数"gini"就能够了,即CART算法。除非你更喜欢相似ID3, C4.5的最优特征选择方法。  可使用"mse"或者"mae",前者是均方差,后者是和均值之差的绝对值之和。推荐使用默认的"mse"。通常来讲"mse"比"mae"更加精确。除非你想比较二个参数的效果的不一样之处。
splitter 特征划分点选择标准。可使用"best"或者"random"。前者在特征的全部划分点中找出最优的划分点。后者是随机的在部分划分点中找局部最优的划分点。默认的"best"适合样本量不大的时候,而若是样本数据量很是大,此时决策树构建推荐"random"  同左。
max_features 划分时考虑的最大特征数。 可使用不少种类型的值,默认是"None",意味着划分时考虑全部的特征数;若是是"log2"意味着划分时最多考虑log2Nlog2N个特征;若是是"sqrt"或者"auto"意味着划分时最多考虑N−−√N个特征。若是是整数,表明考虑的特征绝对数。若是是浮点数,表明考虑特征百分比,即考虑(百分比xN)取整后的特征数。其中N为样本总特征数。通常来讲,若是样本特征数很少,好比小于50,咱们用默认的"None"就能够了,若是特征数很是多,咱们能够灵活使用刚才描述的其余取值来控制划分时考虑的最大特征数,以控制决策树的生成时间。 同左。
max_depth  决策树的最大深度。默承认以不输入,若是不输入的话,决策树在创建子树的时候不会限制子树的深度。通常来讲,数据少或者特征少的时候能够无论这个值。若是模型样本量多,特征也多的状况下,推荐限制这个最大深度,具体的取值取决于数据的分布。经常使用的能够取值10-100之间。 同左。
min_samples_split 内部节点再划分所需最小样本数。这个值限制了子树继续划分的条件,若是某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。 默认是2.若是样本量不大,不须要管这个值。若是样本量数量级很是大,则推荐增大这个值。我以前的一个项目例子,有大概10万样本,创建决策树时,我选择了min_samples_split=10。能够做为参考。 同左。
min_samples_leaf 叶子节点最少样本数。 这个值限制了叶子节点最少的样本数,若是某叶子节点数目小于样本数,则会和兄弟节点一块儿被剪枝。 默认是1,能够输入最少的样本数的整数,或者最少样本数占样本总数的百分比。若是样本量不大,不须要管这个值。若是样本量数量级很是大,则推荐增大这个值。以前的10万样本项目使用min_samples_leaf的值为5,仅供参考。
min_weight_fraction_leaf 叶子节点最小的样本权重和。这个值限制了叶子节点全部样本权重和的最小值,若是小于这个值,则会和兄弟节点一块儿被剪枝。 默认是0,就是不考虑权重问题。通常来讲,若是咱们有较多样本有缺失值,或者分类树样本的分布类别误差很大,就会引入样本权重,这时咱们就要注意这个值了。 同左。
max_leaf_nodes 最大叶子节点数。经过限制最大叶子节点数,能够防止过拟合,默认是"None”,即不限制最大的叶子节点数。若是加了限制,算法会创建在最大叶子节点数内最优的决策树。若是特征很少,能够不考虑这个值,可是若是特征分红多的话,能够加以限制,具体的值能够经过交叉验证获得。 同左。
class_weight 指定样本各种别的的权重,主要是为了防止训练集某些类别的样本过多,致使训练的决策树过于偏向这些类别。这里能够本身指定各个样本的权重,或者用“balanced”,若是使用“balanced”,则算法会本身计算权重,样本量少的类别所对应的样本权重会高。固然,若是你的样本类别分布没有明显的偏倚,则能够无论这个参数,选择默认的"None" 不适用于回归树。
min_impurity_split 节点划分最小不纯度。这个值限制了决策树的增加,若是某节点的不纯度(基尼系数,信息增益,均方差,绝对差)小于这个阈值,则该节点再也不生成子节点。即为叶子节点 。 同左。
presort 数据是否预排序。这个值是布尔值,默认是False不排序。通常来讲,若是样本量少或者限制了一个深度很小的决策树,设置为true可让划分点选择更加快,决策树创建的更加快。若是样本量太大的话,反而没有什么好处。问题是样本量少的时候,我速度原本就不慢。因此这个值通常懒得理它就能够了。 同左。

决策树可视化

安装graphviz

可视化须要先安装graphviz,这是一个开源的图形可视化软件,官网:https://graphviz.gitlab.io,下载适合本身操做系统的文件便可。gitlab

若是是windows操做系统,能够点此下载安装包。安装完成记得设置一下环境变量将 xxx/Graphviz2.38/bin/加入PATH操作系统

安装python插件:

pip install graphviz
pip install pydotplus

代码示例

from sklearn.datasets import load_iris
from sklearn import tree
import pydotplus
import os
# 若是执行程序老是找不到Graphviz命令,能够加入下面这行代码,注意修改路径为你的正确的Graphviz/bin目录的路径
os.environ["PATH"] += os.pathsep + 'H:/program_files/Graphviz2.38/bin'
# 训练模型
iris = load_iris()
clf = tree.DecisionTreeClassifier()
clf = clf.fit(iris.data, iris.target)
# 用pydotplus生成iris.pdf
dot_data = tree.export_graphviz(clf, out_file=None,
                                feature_names=iris.feature_names,
                                class_names=iris.target_names,
                                filled=True, rounded=True,
                                special_characters=True)
graph = pydotplus.graph_from_dot_data(dot_data)
graph.write_pdf("iris.pdf")

查看pdf文件

参考资料

http://www.javashuo.com/article/p-eurjgjkq-cg.html

http://www.javashuo.com/article/p-zbtuyagj-eq.html

https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/tree/_tree.pyx

ok,本篇就这么多内容啦~,感谢阅读O(∩_∩)O。

相关文章
相关标签/搜索