决策树可以用于classification和regression。
决策树利弊:
优点:
- model的预测结果容易理解,解释。
- 与其他model相比,需要较少的preprocessing of data,如:normalization,dummy variable to be created,blank values to be removed。
- 使用tree的时间复杂度为O(logN)。
- 该模型能够拟合numerical data and categorical data。
- 该model能够处理multi-output 问题。
缺点:
- tree可能造成overfitting问题,解决该问题办法有:减枝、设定叶子节点最少sample、设定tree的深度。
- 构建的tree,可能随着data中的一些small variation而发生较大变化,为克服这个问题,我们可以将tree用于ensemble model中。
- an optimal decision tree是一个NP problem,实际的tree algorithm只能保证得到一个“局部最优解”,为了降低这种“局部最优”的影响,我们可以将多棵tree应用于一个ensemble learner中,在该ensemble learner中,每棵tree的sample和feature都通过“有放回随机抽样获得”。
- decision tree不适用于imbalanced dataset,在这种data中只能构建一种biased tree。因此,在fitting之前,应先balance dataset。
Classification
sklearn.tree.DecisionTreeClassifier(criterion=’gini’, splitter=’best’, max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, class_weight=None, presort=False)
#criterion:{gini,entropy}。用于判断一个node是否split的标准。
#splitter:{best,random}。选择split一个node的策略,如果=best,则选择能降低criterion的最好的feature 及 splitting value。如果=random,从几个随机的选项中,选择split效果最好的一个。
#max_depth:设定tree的最大深度。
#min_samples_split:要split一个node,其必须满足的最小样本量。
#min_samples_leaf:一个叶子节点必须拥有的最小样本量。
#min_weight_fraction_leaf:各个叶子结点的权重。
#max_features:在寻找最优的split时,所考虑的feature量。
#random_state:设定随机初始状态。
#max_leaf_nodes:最大的叶子节点数。
#min_impurity_decrease:node split前后,criterion差值>该值,则split。
#min_impurity_split:如果node的impurity高于该值,则split。
#class_weight:各个class的权重。
#presort:bool,是否presort???Whether to presort the data to speed up the finding of best splits in fitting. ???
在通过training data获得tree之后,可以通过以下function,将tree画出来。
#通过export_graphviz可以将tree输出为graphviz format。
sklearn.tree.export_graphviz(decision_tree, out_file=None, max_depth=None, feature_names=None, class_names=None, label=’all’, filled=False, leaves_parallel=False, impurity=True, node_ids=False, proportion=False, rotate=False, rounded=False, special_characters=False, precision=3)
下面给出code 示例:
>>> import graphviz
>>> dot_data = tree.export_graphviz(clf, out_file=None) #将clf输出为graphviz format
>>> graph = graphviz.Source(dot_data) #将graphviz format形式的tree转为picture
>>> graph.render("iris") #将graph存入'iris.pdf'
Regression
sklearn.tree.DecisionTreeRegressor(criterion=’mse’, splitter=’best’, max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, presort=False)
Multi-output problems
在将decision tree应用于multi-output问题是,tree变化有2:
- 每个叶子结点要存储n个output value instead of 1;
- node的split准则:分别计算各个output的reduction of impurity,然后求n个output的平均值,以此作为是否split的标准;
Tips on practical use
- Decision tree在高维数据中有overfitting的危险,因此,在用data
拟合tree之前,最好先进行dimentionality reduction by PCA , ICA , or Feature
Selection。 - remember that:每使tree的深度增加一层,则需要double dataset
size,因此,在拟合tree时要谨慎选择max_depth of tree,以防止overfitting。 - 在利用training data拟合tree之前,首先要确保training data is balanced。training data的balance可以通过以下几种方法进行:
从不同的class中抽取同样多的sample。
使得不同class中sample的sum of weight相同。 - 在训练tree时,如果input data是sparse matrix,则在training时可先把input
data转为scipy.csc_matrix。在predict时,把input data转为scipy.csr_matrix。note that:sparse matrix 的训练速度较dense matrix,呈指数级增长。
Tree algorithms: ID3, C4.5, C5.0 and CART
- ID3:ID3采用贪心的方式,首先,创建一个完全长成的**“多元树”。然后,在利用减枝策略,对多元树进行减枝的处理,以防止其overfitting。在树的生成过程中,每个node的分裂原理如下:寻找一个categorical feature**,使得根据这个feature对node进行分裂后,其**“信息增益entropy”**能够达到最大。ID3使用entropy:信息增益,作为分支准则。
- C4.5是在ID3的基础上做了进一步的改进:1)ID3的feature为categorical,在C4.5中,允许data的feature为连续值,C4.5将把这些连续值划分为多个interval,然后对属于每个interval的数值label,从而达到categorical feature的效果;2)C4.5将训练好的tree转化为了一系列的if-then rules。并且根据这些if-then rule预测的精确度来决定他们被应用的order。当砍掉一个if-then rules,可以增加整体的精确度的话,则砍掉这条if-then语句。C4.5使用entropy:信息增益比率,作为分支准则。
- C5.0与C4.5相比,拥有更小的if-then rule set,占用更少的memory,但是拥有更高的accuracy。C5.0使用entropy。
- CART与C4.5很相似,但是,他创建的是“二叉树”,且支持numerical
variable,能够进行classification和regression。不建立if-then rule
set。CART使用gini指数:信息增益,作为分支准则。
Mathematical formulation
classification mathematical formulation
classification中,node split的判断准则有两种:
1)采用node split 前后entropy的差值,来判断使用哪个feature进行splitting。
entropy公式如下:
2)采用gini指数来衡量node split前后的信息增益,公式如下:
node split之后,Impurity的计算公式如下:
Regression mathematical formulation
Regression中衡量采用某feature split node效果的标准有2个:
Mean Squared Error:
Mean Absolute Error:
Xm is training data in node m。