决策树分类器:
DecisionTreeClassifier既能执行二分类(标签为[0,1]),也能执行多分类(标签为[0,1,...,k-1])
DecisionTreeClassifier采用输入两个数组:数组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)
执行通过之后,可以使用该模型来预测样本类别:
clf.predict([[2., 2.]])
也可以预测每个类的概率,这个概率是叶中相同类的训练样本的分数
clf.predict_proba([[2., 2.]])
经过训练,我们可以使用 export_graphviz
导出器以 Graphviz 格式导出决策树:
决策树回归器:
DecisionTreeClassifier决策树通过使用 DecisionTreeRegressor
类也可以用来解决回归问题。如在分类设置中,拟合方法将数组X和数组y作为参数,只有在这种情况下,y数组预期才是浮点值
多值输出问题:
构建能够同时预测所有n个输出的单个模型。
这需要以下更改:
1、叶中存储n个输出值,而不是一个
2、通过计算所有n个输出的平均减少量来作为分类标准
该模块通过在 DecisionTreeClassifier
和 DecisionTreeRegressor
中实现该策略来支持多输出问题。如果决策树与大小为 [n_samples, n_outputs]
的输出数组Y向匹配,则得到的估计器:
1、predict是输出n_output的值
2、在predict_proba上输出
n_output数组列表
Python代码如下:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeRegressor
# Create a random dataset
rng = np.random.RandomState(1)
X = np.sort(200*rng.rand(100,1) - 100, axis = 0)
#axis = 0 为列维度
y = np.array([np.pi * np.sin(X).ravel(),np.pi * np.cos(X).ravel()]).T
#ravel()将多维数组转为一维数组,返回的是视图,如果修改会修改原始矩阵,.T为求数组的转置数组
y[::5,:] += (0.5 - rng.rand(20,2))
#fit regression model
regr_1 = DecisionTreeRegressor(max_depth=2)
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)
#predict
X_test = np.arange(-100.0,100.0,0.01)[:,np.newaxis]
y_1 = regr_1.predict(X_test)
y_2 = regr_2.predict(X_test)
y_3 = regr_3.predict(X_test)
#plot the result
plt.figure()
s = 25
plt.scatter(y[:,0],y[:,1],c="navy",s=s,edgecolor='black',label='data')
plt.scatter(y_1[:, 0], y_1[:, 1], c="cornflowerblue", s=s,edgecolor="black", label="max_depth=2")
plt.scatter(y_2[:, 0], y_2[:, 1], c="red", s=s,edgecolor="black", label="max_depth=5")
plt.scatter(y_3[:, 0], y_3[:, 1], c="orange", s=s,edgecolor="black", label="max_depth=8")
plt.xlim([-6,6])
plt.ylim([-6,6])
#限定x轴、y轴上下限制
plt.xlabel("target 1")
plt.ylabel("target 2")
plt.title("Multi-output Decision Tree Regression")
plt.legend(loc = "best")
plt.show()
figure:
该决策树用于同时预测给定单一潜在特征的圆的噪声x和y观测值。因此,它学习近似圆的局部线性回归。我们可以看到,如果树的最大深度(由max_depth参数控制)设置得过高,决策树就会学习到训练数据的过于精细的细节,并从噪声中学习,即过度拟合。
决策树算法
ID3(Iterative Dichotomiser 3)由 Ross Quinlan 在1986年提出。该算法创建一个多路树,找到每个节点(即以贪心的方式)分类特征,这将产生分类目标的最大信息增益。决策树发展到其最大尺寸,然后通常利用剪枝来提高树对未知数据的泛化能力。
C4.5 是 ID3 的后继者,并且通过动态定义将连续属性值分割成一组离散间隔的离散属性(基于数字变量),消除了特征必须被明确分类的限制。C4.5 将训练的树(即,ID3算法的输出)转换成 if-then 规则的集合。然后评估每个规则的这些准确性,以确定应用它们的顺序。如果规则的准确性没有改变,则需要决策树的树枝来解决。
C5.0 是 Quinlan 根据专有许可证发布的最新版本。它使用更少的内存,并建立比 C4.5 更小的规则集,同时更准确。
CART(Classification and Regression Trees (分类和回归树))与 C4.5 非常相似,但它不同之处在于它支持数值目标变量(回归),并且不计算规则集。CART 使用在每个节点产生最大信息增益的特征和阈值来构造二叉树。
scikit-learn 使用 CART 算法的优化版本。
算法具体思想再找时间补写博文。