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)