10/31

实验三:C4.5(带有预剪枝和后剪枝)算法实现与测试

一、实验目的

深入理解决策树、预剪枝和后剪枝的算法原理,能够使用 Python 语言实现带有预剪枝 和后剪枝的决策树算法 C4.5 算法的训练与测试,并且使用五折交叉验证算法进行模型训练 与评估。

二、实验内容

(1)从 scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注 意同分布取样); (2)使用训练集训练分类带有预剪枝和后剪枝的 C4.5 算法; (3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选 择; (4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验三的 部分。

三、算法步骤、代码、及结果

   1. 算法伪代码

1. 加载iris数据集

2. 使用留出法留出1/3的样本作为测试集

3. 初始化决策树分类器,设置预剪枝和后剪枝参数

4. 训练模型

5. 使用五折交叉验证评估模型

6. 训练最终模型

7. 计算性能指标(准确度、精度、召回率和F1值)

8. 使用测试集测试模型性能

   2. 算法主要代码

完整源代码\调用库方法(函数参数说明)

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import cross_val_score
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score

# 加载iris数据集
iris = load_iris()
X, y = iris.data, iris.target

# 使用留出法留出1/3的样本作为测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/3, random_state=42)

# 初始化决策树分类器,设置预剪枝和后剪枝参数
clf = DecisionTreeClassifier(criterion='entropy', # 使用信息熵作为划分标准
                             max_depth=None, # 不设置预剪枝的最大深度
                             ccp_alpha=0.01, # 设置后剪枝的复杂性参数
                             random_state=42)

# 训练模型
clf.fit(X_train, y_train)

# 使用五折交叉验证评估模型
scores = cross_val_score(clf, X_train, y_train, cv=5, scoring='accuracy')

# 训练最终模型
clf.fit(X_train, y_train)

# 计算性能指标
y_pred = clf.predict(X_train)
accuracy = accuracy_score(y_train, y_pred)
precision = precision_score(y_train, y_pred, average='macro')
recall = recall_score(y_train, y_pred, average='macro')
f1 = f1_score(y_train, y_pred, average='macro')

print(f"Accuracy: {accuracy:.2f}")
print(f"Precision: {precision:.2f}")
print(f"Recall: {recall:.2f}")
print(f"F1 Score: {f1:.2f}")

# 使用测试集测试模型性能
y_pred_test = clf.predict(X_test)

test_accuracy = accuracy_score(y_test, y_pred_test)
test_precision = precision_score(y_test, y_pred_test, average='macro')
test_recall = recall_score(y_test, y_pred_test, average='macro')
test_f1 = f1_score(y_test, y_pred_test, average='macro')

print(f"Test Accuracy: {test_accuracy:.2f}")
print(f"Test Precision: {test_precision:.2f}")
print(f"Test Recall: {test_recall:.2f}")
print(f"Test F1 Score: {test_f1:.2f}")

函数参数说明:

load_iris()

  • 功能:加载iris数据集。
  • 参数:无。
  • 返回值:返回一个类似字典的对象,包含数据集的特征、目标值等信息。
  • 来源

train_test_split(X, y, test_size=0.3, random_state=None)

  • 功能:将数据集分为训练集和测试集。
  • 参数
    • o X:特征数据。
    • o y:目标值。
    • o test_size:测试集的比例或数量,默认为0.25。
    • o random_state:随机数种子,用于可重复的分割。
  • 返回值:返回训练集特征、测试集特征、训练集目标值和测试集目标值。
  • 默认值:test_size=0.25,random_state=None。
  • 来源

DecisionTreeClassifier(criterion='gini', max_depth=None, ccp_alpha=0.0)

  • 功能:初始化决策树分类器。
  • 参数
    • o criterion:用于节点划分的特征选择标准,默认为'gini'。
    • o max_depth:树的最大深度,None表示不限制。
    • o ccp_alpha:复杂性参数,用于后剪枝。
  • 返回值:返回决策树分类器对象。
  • 默认值:criterion='gini',max_depth=None,ccp_alpha=0.0。
  • 来源

cross_val_score(estimator, X, y, cv=5)

  • 功能:使用交叉验证评估模型性能。
  • 参数
    • o estimator:估计器(模型)。
    • o X:特征数据。
    • o y:目标值。
    • o cv:交叉验证的折数,默认为5。
  • 返回值:返回一个数组,包含每次交叉验证的分数。
  • 默认值:cv=5。
  • 来源

accuracy_score(y_true, y_pred)

  • 功能:计算准确度。
  • 参数
    • o y_true:真实目标值。
    • o y_pred:预测目标值。
  • 返回值:返回准确度分数。
  • 来源

precision_score(y_true, y_pred, average='binary')

  • 功能:计算精度。
  • 参数
    • o y_true:真实目标值。
    • o y_pred:预测目标值。
    • o average:计算多个类别的平均方式。
  • 返回值:返回精度分数。
  • 默认值:average='binary'。
  • 来源

recall_score(y_true, y_pred, average='binary')

  • 功能:计算召回率。
  • 参数
    • o y_true:真实目标值。
    • o y_pred:预测目标值。
    • o average:计算多个类别的平均方式。
  • 返回值:返回召回率分数。
  • 默认值:average='binary'。
  • 来源

f1_score(y_true, y_pred, average='binary')

  • 功能:计算F1值。
  • 参数
    • o y_true:真实目标值。
    • o y_pred:预测目标值。
    • o average:计算多个类别的平均方式。
  • 返回值:返回F1值分数。
  • 默认值:average='binary'。

 

   3. 训练结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)

 

 

四、实验结果分析

1. 测试结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)

 

2. 对比分析

  训练集的完美分数与测试集的高分数之间的差异表明模型可能过拟合。过拟合通常发生在模型过于复杂,以至于它学习了训练数据中的噪声和细节,而不是底层的数据分布。尽管测试集的分数略低于训练集,但0.98的分数仍然非常高,这表明模型具有很好的泛化能力。这意味着模型在未见过的数据上也能保持较高的性能。

posted @ 2024-10-31 17:41  Hbro  阅读(37)  评论(0)    收藏  举报