决策树(decision tree)用来分类和回归的无参监督学习方法。创建模型,从数据特征学习简单决策规则来预测目标变量的值。
优势:
1,易理解。2,需要的训练数据少。3,训练树模型时间复杂度是参与训练的点的对数值。4,能处理数值和分类型数据。5,能处理多路输出问题。6,白盒模型。
缺点:
1,容易过拟合。2,树可能不稳定。3,在多方面性能最优和简单化概念的要求下,学习一棵最优决策树通常是一个NP难问题。因此,实际的决策树学习算法是基于启发式算法,例如在每个节点进 行局部最优决策的贪心算法。4,有些概念很难被决策树学习到,因为决策树很难清楚的表述这些概念。5,如果某些类在问题中占主导地位会使得创建的决策树有偏差。参考/摘自
基于iris data画决策树的决策面
For each pair of iris features, the decision tree learns decision boundaries made of combinations of simple thresholding rules inferred from the training samples. 选取一对特征,决策树会得到一系列简单的阈值规则。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier, plot_tree
plot_step = 0.02
plot_colors = 'ryb'
n_classes = 3
iris = load_iris()
#这里仅取2个特征
for pairindex, pair in enumerate([[0,1],[0,2],[0,3],[1,2],[1,3],[2,3]]):
X = iris.data[:,pair]
y = iris.target
clf = DecisionTreeClassifier().fit(X,y)
plt.subplot(2,3,pairindex+1) #构建6个决策图,第一个图要从1开始,故pairindex+1
x_min, x_max = X[:,0].min() -1, X[:,0].max() +1
y_min, y_max = X[:,1].min() -1, X[:,1].max() +1
#meshgrid(a,b),xx和yy为(len(b),len(a))的二阶矩阵。xx为len(a)的a重复len(b)列,yy同理
xx, yy = np.meshgrid(np.arange(x_min, x_max, plot_step),
np.arange(y_min, y_max, plot_step))
plt.tight_layout(h_pad=0.5, w_pad=0.5, pad=2.5)
#.ravel()将数据一维化,np.c_将其整合为(len(a)*len(b),2)的测试矩阵。
Z = clf.predict(np.c_[xx.ravel(),yy.ravel()])
Z = Z.reshape(xx.shape)
#contourf构建等高线
cs = plt.contourf(xx, yy, Z, cmap=plt.cm.RdYlBu)
plt.xlabel(iris.feature_names[pair[0]])
plt.ylabel(iris.feature_names[pair[1]])
for i, color in zip(range(n_classes), plot_colors):
#对类别i找到对应的位置索引。一位数组时候返回的值是一维的索引。二维时候范围2组索引数
idx = np.where(y == i)
plt.scatter(X[idx,0], X[idx,1],c=color,label=iris.target_names[i],
cmap=plt.cm.RdYlBu, edgecolor='black',s=15)
plt.suptitle("Decision surface of a decision tree using paired features")
plt.legend(loc='lower right', borderpad=0, handletextpad=0)
plt.axis("tight")
plt.figure()
clf = DecisionTreeClassifier().fit(iris.data, iris.target)
plot_tree(clf, filled=True)
plt.show()
决策树回归
print(__doc__)
# Import the necessary modules and libraries
import numpy as np
from sklearn.tree import DecisionTreeRegressor
import matplotlib.pyplot as plt
# Create a random dataset
rng = np.random.RandomState(1) #设定一个randomstate,保持每次生成的随机数的一致性
X = np.sort(5 * rng.rand(80, 1), axis=0) #生成(80,1)的随机数组,按列排序
y = np.sin(X).ravel() #sin之后转为一维数组
y[::5] += 3 * (0.5 - rng.rand(16)) #每隔5个数构建随机性
# Fit regression model
regr_1 = DecisionTreeRegressor(max_depth=2) #max_depth如果太高,则会更受噪音影响
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] #[:,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, s=20, edgecolor="black",
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()
实操技巧
1, 保持样本/特质 比例,少样本高维特征易过拟合。
2,提前降维(PCA, ICA等)
3,用export
可视化树,一般一开始用max_depth=3试探看下树对数据的分类,再增加深度。
…更多详见
常见决策树
ID3:使用信息增益,偏好取值多的属性
C4.5:信息增益率,偏好取值少的属性
CART:基尼指数,基尼表示随机抽取2个样本,标记不一致的概率。