基本流程
决策树的基本流程如下:
数据准备:收集并整理数据集,包括特征和目标变量。
选择划分特征:根据某种标准选择最优特征进行划分。
生成子树:对每个划分后的子集递归地重复上述步骤,直到满足停止条件(如所有样本属于同一类、达到最大深度、没有特征可用等)。
剪枝处理:对生成的决策树进行剪枝,以减少过拟合。
模型评估:使用测试集评估模型性能。
对于西瓜问题的一颗决策树,如下表示
从上至下依次判断某个西瓜的色泽、根蒂、敲声,若这三个属性都符合标准,则为好瓜,若任意一个属性不符合标准,则不是好瓜。
一般的,一棵决策树包含一个根结点、若干个内部结点和若干个叶结点;叶结点对应于决策结果,其他每个结点则对应于一个属性测试;每个结点包含的样本集合根据属性测试的结果被划分到子结点中;根结点包含样本全集。从根结点到每个叶结点的路径对应了一个判定测试序列。
决策树遵循如下“分而自治”的流程策略
划分选择
信息增益:衡量通过某特征划分数据集后信息的不确定性减少。
I
G
(
D
,
A
)
=
H
(
D
)
−
H
(
D
∣
A
)
IG(D, A) = H(D) - H(D|A)
IG(D,A)=H(D)−H(D∣A)其中,H(D)是是数据集D的熵,H(D|A) ) 是在特征A条件下的熵。
信息增益比:信息增益在特征的固有熵上的归一化,避免偏向于多值特征。
基尼指数:用于衡量数据集的不纯度,值越小表示数据集越纯。
G
i
n
i
(
D
)
=
1
−
∑
i
=
1
C
p
i
2
Gini(D) = 1 - \sum_{i=1}^{C} p_i^2
Gini(D)=1−i=1∑Cpi2其中,
p
i
p_i
pi是类 ( i ) 在数据集 ( D ) 中的比例。
以下是使用 Python 的 sklearn 库构建决策树的示例:
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn import tree
import matplotlib.pyplot as plt
# 加载数据集
iris = load_iris()
X = iris.data
y = iris.target
# 划分训练集与测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 创建决策树分类器
clf = DecisionTreeClassifier(criterion='gini') # 可以选择'entropy'或'gini'
clf.fit(X_train, y_train)
# 预测
y_pred = clf.predict(X_test)
# 可视化决策树
plt.figure(figsize=(10, 8))
tree.plot_tree(clf, filled=True)
plt.title("Decision Tree Visualization")
plt.show()
决策树如下:
剪枝处理
剪枝是减少决策树复杂度的过程,主要分为两种类型:预剪枝和后剪枝
预剪枝
预剪枝:在树构建过程中,如果某个节点的划分不再显著提高模型性能,则停止划分。
后剪枝
后剪枝:先构建完整的决策树,然后通过交叉验证等方法去除不必要的节点。
对上面决策树进行后剪枝操作之后如下
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import cross_val_score
# 创建完整的决策树
full_tree = DecisionTreeClassifier()
full_tree.fit(X_train, y_train)
# 交叉验证评估
scores = cross_val_score(full_tree, X, y, cv=5)
print("Cross-validated scores:", scores)
# 剪枝
pruned_tree = DecisionTreeClassifier(max_depth=3) # 限制树的深度
pruned_tree.fit(X_train, y_train)
# 评估剪枝后的树
pruned_scores = cross_val_score(pruned_tree, X, y, cv=5)
print("Pruned tree cross-validated scores:", pruned_scores)
结果为:
连续与缺失值
连续值处理
决策树能够处理连续值特征,方法是寻找最佳的切分点。例如,将特征值分为两部分(小于某个值和大于等于某个值)。
缺失值处理
决策树可以通过以下几种方式处理缺失值:
忽略缺失值:在计算信息增益时忽略缺失值。
使用众数或平均值填充:在划分前用特征的众数或平均值填充缺失值。
分支处理:为缺失值单独创建一个分支。
多变量决策树
多变量决策树是指在每个节点上使用多个特征进行划分,而不仅仅是单一特征。这种方法可以在某些情况下提高模型的性能,但也可能导致更复杂的树结构。
对于上述在西瓜数据集2.0α上基于信息增益生成的决策树来说, 将它作为训练集可学得图4.10所示的决策树,这棵树所对应的分类边界如图 4.11所示。
以下是使用 sklearn 的 DecisionTreeClassifier,并通过 max_features 参数来实现多变量划分:
# 创建多变量决策树
multi_var_tree = DecisionTreeClassifier(max_features=2) # 使用两个特征进行划分
multi_var_tree.fit(X_train, y_train)
# 预测与评估
multi_var_pred = multi_var_tree.predict(X_test)
multi_var_score = multi_var_tree.score(X_test, y_test)
print("Multi-variable Decision Tree Accuracy:", multi_var_score)
# 可视化多变量决策树
plt.figure(figsize=(10, 8))
tree.plot_tree(multi_var_tree, filled=True)
plt.title("Multi-variable Decision Tree Visualization")
plt.show()
结果如下:
总结
决策树是一种强大的模型,适用于分类和回归任务。通过选择合适的划分标准、剪枝策略以及处理连续和缺失值的方法,可以有效提升模型的性能。多变量决策树提供了一种灵活的方式来利用多个特征进行划分,从而提高预测能力。