目录
一、理论要求
1.什么是决策树?
决策树是一种监督学习算法,用于分类和回归任务。
决策树的核心是通过一系列规则对数据进行分割,直到达到预定的条件。这些规则通常是基于特征的阈值比较,例如“如果某个特征的值大于某个数,则走左边的分支,否则走右边”。这个过程会一直重复,直到满足某个停止条件,比如所有的训练样本都属于同一类别,或者已经达到了树的最大深度。最终,每个叶节点都会被分配一个预测结果,对于分类问题来说,这个结果是类别标签;对于回归问题,则是连续的数值。
2.决策树的作用
分类与预测:决策树能够根据样本的属性和值进行分类或预测。在训练阶段,它通过学习给定的训练数据集来构造一棵树,然后在分类阶段,新数据按照这棵树的规则从根节点开始,沿着不同的分支逐层划分,直到达到叶节点,从而获得分类结果。
规则提取:决策树可以生成易于理解的规则,这些规则可以直接用于新数据的预测。每个分支代表一个判断条件,而每个叶节点对应一个预测结果,这使得决策树的规则具有很高的可解释性。
特征选择:决策树在构建过程中会评估不同特征的重要性,有助于识别出对分类或预测最有影响的特征。这可以帮助我们理解哪些字段对于模型的预测结果更为关键。
3.什么是基尼指数
基尼指数是一种衡量数据不纯度的标准,常用于决策树算法中。
基尼指数最初是用来衡量一个国家或地区居民收入差距的指标。在经济学中,它表示在全部居民收入中,用于进行不平均分配的那部分收入占总收入的百分比。基尼指数的值介于0到1之间,值越大,表示不平等程度越高;值越小,表示收入分配越均匀。
在机器学习领域,尤其是在构建决策树时,基尼指数被用来度量数据集的不纯度。数据集的不纯度是指数据集中的元素被错误分类的程度。在决策树算法中,如CART(Classification and Regression Trees),基尼指数用来决定如何分裂数据集以创建一个纯的子集,即尽量使每个子集中的元素属于同一类别。公式如下:
4.什么是信息增益
信息增益是决策树算法中用于特征选择的一个重要指标,它衡量的是特征能够为分类系统带来的信息量。 信息增益的计算公式是 信息增益 = 父节点的熵 - 加权平均子节点的熵。
信息增益的计算基于信息熵的概念,信息熵代表了随机变量的不确定度。当我们在某种条件下考虑随机变量时,条件熵表示在这个条件下随机变量的不确定性。信息增益就是信息熵与条件熵之差,它反映了在给定条件下信息不确定性减少的程度。
在构建决策树时,信息增益帮助我们评估每个特征对于分类的贡献。具体来说,每次分裂时,算法会选择信息增益最大的特征,因为这意味着该特征能够最大程度地降低数据的不确定性,从而提高分类的准确性。
二、代码实现
1.源码
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier, plot_tree
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 加载鸢尾花数据集
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)
# 基于基尼指数构建决策树
gini_clf = DecisionTreeClassifier(criterion='gini', max_depth=3)
gini_clf.fit(X_train, y_train)
# 基于信息增益构建决策树
entropy_clf = DecisionTreeClassifier(criterion='entropy', max_depth=3)
entropy_clf.fit(X_train, y_train)
# 可视化决策树
fig, axs = plt.subplots(1, 2, figsize=(15, 6))
# 基尼指数决策树
plot_tree(gini_clf, filled=True, ax=axs[0])
axs[0].set_title('Gini Index Decision Tree')
# 信息增益决策树
plot_tree(entropy_clf, filled=True, ax=axs[1])
axs[1].set_title('Information Gain Decision Tree')
# 测试集上的准确率
gini_pred = gini_clf.predict(X_test)
entropy_pred = entropy_clf.predict(X_test)
print(f"Accuracy (Gini): {accuracy_score(y_test, gini_pred)}")
print(f"Accuracy (Entropy): {accuracy_score(y_test, entropy_pred)}")
plt.show()
2.代码分析
这段代码主要做了以下几件事情:
1. 导入了所需的库,包括numpy、matplotlib.pyplot、sklearn等。
2. 加载了鸢尾花数据集,并将其划分为特征X和目标y。
3. 将数据集划分为训练集和测试集,其中测试集占总数据的30%,随机种子设置为42。
4. 使用基尼指数和信息增益作为划分标准,分别构建了决策树模型。这两个模型的最大深度都设置为3。
5. 使用matplotlib库绘制了两个决策树的可视化图像。
6. 使用训练好的模型对测试集进行预测,并计算了预测结果的准确率。
7. 最后,打印出了基于基尼指数和信息增益的决策树在测试集上的准确率。
三、 实验结果分析
1.实验结果
2.实验结果分析
1.决策树可视化:
通过决策树的可视化,我们可以清晰地看到每个节点的划分特征、划分阈值以及叶子节点的类别分布。基于基尼指数和信息增益构建的决策树可能会有不同的结构,因为它们在选择划分特征时的准则不同。
2.准确率比较:
实验结果中打印出了基于基尼指数和信息增益的决策树在测试集上的准确率。可以看到,准确率可以作为评价模型性能的一个重要指标。一般来说,准确率越高,表示模型对未知数据的泛化能力越强。
3.模型选择:
在实际应用中,我们可以根据实验结果选择合适的决策树模型。基于信息增益的决策树通常在训练集上表现较好,但在测试集上可能存在过拟合的风险;而基于基尼指数的决策树在处理不平衡数据时可能更稳健。根据具体问题的特性和数据集的情况,选择合适的决策树构建方法是非常重要的。
3.两个决策树的比较
1.划分特征和划分阈值:
通过可视化决策树,我们可以看到基于基尼指数和信息增益构建的决策树在每个节点进行划分时所选择的特征和阈值可能是不同的。基尼指数决策树会选择基尼指数最小的特征和阈值进行划分,而信息增益决策树则会选择信息增益最大的特征和阈值进行划分。
2.决策树结构:
由于基尼指数和信息增益的不同计算方式,两种决策树的结构可能会有所不同。基于基尼指数的决策树倾向于将常见类别的特征放在更接近根节点的位置,而信息增益决策树更倾向于平衡地选择特征进行划分。
3.准确率:
实验结果中打印出了基于基尼指数和信息增益的决策树在测试集上的准确率。我们可以比较这两个准确率来判断两种决策树的预测性能。在某些情况下,基于基尼指数的决策树可能表现更好,而在其他情况下,信息增益的决策树可能更优秀。