2024.12.2(周一)

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

# 1. 加载 Iris 数据集
iris = datasets.load_iris()  # 使用sklearn.datasets加载Iris数据集
X = iris.data  # 特征数据
y = iris.target  # 标签数据

# 使用留出法(hold-out)将数据集分割为训练集和测试集,1/3作为测试集
# test_size=0.33 表示将33%的数据用作测试集,random_state=42 用于设置随机种子以确保可重复性,stratify=y 确保分割后类别比例一致
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42, stratify=y)

# 打印训练集和测试集的形状
print(f"训练集形状: {X_train.shape}, 测试集形状: {X_test.shape}")

# 2. 使用带预剪枝的决策树训练模型
# DecisionTreeClassifier 创建决策树分类器:
# max_depth=5 限制树的最大深度为5,防止过度拟合;
# min_samples_split=10 限制每个内部节点最少需要10个样本才能进行划分;
# min_samples_leaf=5 限制每个叶子节点最少需要5个样本;
# random_state=42 设置随机种子,保证结果可重复
clf_pre_prune = DecisionTreeClassifier(max_depth=5, min_samples_split=10, min_samples_leaf=5, random_state=42)

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

# 3. 使用五折交叉验证评估模型性能
# cross_val_score 进行交叉验证,返回不同折次的评分结果
# cv=5 指定五折交叉验证,scoring='accuracy' 使用准确度评分
accuracy_scores = cross_val_score(clf_pre_prune, X_train, y_train, cv=5, scoring='accuracy')

# 使用加权精度评分(weighted average),适用于类别不平衡的情况
# make_scorer 用于将精度、召回率、F1值等指标转化为可用的评分函数
precision_scores = cross_val_score(clf_pre_prune, X_train, y_train, cv=5, scoring=make_scorer(precision_score, average='weighted'))

# 使用加权召回率评分
recall_scores = cross_val_score(clf_pre_prune, X_train, y_train, cv=5, scoring=make_scorer(recall_score, average='weighted'))

# 使用加权F1值评分
f1_scores = cross_val_score(clf_pre_prune, X_train, y_train, cv=5, scoring=make_scorer(f1_score, average='weighted'))

# 输出五折交叉验证的平均值和标准差
print(f"准确度: {accuracy_scores.mean():.4f} ± {accuracy_scores.std():.4f}")
print(f"精度: {precision_scores.mean():.4f} ± {precision_scores.std():.4f}")
print(f"召回率: {recall_scores.mean():.4f} ± {recall_scores.std():.4f}")
print(f"F1 值: {f1_scores.mean():.4f} ± {f1_scores.std():.4f}")

# 4. 使用测试集对模型进行评估

# 使用训练好的模型对测试集进行预测
y_pred = clf_pre_prune.predict(X_test)  # 对测试集进行预测,返回预测的标签

# 计算各项性能指标
# accuracy_score 计算准确度
accuracy = accuracy_score(y_test, y_pred)

# precision_score 计算精度,average='weighted' 表示对每个类别的精度进行加权平均
precision = precision_score(y_test, y_pred, average='weighted')

# recall_score 计算召回率,average='weighted' 表示对每个类别的召回率进行加权平均
recall = recall_score(y_test, y_pred, average='weighted')

# f1_score 计算 F1 值,average='weighted' 表示对每个类别的 F1 值进行加权平均
f1 = f1_score(y_test, y_pred, average='weighted')

# 输出测试集的评估指标
print(f"测试集准确度: {accuracy:.4f}")
print(f"测试集精度: {precision:.4f}")
print(f"测试集召回率: {recall:.4f}")
print(f"测试集 F1 值: {f1:.4f}")

# 打印混淆矩阵
conf_matrix = confusion_matrix(y_test, y_pred)  # confusion_matrix 返回混淆矩阵
print("混淆矩阵:")
print(conf_matrix)

 

posted @ 2024-12-02 16:45  记得关月亮  阅读(1)  评论(0编辑  收藏  举报