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:模型预测的目标数据。
作用:输出混淆矩阵。