机器学习 | 决策树的深度是如何影响预测精度的?

发布于:2024-10-16 ⋅ 阅读:(13) ⋅ 点赞:(0)

决策树是一种流行的机器学习模型,由于其简单性和解释性。它们的工作原理是基于提供最多信息增益的特征递归地将数据集分割为子集。决策树模型中的一个关键参数是树的最大深度,它决定了树可以生长到多深。在本文中,我们将探讨决策树的深度变化如何影响其预测精度。

什么是决策树?

决策树(Decision Tree)是一种非参数的有监督学习方法,能够从一系列有特征和标签的数据中总结出决策规则,并用树状图的结构来呈现这些规则,以解决分类和回归的问题。它基于树结构来进行决策,这恰是人类在面临决策问题时一种很自然的处理机制。

决策树模型呈树形结构,在分类问题中,表示基于特征对数据进行分类的过程。每个内部节点表示在属性上的一个测试,每个分支代表一个测试输出,每个叶节点代表一种类别。

举个例子,假设一位母亲在给女儿介绍对象时,有这么一段对话:

母亲:“给你介绍个对象。”
女儿:“年纪多大了?”
母亲:“26。”
女儿:“长的帅不帅?”
母亲:“挺帅的。”
女儿:“收入高不?”
母亲:“不算很高,中等情况。”
女儿:“是公务员不?”
母亲:“是,在税务局上班呢。”
女儿:“那好,我去见见。”

这个女生的决策过程就是典型的分类决策树。她基于对象的年龄、外貌、收入和职业等特征,通过一系列的问题和回答,最终做出了是否去见这个对象的决策。这个决策过程可以用决策树来清晰地表示和理解。

在决策树的学习过程中,两个核心问题是如何从数据表中找出最佳节点和最佳分支,以及如何让决策树停止生长,防止过拟合。通过合理的构建和剪枝,可以得到泛化能力强、处理未见示例能力强的决策树。

总的来说,决策树是一种直观且有效的决策工具,能够帮助人们根据一系列的特征和条件做出合理的决策。

什么是决策树的深度?

决策树的深度是指从根节点到最远叶子节点的最长路径上的节点数。换句话说,它表示了决策树在进行数据分类或回归时,需要经过的最多决策步骤数。

在决策树的构建过程中,树的深度是一个重要的参数,因为它决定了模型的复杂度和学习能力。较深的决策树能够捕获数据中的更多细节和复杂关系,但也可能导致过拟合,即模型对训练数据过度匹配,而对新数据的泛化能力较差。相反,较浅的决策树可能更简单,更容易解释,但可能无法充分捕获数据中的关键信息。

决策树深度对预测精度有什么影响?

决策树的深度对预测精度具有显著影响。决策树的深度决定了模型在拟合数据时的复杂程度。以下是对决策树深度与预测精度之间关系的详细解释:

  1. 欠拟合与过拟合:

当决策树的深度较小时,模型可能过于简单,无法充分捕获数据中的关键信息和复杂关系,这可能导致欠拟合。欠拟合的模型在训练集和测试集上的性能都可能较差,因为它没有充分学习到数据的内在规律。

当决策树的深度过大时,模型可能过于复杂,对训练数据中的噪声和细节过于敏感,这可能导致过拟合。过拟合的模型在训练集上的性能可能很好,但在测试集上的性能会下降,因为它对新数据的泛化能力较差。

  1. 平衡深度与精度:

选择合适的决策树深度是平衡欠拟合和过拟合的关键。较深的树能够捕获更多的数据细节,但也可能导致过拟合;而较浅的树可能更简单、更易于解释,但可能无法充分学习数据。

通常情况下,随着决策树深度的增加,模型在训练集上的性能会提高,但在测试集上的性能可能会先提高后降低。因此,需要通过交叉验证等方法找到最佳的决策树深度,以在训练集和测试集上都获得较好的性能。

  1. 剪枝技术:

为了防止过拟合,提高预测精度,通常会采用剪枝技术来限制决策树的深度。剪枝包括预剪枝和后剪枝两种方法。预剪枝是在构建决策树的过程中提前停止树的生长,如设置最大深度;后剪枝是在决策树构建完成后对其进行简化,去除一些不必要的分支。

实践案例

import numpy as np  
from sklearn.datasets import make_classification  
from sklearn.model_selection import train_test_split  
from sklearn.tree import DecisionTreeClassifier  
from sklearn.metrics import accuracy_score  
  
# 创建一个分类数据集  
X, y = make_classification(n_samples=10000, n_features=4, n_informative=2, n_redundant=0, random_state=0, shuffle=False)  
  
# 划分训练集和测试集  
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)  
  
# 定义一系列不同的决策树深度  
depths = [1, 3, 5, 7, 9]  
accuracies = []  
  
# 对每个深度训练一个决策树,并评估其在测试集上的精度  
for depth in depths:  
    clf = DecisionTreeClassifier(max_depth=depth, random_state=42)  
    clf.fit(X_train, y_train)  
    y_pred = clf.predict(X_test)  
    accuracies.append(accuracy_score(y_test, y_pred))  
  
# 打印每个深度的精度  
for depth, accuracy in zip(depths, accuracies):  
    print(f"Decision Tree depth: {depth}, Accuracy: {accuracy:.4f}")

输出

Decision Tree depth: 1, Accuracy: 0.8250
Decision Tree depth: 3, Accuracy: 0.8440
Decision Tree depth: 5, Accuracy: 0.8835
Decision Tree depth: 7, Accuracy: 0.8925
Decision Tree depth: 9, Accuracy: 0.8985

可视化深度对预测精度的影响

def max_depth_error(max_depths):
    model = DecisionTreeClassifier(max_depth=max_depths, random_state=42)
    model.fit(X_train, y_train)
    train_error = 1 - model.score(X_train, y_train)
    test_error = 1 - model.score(X_test, y_test)
    return {"Max Depth": max_depths, "Train error": train_error, "Test Error": test_error}
 
 
max_depth_Df = pd.DataFrame([max_depth_error(md) for md in range(1, 15)])
max_depth_Df

输出

	Max Depth	Train error	Test Error
0	1	0.175250	0.1750
1	2	0.175250	0.1750
2	3	0.157250	0.1560
3	4	0.128375	0.1275
4	5	0.107625	0.1165
5	6	0.092375	0.1020
6	7	0.083250	0.1075
7	8	0.071625	0.1015
8	9	0.060125	0.1015
9	10	0.050625	0.1085
10	11	0.041500	0.1075
11	12	0.034250	0.1145
12	13	0.026750	0.1210
13	14	0.021375	0.1255

绘制曲线

plt.figure()
plt.plot(max_depth_Df['Max Depth'], max_depth_Df['Train error'])
plt.plot(max_depth_Df['Max Depth'], max_depth_Df['Test Error'])
plt.title('Train vs. Test Error')
plt.xticks(range(0,21, 2))
plt.xlabel('Max. Depth')
plt.ylabel('Prediction Error (1 - Accuracy)')
plt.legend(['Train', 'Test'])

在这里插入图片描述

  • 在本例中,您可以看到蓝色(训练集)和橙色(测试集)。
  • 随着深度的增加,训练集预测误差(平均精度)变得更好,而测试集预测误差(平均精度)变得更差。
  • 因此,我们必须找到一个最佳点,使训练和测试精度几乎相同。
  • 通过观察,深度为4时最佳。

现在,使用max_depth = 4初始化并训练模型。

model = DecisionTreeClassifier(max_depth=4,random_state=42)
model.fit(X_train,y_train)

train_s = model.score(X_train,y_train)
test_s = model.score(X_test,y_test)
print(f"训练精度: {train_s}, 测试精度: {test_s}")

输出

训练精度: 0.871625, 测试精度: 0.8725

通过比较不同深度的决策树的精度,你可以观察到决策树深度对预测精度的影响。通常,你会发现在某个深度范围内,精度会随着深度的增加而提高,但超过某个点后,精度可能会开始下降,这通常是由于过拟合导致的。因此,选择适当的深度是避免过拟合和提高泛化能力的重要步骤。在实际应用中,你可以使用交叉验证等技术来选择合适的决策树深度。