2024.10.2

实验三:C4.5算法的训练与测试

一、实验目的

深入理解决策树、预剪枝和后剪枝的算法原理,能够使用 Python 语言实现带有预剪枝

和后剪枝的决策树算法 C4.5 算法的训练与测试,并且使用五折交叉验证算法进行模型训练

与评估。

二、实验内容

(1)从 scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注

意同分布取样);

(2)使用训练集训练分类带有预剪枝和后剪枝的 C4.5 算法;

(3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选

择;

(4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验三的

部分。

 

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

   1. 算法伪代码

(1) 加载Iris数据集

(2) 提取特征集X和标签集y

(3) 使用留出法将数据集分为训练集(X_train, y_train)和测试集(X_test, y_test),测试集大小为1/3,保持类别比例

(4) 创建带有预剪枝的决策树分类器,设置最大深度为3,最小分裂样本数为10,最小叶子样本数为5

(5) 使用训练集(X_train, y_train)训练决策树分类器

(6) 定义评分标准,包括准确度、加权精度、加权召回率和加权F1

(7) 使用五折交叉验证评估模型性能,并计算每个评分标准的平均值

(8) 打印平均准确度、平均精度、平均召回率和平均F1

(9) 使用测试集(X_test)对训练好的决策树分类器进行预测,得到预测结果y_pred

(10) 输出分类报告和混淆矩阵

   2. 算法主要代码

import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, cross_val_score, cross_validate
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import make_scorer, classification_report, confusion_matrix, accuracy_score, precision_score, recall_score, f1_score

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

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

# 3. 训练带有预剪枝的 C4.5 算法
clf_preprune = DecisionTreeClassifier(max_depth=3, min_samples_split=10, min_samples_leaf=5, random_state=42)
clf_preprune.fit(X_train, y_train)

# 4. 使用五折交叉验证评估模型性能
scoring = {
    'accuracy': make_scorer(accuracy_score),
    'precision': make_scorer(precision_score, average='weighted'),
    'recall': make_scorer(recall_score, average='weighted'),
    'f1': make_scorer(f1_score, average='weighted')
}

# 进行五折交叉验证
cv_results = cross_validate(clf_preprune, X_train, y_train, cv=5, scoring=scoring)

# 输出得分
平均准确度 = np.mean(cv_results['test_accuracy'])
平均精度 = np.mean(cv_results['test_precision'])
平均召回率 = np.mean(cv_results['test_recall'])
平均F1= np.mean(cv_results['test_f1'])

print(f"平均准确度: {平均准确度:.2f}")
print(f"平均精度: {平均精度:.2f}")
print(f"平均召回率: {平均召回率:.2f}")
print(f"平均F1: {平均F1:.2f}")

# 5. 使用测试集测试模型性能
y_pred = clf_preprune.predict(X_test)

# 输出分类报告和混淆矩阵
print("分类报告:")
print(classification_report(y_test, y_pred, target_names=iris.target_names))

print("混淆矩阵:")
print(confusion_matrix(y_test, y_pred))

 

 

调用库方法(函数参数说明)

1.load_iris()

来源:sklearn.datasets

作用:加载Iris数据集。

2.train_test_split()

来源:sklearn.model_selection

参数:

X:特征数据。

y:目标数据。

test_size:测试集的比例。

random_state:随机数生成器的种子。

stratify:保持训练集和测试集的类别比例。

作用:将数据集划分为训练集和测试集。

3.DecisionTreeClassifier()

来源:sklearn.tree

参数:

max_depth:树的最大深度。

min_samples_split:分裂内部节点所需的最小样本数。

min_samples_leaf:叶子节点所需的最小样本数。

random_state:随机数生成器的种子。

作用:创建一个决策树分类器实例。

4.cross_validate()

来源:sklearn.model_selection

参数:

clf_preprune:要评估的模型。

X_train:训练集的特征数据。

y_train:训练集的目标数据。

cv:交叉验证的折数。

scoring:评分标准。

作用:使用交叉验证评估模型性能。

5.make_scorer()

来源:sklearn.metrics

参数:

score_func:评分函数。

average:评分平均策略。

作用:创建一个评分函数。

6.classification_report()

来源:sklearn.metrics

参数:

y_test:测试集的真实目标数据。

y_pred:模型预测的目标数据。

target_names:类别名称。

作用:输出一个详细的分类报告。

7.confusion_matrix()

来源:sklearn.metrics

参数:

y_test:测试集的真实目标数据。

y_pred:模型预测的目标数据。

作用:输出混淆矩阵。

posted @ 2024-10-02 00:13  kuku睡  阅读(23)  评论(0)    收藏  举报