11.21日报

今天完成机器学习B实验,以下为今日实验内容:

上机实验三:C4.5(带有预剪枝和后剪枝)算法实现与测试 1、实验目的 深入理解决策树、预剪枝和后剪枝的算法原理,能够使用 Python 语言实现带有预剪枝 和后剪枝的决策树算法 C4.5 算法的训练与测试,并且使用五折交叉验证算法进行模型训练 与评估。 2、实验内容 (1)从 scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注 意同分布取样); (2)使用训练集训练分类带有预剪枝和后剪枝的 C4.5 算法; (3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选 择; (4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验三的 部分。 3、操作要点 (1)可以选择自行编写源代码完成 C4.5(带有预剪枝和后剪枝)算法,或者调用 scikit-learn 库中的函数; (2)如果调用 scikit-learn 库中的函数,需要说明函数各个参数的意义、取值、默认值 等,即自行编写代码只需要粘贴完整的源代码即可,调用函数包括粘贴源代码和函数参数说 明两部分; (3)一周内在超星作业提交源代码,打包命名;学号姓名-任务 3; (4)按要求撰写实验报告,实验报告在所有上机实验结束后提交。 推荐参考书:[1] 范淼, 李超. Python 机器学习及实践, 清华大学出版社. [2] Peter Harrington. 机器学习实战, 人民邮电出版社。 4、主要仪器设备 微机及 Python 软件。

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, classification_report, confusion_matrix

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

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

# 初始化决策树分类器,设置预剪枝参数
# 注意:scikit-learn中的DecisionTreeClassifier没有直接的后剪枝参数,但我们可以通过设置max_depth来控制树的深度
dt = DecisionTreeClassifier(
    criterion='gini',  # 选择分割质量的测量标准,默认为'gini'
    splitter='best',  # 选择属性的分割策略,默认为'best',可选'random'
    max_depth=3,  # 树的最大深度,这里设置为3来进行预剪枝
    min_samples_split=2,  # 节点划分时所需的最小样本数,默认为2
    min_samples_leaf=1,  # 叶节点所需的最小样本数,默认为1
    random_state=42  # 随机数生成器的种子
)

# 训练模型
dt.fit(X_train, y_train)

# 预测训练集和测试集
y_train_pred = dt.predict(X_train)
y_pred = dt.predict(X_test)

# 评估训练集和测试集的性能
train_accuracy = accuracy_score(y_train, y_train_pred)
test_accuracy = accuracy_score(y_test, y_pred)
train_precision = precision_score(y_train, y_train_pred, average='macro')
test_precision = precision_score(y_test, y_pred, average='macro')
train_recall = recall_score(y_train, y_train_pred, average='macro')
test_recall = recall_score(y_test, y_pred, average='macro')
train_f1 = f1_score(y_train, y_train_pred, average='macro')
test_f1 = f1_score(y_test, y_pred, average='macro')

# 打印性能评估结果
print("Training Set Performance:")
print(f"Accuracy: {train_accuracy:.4f}")
print(f"Precision: {train_precision:.4f}")
print(f"Recall: {train_recall:.4f}")
print(f"F1 Score: {train_f1:.4f}\n")

print("Test Set Performance:")
print(f"Accuracy: {test_accuracy:.4f}")
print(f"Precision: {test_precision:.4f}")
print(f"Recall: {test_recall:.4f}")
print(f"F1 Score: {test_f1:.4f}\n")

# 使用五折交叉验证评估模型性能
cross_val_scores = cross_val_score(dt, X_train, y_train, cv=5, scoring='accuracy')
print(f"Cross-validation scores: {cross_val_scores}")
print(f"Mean accuracy: {cross_val_scores.mean():.4f}")
print(f"Standard deviation: {cross_val_scores.std():.4f}\n")

# 打印分类报告和混淆矩阵
print("Classification Report:\n", classification_report(y_test, y_pred, target_names=iris.target_names))
print("Confusion Matrix:\n", confusion_matrix(y_test, y_pred))

 

posted @ 2024-11-27 10:51  Code13  阅读(27)  评论(0)    收藏  举报