决策树是一个非参数的监督式学习方法,主要用于分类和回归。算法的目标是通过推断数据特征,学习决策规则从而创建一个预测目标变量的模型。如下如所示,决策树通过一系列if-then-else 决策规则 近似估计一个正弦曲线。

决策树优势:

  • 简单易懂,原理清晰,决策树可以实现可视化
  • 数据准备简单。其他的方法需要实现数据归一化,创建虚拟变量,删除空白变量。(注意:这个模块不支持缺失值)
  • 使用决策树的代价是数据点的对数级别。
  • 能够处理数值和分类数据
  • 能够处理多路输出问题
  • 使用白盒子模型(内部结构可以直接观测的模型)。一个给定的情况是可以观测的,那么就可以用布尔逻辑解释这个结果。相反,如果在一个黑盒模型(ANN),结果可能很难解释
  • 可以通过统计学检验验证模型。这也使得模型的可靠性计算变得可能
  • 即使模型假设违反产生数据的真实模型,表现性能依旧很好。

决策树劣势:

  • 可能会建立过于复杂的规则,即过拟合。为避免这个问题,剪枝、设置叶节点的最小样本数量、设置决策树的最大深度有时候是必要的。
  • 决策树有时候是不稳定的,因为数据微小的变动,可能生成完全不同的决策树。 可以通过总体平均(ensemble)减缓这个问题。应该指的是多次实验。
  • 学习最优决策树是一个NP完全问题。所以,实际决策树学习算法是基于试探性算法,例如在每个节点实现局部最优值的贪心算法。这样的算法是无法保证返回一个全局最优的决策树。可以通过随机选择特征和样本训练多个决策树来缓解这个问题。
  • 有些问题学习起来非常难,因为决策树很难表达。如:异或问题、奇偶校验或多路复用器问题
  • 如果有些因素占据支配地位,决策树是有偏的。因此建议在拟合决策树之前先平衡数据的影响因子。
import numpy asnp
 
 
from sklearn.tree import DecisionTreeRegressor
 
 
import matplotlib.pyplot asplt
 
 

     
 
 
 
# Create a random dataset
 
 
rng=np.random.RandomState(1)
 
 
X=np.sort(5*rng.rand(80,1),axis=0)
 
 
y=np.sin(X).ravel()
 
 
y[::5]+=3*(0.5-rng.rand(16))
 
 

     
 
 
 
# Fit regression model
 
 
regr_1=DecisionTreeRegressor(max_depth=2)
 
 
regr_2=DecisionTreeRegressor(max_depth=5)
 
 
regr_1.fit(X,y)
 
 
regr_2.fit(X,y)
 
 

     
 
 
 
# Predict
 
 
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)
 
 

     
 
 
 
# Plot the results
 
 
plt.figure()
 
 
plt.scatter(X,y,c="darkorange",label="data")
 
 
plt.plot(X_test,y_1,color="cornflowerblue",label="max_depth=2",linewidth=2)
 
 
plt.plot(X_test,y_2,color="yellowgreen",label="max_depth=5",linewidth=2)
 
 
plt.xlabel("data")
 
 
plt.ylabel("target")
 
 
plt.title("Decision Tree Regression")
 
 
plt.legend()
 
 
plt.show()

多输出问题

多输出问题时需要预测多个输出的监督式学习问题。即Y是一个2d的向量,大小为[n_samples, n_outputs]。

当输出之间不相关时,一个简单的解决办法是建立n个独立模型。对于每一个输出,使用这些模型独立预测这每个输出。由于输出是和相同的输入相关的,所以一个更好的办法是建立一个能够持续预测所有输出的单一模型。首先,系统需要的训练时间更少了,因为只建立了一个模型。其次准确性也会得到提高。

决策树的策略需要修改以支持多分类问题。

  • 叶子上存储n个输出变量
  • 使用不同的标准计算所有n输出的平均减少

这一节是关于 DecisionTreeClassifier 和DecisionTreeRegressor的一些知识点。如果一个决策树的输出向量Y大小为[n_samples, n_outputs],预测量有:

  • predict:输出n个预测值
  • predict_proba:输出有n个输出的向量组成的列表。

多输出的回归的例子:输入X是一个单一的值,输出Y是输入X的Sine和Cosine


函数

函数功能

apply(X[, check_input])

返回每个样本的叶节点的预测序号

decision_path(X[, check_input])

返回决策树的决策路径 [n_samples, n_nodes]

fit(X, y[, sample_weight, check_input, …])

从训练数据建立决策树,返回一个对象

fit_transform(X[, y])

将数据X转换[n_samples, n_features_new]

get_params([deep])

得到估计量的参数,返回一个映射

predict(X[, check_input])

预测X的分类或者回归,返回[n_samples]

predict_log_proba(X)

预测输入样本的对数概率,返回[n_samples, n_classes]

predict_proba(X[, check_input])

预测输入样本的属于各个类的概率[n_samples, n_classes]

score(X, y[, sample_weight])

返回对于测试数据的平均准确率

set_params(**params)

设置估计量的参数

transform(*args, **kwargs)

将输入参数X减少的最重要的特征,返回[n_samples, n_selected_features]