决策树(DT)是用于分类和回归的非参数监督学习方法。目标是创建一个模型,通过学习从数据特征推断出的简单决策规则来预测目标变量的值。
例如,在下面的示例中,决策树从数据中学习以使用一组if-then-else决策规则来近似正弦曲线。树越深,决策规则越复杂,模型越适合。
决策树的优点
- 简单易懂和解释,直观
- 只需少量的数据准备
- 能够处理数字和分类数据
- 能够处理多输出问题
- 可以使用统计测试验证模型
决策树的缺点
- 容易过拟合
- 决策树可能不稳定
- 已知在最优性的几个方面甚至对于简单的概念,学习最优决策树的问题是NP完全的。因此,实际的决策树学习算法基于启发式算法,例如贪婪算法,其中在每个节点处进行局部最优决策。这种算法不能保证返回全局最优决策树。这可以通过在集合学习器中训练多个树来减轻,其中特征和样本随替换而被随机采样。
- 有些概念很难学习,因为决策树不容易表达它们,例如XOR,奇偶校验或多路复用器问题。
- 如果某些类占主导地位,决策树学习者会创建偏向的树。因此,建议在拟合决策树之前平衡数据集。
1、分类
决策树能够对数据集执行多类分类,将两个数组作为输入:数组X,稀疏或密集,大小 保存训练样本,以及数组Y的整数值,大小,保存训练样本的类标签:[n_samples, n_features][n_samples]。
>>> from sklearn.datasets import load_iris
>>> from sklearn import tree
>>> iris = load_iris()
>>> clf = tree.DecisionTreeClassifier()
>>> clf = clf.fit(iris.data, iris.target)
使用sklearn.datasets生成数据,并调用tree.DescisionTreeClassifier()方法对数据进行分类,如下:
In [11]: >>> import graphviz
...: >>> dot_data = tree.export_graphviz(clf, out_file=None)
...: >>> graph = graphviz.Source(dot_data)
...: >>> graph.render("iris")
...:
Out[11]: 'iris.pdf'
对数据进行可视化,输出为pdf格式:
2.回归
决策树也可以使用DecisionTreeRegressor
该类应用于回归问题 ,y应该是浮点值。
import numpy as np
from sklearn.tree import DecisionTreeRegressor
import matplotlib.pyplot as plt
# Create a random dataset
#获取随机数生成器
rng = np.random.RandomState(1)
#训练数据,并排序
X = np.sort(5 * rng.rand(100, 1), axis=0)
#数据对应的标签,并取余弦改变格式
y = np.sin(X).ravel()
y[::5] += 3 * (0.5 - rng.rand(20))
# 创建回归对象,用训练数据拟合回归模型
regr_1 = DecisionTreeRegressor(max_depth=2)
regr_2 = DecisionTreeRegressor(max_depth=5)
regr_1.fit(X, y)
regr_2.fit(X, y)
# 预测
X_test = np.arange(0.0, 5.0, 0.01)[:, np.newaxis]
y_1 = regr_1.predict(X_test)
y_2 = regr_2.predict(X_test)
3.多输出问题
多输出问题是一种监督学习问题,有几个输出要预测,构建能够预测所有n个输出的单个模型。首先,它需要较低的训练时间,因为只建立了一个估算器。其次,通常可以增加所得估计器的泛化精度。
该模块通过在DecisionTreeClassifier
和中 实现此策略,为多输出问题提供支持DecisionTreeRegressor
。如果决策树适合大小的输出数组Y,则结果估计器将:[n_samples, n_outputs]
- 输出n_output值
predict
;- 输出类概率的n_output数组列表
predict_proba
。
在多输出决策树回归中演示了使用 多输出树进行回归。在此示例中,输入X是单个实数值,输出Y是X的正弦和余弦。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeRegressor
# 生成训练数据集
#获取随机数生成器
rng = np.random.RandomState(1)
#生成训练数据,并排序
X = np.sort(200 * rng.rand(100, 1) - 100, axis=0)
#生成数据对应的标签,并取余弦改变格式
y = np.array([np.pi * np.sin(X).ravel(), np.pi * np.cos(X).ravel()]).T
y[::5, :] += (0.5 - rng.rand(20, 2))
#创建回归对象
regr_1 = DecisionTreeRegressor(max_depth=3)
regr_2 = DecisionTreeRegressor(max_depth=5)
regr_3 = DecisionTreeRegressor(max_depth=8)
#用训练数据拟合回归模型
regr_1.fit(X, y)
regr_2.fit(X, y)
regr_3.fit(X, y)
# 预测
X_test = np.arange(-100.0, 100.0, 0.01)[:, np.newaxis]
print(X_test)
y_1 = regr_1.predict(X_test)
y_2 = regr_2.predict(X_test)
y_3 = regr_3.predict(X_test)