决策树优缺点
决策树的优势:
-
便于理解和解释。树的结构可以可视化出来。
-
训练需要的数据少。其他机器学习模型通常需要数据规范化,比如构建虚拟变量和移除缺失值,不过请注意,这种模型不支持缺失值。
-
由于训练决策树的数据点的数量导致了决策树的使用开销呈指数分布(训练树模型的时间复杂度是参与训练数据点的对数值)。
-
能够处理数值型数据和分类数据。其他的技术通常只能用来专门分析某一种变量类型的数据集。详情请参阅算法。
-
能够处理多路输出的问题。
-
使用白盒模型。如果某种给定的情况在该模型中是可以观察的,那么就可以轻易的通过布尔逻辑来解释这种情况。相比之下,在黑盒模型中的结果就是很难说明清 楚地。
-
可以通过数值统计测试来验证该模型。这对事解释验证该模型的可靠性成为可能。
-
即使该模型假设的结果与真实模型所提供的数据有些违反,其表现依旧良好。
决策树的缺点包括:
- 决策树模型容易产生一个过于复杂的模型,这样的模型对数据的泛化性能会很差。这就是所谓的过拟合.一些策略像剪枝、设置叶节点所需的最小样本数或设置数的最大深度是避免出现 该问题最为有效地方法。
- 决策树可能是不稳定的,因为数据中的微小变化可能会导致完全不同的树生成。这个问题可以通过决策树的集成来得到缓解
- 在多方面性能最优和简单化概念的要求下,学习一棵最优决策树通常是一个NP难问题。因此,实际的决策树学习算法是基于启发式算法,例如在每个节点进 行局部最优决策的贪心算法。这样的算法- - 不能保证返回全局最优决策树。这个问题可以通过集成学习来训练多棵决策树来缓解,这多棵决策树一般通过对特征和样本有放回的随机采样来生成。
- 有些概念很难被决策树学习到,因为决策树很难清楚的表述这些概念。例如XOR,奇偶或者复用器的问题。
- 如果某些类在问题中占主导地位会使得创建的决策树有偏差。因此,我们建议在拟合前先对数据集进行平衡。
分类
#encoding=gbk
"""
数组X,用 [n_samples, n_features] 的方式来存放训练样本。
整数值数组Y,用 [n_samples] 来保存训练样本的类标签:
"""
from sklearn import tree
X = [[0, 0], [1, 1]]
Y = [0, 1]
clf = tree.DecisionTreeClassifier()
clf = clf.fit(X, Y)
#执行通过之后,可以使用该模型来预测样本类别:
res1 = clf.predict([[2., 2.]])
print(res1)
#也可以预测每个类的概率,这个概率是叶中相同类的训练样本的分数:
res2 = clf.predict_proba([[2., 2.]])
print(res2)
"""
DecisionTreeClassifier 既能用于二分类(其中标签为[-1,1])
也能用于多分类(其中标签为[0,…,k-1])。
使用Lris数据集,我们可以构造一个决策树
"""
from sklearn.datasets import load_iris
from sklearn import tree
iris = load_iris()
clf = tree.DecisionTreeClassifier()
clf = clf.fit(iris.data, iris.target)
"""
经过训练,我们可以使用 export_graphviz 导出器以 Graphviz 格式导出决策树
"""
install python-graphviz #安装
#导出决策树模型 在jupyter上才能展示
import graphviz
dot_data = tree.export_graphviz(clf, out_file=None)
graph = graphviz.Source(dot_data)
graph.render("iris")
#美化
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 = graphviz.Source(dot_data)
graph
回归
"""
决策树通过使用 DecisionTreeRegressor 类也可以用来解决回归问题。
如在分类设置中,拟合方法将数组X和数组y作为参数,只有在这种情况下,y数组预期才是浮点值
"""
from sklearn import tree
X = [[0, 0], [2, 2]]
y = [0.5, 2.5]
clf = tree.DecisionTreeRegressor()
clf = clf.fit(X, y)
clf.predict([[1, 1]])
官方文档:https://sklearn.apachecn.org/docs/0.21.3/11.html