机器学习——决策树(一)

决策树(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)
多输出问题

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章