Blog of Samperson

决策树——Sklearn库实现

2018-06-18

决策树简介

输入 输出 适用的数据集 说明
决策树 决策树+用于构造树的所有类标签向量执行分类 决策结果 适合处理有缺失属性的高维数据样本;对于各类别样本数量不一致的数据,信息增益的结果偏向于那些具有更多数值的特征。 不支持在线学习,在新样本到来后,决策树需要全部重建;容易出现过拟合。
计算简单,易于理解,可解释性强;能够处理不相关的特征;在相对短的时间内能够对大型数据源做出可行且效果良好的结果;忽略了数据之间的相关性。

[1] 决策树是一个非参数的监督式学习方法,主要用于分类和回归。算法的目标是通过推断数据特征,学习决策规则从而创建一个预测目标变量的模型。
[2] DecisionTreeClassifier 能够实现多类别的分类。
[3] 输入两个向量:向量X,大小为[n_samples, n_features],用于记录训练样本;
向量Y,大小为[n_samples],用于存储训练样本的类标签。

Demo

1
2
3
4
5
6
7
8
from sklearn import tree

X = [[0, 0], [1, 1]]
Y = [0, 1]
clf = tree.DecisionTreeClassifier().fit(X, Y)

clf.predict([[2., 2.]]) # 用来预测分类
clf.predict_proba([[2., 2.]]) # 每个分类的概率可以被预测,即某个叶子中该分类样本的占比

重要的参数

[1] criterion,节点分割标准,规定了该决策树所采用的的最佳分割属性的判决方法,有两种:“gini”(默认按照GINI基尼系数分割),“entropy”(使用信息熵作为划分标准)。


[2] min_weight_fraction_leaf,限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起分割。
默认是0——不考虑权重问题
有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重——注意这个值。


[3]-[7]

样本量不大 样本量大
splitter 默认best,在特征的所有划分点中找出最优的划分点 random,随机的在部分划分点中找局部最优的划分点
max_features,划分时考虑的最大特征数 默认是None,节点会一直扩展直到全部分开,或者小于min_samples_split samples设定值 推荐限制最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间
max_depth,限定了决策树的最大深度,对于防止过拟合非常有用 默认是None,节点会一直扩展直到全部分开,或者小于min_samples_split samples设定值 推荐限制最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间
min_samples_split,内部节点再划分所需样本数目,除了整数外,也可以设置成样本数目的百分比 默认是2 推荐增大这个值
min_samples_leaf,限定了叶子节点包含的最小样本数,如果某子节点进行划分后的叶子节点所含样本数少于该给定值,则停止该子节点的划分,否则继续划分 默认是1 推荐增大这个值



[8] max_leaf_nodes,最大叶子节点数。默认是None,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。
特征不多——不考虑这个值
特征多的话——加以限制,具体的值可以通过交叉验证得到。


[9] class_weight,类别权重,指定样本各类别的的权重,主要是为了防止训练集某些类别的样本过多,导致训练的决策树过于偏向这些类别
balanced——算法会自己计算权重,样本量少的类别所对应的样本权重会高。
默认的None——如果你的样本类别分布没有明显的偏倚,则可以不管这个参数
自己指定各个样本的权重
回归树:不适用回归树


[10] random_state
int——random_state是随机数字发生器的种子
RandomState——random_state是随机数字发生器
None——随机数字发生器是np.random使用的RandomState instance


[11] min_impurity_split,最小不纯度值分割,提前停止的应用策略,一个节点只有其不纯度值大于该阈值时才会被分割,否则该节点为叶子结点,不再分割。


[12] presort,样本是否预排序,默认是False不排序。一般来说,如果样本量少或者限制了一个深度很小的决策树,设置为true可以让划分点选择更加快,决策树建立的更加快。如果样本量太大的话,反而没有什么好处。一般不用设置。

重要的属性方法

[1] n_classes_:决策树中的类数量。
[2] classes_:返回决策树中的所有种类标签。
[3] feature_importances_:特征重要度,值越大那么越重要。
[4] n_features_:Fit函数产生的特征数目
[5] n_outputs_:Fit函数输出结果数目
[6] tree_:产生的树对象

重要的方法

[1] predict(X):送入样本X,得到决策树的预测。可以同时送入多个样本。
[2] transform(X, threshold=None):返回X的较重要的一些feature,相当于裁剪数据。
[3] score(X, y, sample_weight=None):返回在数据集X,y上的测试分数,正确率。
[4] fit(X, y, sample_mask=None, X_argsorted=None, check_input=True, sample_weight=None) :将数据集x,和标签集y送入分类器进行训练,这里要注意一个参数是:sample_weright,它和样本的数量一样长,所携带的是每个样本的权重。
[5] get_params(deep=True):得到决策树的各个参数。
[6] set_params(**params):调整决策树的各个参数。

使用建议

[1] 当数据中的feature较多时,一定要有足够的数据量来支撑算法,不然的话很容易过拟合
[2] PCA是一种避免高维数据过拟合的办法
[3] 从一棵较小的树开始探索,用export方法打印出来看看。
[4] 善用max_depth参数,缓慢的增加并测试模型,找出最好的那个depth
[5] 善用min_samples_split和min_samples_leaf参数来控制叶子节点的样本数量,防止过拟合
[6] 平衡训练数据中的各个种类的数据,防止一个种类的数据dominate

官网示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import numpy as np
import matplotlib.pyplot as plt

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier

n_classes = 3
plot_colors = "bry"
plot_step = 0.02

iris = load_iris()

for pairidx, pair in enumerate([[0, 1], [0, 2], [0, 3],
[1, 2], [1, 3], [2, 3]]):
X = iris.data[:, pair]
y = iris.target

clf = DecisionTreeClassifier().fit(X, y)

plt.subplot(2, 3, pairidx + 1)

x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, plot_step),
np.arange(y_min, y_max, plot_step))

Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
cs = plt.contourf(xx, yy, Z, cmap=plt.cm.Paired)

plt.xlabel(iris.feature_names[pair[0]])
plt.ylabel(iris.feature_names[pair[1]])
plt.axis("tight")

for i, color in zip(range(n_classes), plot_colors):
idx = np.where(y == i)
plt.scatter(X[idx, 0], X[idx, 1], c=color, label=iris.target_names[i],
cmap=plt.cm.Paired)

plt.axis("tight")

plt.suptitle("Decision surface of a decision tree using paired features")
plt.legend()
plt.show()

决策树算法

[1] ID3(Iterative Dichotomiser 3,迭代二叉树 第3代)创建了一个多叉树,并(以一种贪婪的方式)寻找每个节点上的分类特征,并为分类目标获取出最大的信息收益。一般这种算法生成的树都会”生长”到最大尺寸,所以经常需要一个修剪阶段来提高其应用在新数据上的能力。
[2] C4.5 是 ID3 算法的后继者,它通过动态地定义离散参数(基于数值变量),将连续的属性值转化为一组间距离散来取消特征必须是分类型的这一约束条件。C4.5将经过训练的树(即经过ID3算法输出的多叉树)转化为一个”如果…即…”的规则组。然后这些规则组将会通过评估后,以确定其排序位置。如果树的准确度没有提高,那么将会通过去除一些规则来完成修剪操作。
[3] C5.0 是昆兰根据其所有权下对该算法的最新版本。比起C4.5,它占用的内存更少,建立出的规则组规模更小,但精准度更高。
[4] CART(Classification and Regression Trees,分类与回归树)跟 C4.5 相比很相似,但是其不同点在于它(在回归问题)支持数值的目标变量和不需要计算规则组。CART 通过在每个节点上使用特征和阈值来产生出最大的信息收益。
scikit-learn中使用的CART算法是经过优化后的版本。

交叉参见

适于二分类的机器学习算法SVM卷积神经网络

参考资料

[1] http://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html#sklearn.tree.DecisionTreeClassifier
[2] https://www.cnblogs.com/zhaoxy/p/5054938.html
[3] https://www.cnblogs.com/AlwaysT-Mac/p/6647192.html
[4] https://blog.csdn.net/lihou1987/article/details/71125145
[5] https://www.jianshu.com/p/0724dde480f0