大三打卡(9.30)
实验三:C4.5(带有预剪枝和后剪枝)算法实现与测试
一、实验目的
深入理解决策树、预剪枝和后剪枝的算法原理,能够使用 Python 语言实现带有预剪枝 和后剪枝的决策树算法 C4.5 算法的训练与测试,并且使用五折交叉验证算法进行模型训练 与评估。
二、实验内容
(1)从 scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注 意同分布取样); (2)使用训练集训练分类带有预剪枝和后剪枝的 C4.5 算法; (3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选 择; (4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验三的 部分。
三、算法步骤、代码、及结果
1. 算法伪代码
BEGIN
# 1. 加载数据集
X, y = load_data()
# 2. 划分训练集和测试集
X_train, X_test, y_train, y_test = split_data(X, y)
# 3. 训练带有预剪枝的决策树
pre_pruned_model = train_pre_pruned_tree(X_train, y_train)
# 4. 执行后剪枝(可选)
pruned_model = post_prune_tree(pre_pruned_model, X_train, y_train)
# 5. 评估模型性能,使用交叉验证
cv_results = evaluate_model(X_train, y_train) # 使用训练集进行交叉验证
PRINT "五折交叉验证结果:", cv_results
# 6. 测试模型性能
test_model(pruned_model, X_test, y_test) # 用测试集进行最终测试
END
2. 算法主要代码
完整源代码\调用库方法(函数参数说明)
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score, precision_score, recall_score,
f1_score
# (1)加载iris数据集
iris = load_iris()
X, y = iris.data, iris.target
# (2)数据划分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/3,
random_state=42, stratify=y)
# (3)训练模型
# 使用DecisionTreeClassifier,设置参数来实现预剪枝和后剪枝
clf = DecisionTreeClassifier(criterion='entropy', random_state=42,
max_depth=None, min_samples_split=2, min_samples_leaf=1,
max_features=None, max_leaf_nodes=None, min_impurity_decrease=0.0)
# 训练模型
clf.fit(X_train, y_train)
# (4)模型评估
# 使用五折交叉验证
scores = cross_val_score(clf, X_train, y_train, cv=5, scoring='accuracy')
print("五折交叉验证准确度:", scores.mean())
# (5)测试模型
# 使用测试集测试模型
y_pred = clf.predict(X_test)
# 计算性能指标
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred, average='macro')
recall = recall_score(y_test, y_pred, average='macro')
f1 = f1_score(y_test, y_pred, average='macro')
print("测试集准确度:", accuracy)
print("测试集精度:", precision)
print("测试集召回率:", recall)
print("测试集F1值:", f1)
3. 训练结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
四、实验结果分析
1. 测试结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
2. 对比分析
预剪枝与后剪枝的效果:
预剪枝:通过限制决策树的生长来防止过拟合。例如,设置max_depth(最大深度)或max_leaf_nodes(最大叶节点数)参数。预剪枝可以在树完全生长之前停止分裂,从而避免模型过于复杂。
后剪枝:先让决策树完全生长,然后再通过移除一些分支来简化模型。例如,设置min_impurity_decrease(不纯度减少的最小值)参数。后剪枝通常比预剪枝更耗时,因为它需要先构建完整的树,然后再进行剪枝。
模型复杂度与泛化能力:
通常,模型越复杂,它在训练集上的表现越好,但在未见过的数据上(即测试集)可能表现不佳,这就是过拟合。预剪枝和后剪枝都是用来控制模型复杂度,提高模型泛化能力的方法。
通过比较剪枝前后的性能指标,可以观察到剪枝对模型泛化能力的影响。
性能指标的比较:
比较剪枝前后的准确率、精度、召回率和F1值,可以量化剪枝对模型性能的影响
如果剪枝导致性能指标下降,可能需要调整剪枝参数,或者考虑使用不同的剪枝策略。
参数调整的影响:
调整min_samples_split、min_samples_leaf等参数可以控制树的生长,从而影响模型的性能。
通过实验不同的参数值,可以找到最佳的参数设置,以达到最好的性能平衡。
与其他决策树算法的比较:
可以将C4.5算法的性能与其他决策树算法(如ID3、CART)进行比较,分析它们在相同数据集上的表现差异。
比较不同算法的信息增益计算方式、分裂准则等,理解这些差异如何影响最终的模型性能。
交叉验证的结果:
使用五折交叉验证可以得到模型性能的一个更稳健的估计,因为它减少了模型性能评估的方差。
比较交叉验证的结果与单一测试集的结果,可以评估模型的稳定性和可靠性。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下