决策树学习
参考文献:李航《统计学习方法》,sklearn官方文档
决策树介绍
决策树是一种监督学习算法,可以用来解决分类和回归的问题。适合处理一些离散的属性,对于一些连续的属性可以通过分割来进行离散化。输出也是一些离散的值。
决策树的学习算法包括三个部分:特征选择,树的生成和树的剪枝。常用的算法ID3, C4.5和CART
特征选择:特征选择的目的在于寻找对训练数据能够分类的特征。
特征选择的关键在于准则。常用的准则有:信息增益,信息增益比,基尼系数
决策树生成:首先选用某种准则用来进行特征选择。根据该准则,选取进行分类的某个特征,根据选取的特征划分数据集。然后在划分后的数据集中递归的使用该方法,从而产生决策树。
树的剪枝:生成的决策树可能存在过拟合问题,需要对它进行剪枝。首先构造决策树的损失函数,然后通过最小化损失函数来进行剪枝。
sklearn包中的决策树使用
在强大的机器学习库sklearn中已经集成了决策树模型,所以我们可以利用该模块方便的实施决策树学习。下面介绍一些常用的方法:
class sklearn.tree.DecisionTreeClassifier ( criterion=’gini’ , splitter=’best’ , max_depth=None , min_samples_split=2 , min_samples_leaf=1 , max_features=None , random_state=None , min_density=None , compute_importances=None , max_leaf_nodes=None )
在创建一个决策树分类器时,我们有很多参数可以初始化,其中主要需要考虑的是:
criterion :规定了该决策树所采用的的最佳分割属性的判决方法,有两种:“gini”,“entropy”。
max_depth :限定了决策树的最大深度,对于防止过拟合非常有用。
min_samples_leaf :限定了叶子节点包含的最小样本数,这个属性对于防止上文讲到的数据碎片问题很有作用。
模块中一些重要的属性方法:
n_classes _ :决策树中的类数量。
classes_ :返回决策树中的所有种类标签。
feature_importances_ :feature的重要性,值越大那么越重要。
fit ( X , y , sample_mask=None , X_argsorted=None , check_input=True , sample_weight=None )
将数据集x,和标签集y送入分类器进行训练,这里要注意一个参数是:sample_weright,它和样本的数量一样长,所携带的是每个样本的权重。
get_params ( deep=True ) 得到决策树的各个参数。
set_params ( **params ) 调整决策树的各个参数。
predict ( X ) 送入样本X,得到决策树的预测。可以同时送入多个样本。
transform ( X , threshold=None ) 返回X的较重要的一些feature,相当于裁剪数据。
score ( X , y , sample_weight=None ) 返回在数据集X,y上的测试分数,正确率。
下面是一个应用的例子:
from sklearn import tree
X = [[0, 0], [1, 1]]
Y = [0, 1]
clf = tree.DecisionTreeClassifier()
clf = clf.fit(X, Y)
clf.predict([[2., 2.]])
可视化
利用python中的pydot模块可以方便的输出决策树的效果图,不过需要注意的是pyparsing必须是旧版本的,比如1.5,另外需要在电脑商安装 Graphviz软件。下面是一个例子:
from sklearn.externals.six import StringIO
import pydot
dot_data = StringIO.StringIO()
tree.export_graphviz(clf, out_file=dot_data)
graph = pydot.graph_from_dot_data(dot_data.getvalue())
graph.write_pdf(“iris.pdf”)
sklearn决策树使用建议
Decision trees tend to overfit on data with a large number of features. Getting the right ratio of samples to number of features is important, since a tree with few samples in high dimensional space is very likely to overfit.
对于特征很多但样本很少的数据,决策树很容易导致过拟合,对特征进行采样很重要。
Consider performing dimensionality reduction (PCA, ICA, or Feature selection) beforehand to give your tree a better chance of finding features that are discriminative.
事先考虑采用PCA,ICA,特征选择来发现区分度比较高的特征
Visualise your tree as you are training by using the export function. Use max_depth=3 as an initial tree depth to get a feel for how the tree is fitting to your data, and then increase the depth.
采用export方法可视化决策树,刚开始构建决策树时, 使用max_depth =3得到一个较低的树,然后感觉一下数据和决策树是否匹配,然后逐渐增高。
使用max_depth 来防止过度拟合
Use min_samples_split or min_samples_leaf to control the number of samples at a leaf node. A very small number will usually mean the tree will overfit, whereas a large number will prevent the tree from learning the data. Try min_samples_leaf=5 as an initial value.
使用min_samples_split 和 min_samples_leaf 来控制叶子节点的样本数。叶节点样本数量过小往往意味着过拟合。 然而样本数量过大又会导致无法从数据中发现有用信息。
Balance your dataset before training to prevent the tree from being biased toward the classes that are dominant.
容易被类别中占多数的类影响而产生bias,所以推荐在送入算法之间先平衡下数据中各个类别所占的比例
All decision trees use np.float32 arrays internally.
所有的树都采用np.float32数组