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'])
posted @ 2025-11-25 13:13  Look_Back  阅读(6)  评论(0)    收藏  举报