C4. 5(带有预剪枝和后剪枝)算法实现与测试
一、实验目的
深入理解决策树、预剪枝和后剪枝的算法原理,能够使用Python语言实现带有预剪枝和后剪枝的决策树算法C4.5算法的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。
二、实验内容
(1)从scikit-learn库中加载iris数据集或本地读取,进行数据分析:
(2)采用五折交叉验证划分训练集和测试集,使用训练集训练对数几率回归(逻辑回
归)分类算法;
(3)使用五折交叉验证对模型性能(准确度、精度、召回率和F1值)进行测试;
(4)通过对测试结果进行比较分析,评估模型性能;
(5)完成实验报告中实验二的部分。
三、算法步骤、代码、及结果
def decision_tree_with_pruning(X, y, feature_names, target_names):
"""
使用scikit-learn库实现带预剪枝和后剪枝的决策树
"""
print("\n" + "=" * 60)
print("C4.5决策树算法实现(使用信息增益率)")
print("=" * 60)
# 创建决策树模型 - 使用熵作为分裂标准(接近C4.5算法)
# C4.5使用信息增益率,sklearn的决策树使用信息增益,但我们可以通过参数调整来接近C4.5效果
dt_model = DecisionTreeClassifier(
criterion='entropy', # 使用信息增益(C4.5基于信息增益率,但sklearn不直接支持)
splitter='best', # 选择最佳分裂
max_depth=5, # 预剪枝:限制树的最大深度
min_samples_split=5, # 预剪枝:内部节点再划分所需最小样本数
min_samples_leaf=3, # 预剪枝:叶子节点最少样本数
min_impurity_decrease=0.01, # 预剪枝:分裂需要的最小不纯度减少量
ccp_alpha=0.01, # 后剪枝:代价复杂度剪枝参数
random_state=42 # 随机种子
)
# 定义评估指标
scoring = {
'accuracy': 'accuracy',
'precision': 'precision_macro',
'recall': 'recall_macro',
'f1': 'f1_macro'
}
# 五折交叉验证
print("正在进行五折交叉验证...")
cv_results = cross_validate(
estimator=dt_model,
X=X,
y=y,
cv=5,
scoring=scoring,
return_train_score=True, # 返回训练分数以分析过拟合
return_estimator=True
)
# 提取结果
train_accuracy = cv_results['train_accuracy']
test_accuracy = cv_results['test_accuracy']
precision_scores = cv_results['test_precision']
recall_scores = cv_results['test_recall']
f1_scores = cv_results['test_f1']
return (test_accuracy, precision_scores, recall_scores, f1_scores,
train_accuracy, cv_results['estimator'])

浙公网安备 33010602011771号