1. 算法伪代码
# 导入必要的库
导入 numpy
导入 sklearn.datasets
导入 sklearn.model_selection
导入 sklearn.linear_model
导入 sklearn.metrics
# 1. 加载 Iris 数据集
iris = 加载 iris 数据集
X = iris.data # 特征数据
y = iris.target # 标签数据
# 2. 留出法划分数据集
X_train, X_test, y_train, y_test = 划分数据集(X, y, 测试集比例=0.33, 随机种子=42, 分层=对)
# 3. 使用逻辑回归算法训练模型
logreg = 创建逻辑回归模型(最大迭代次数=200)
logreg.适配(X_train, y_train)
# 4. 使用五折交叉验证对模型性能进行评估
cv = 创建分层 K 折交叉验证(折数=5, 打乱=对, 随机种子=42)
# 准确度评估
accuracy = 交叉验证模型(logreg, X, y, cv, 评价指标='准确度')
打印(五折交叉验证的准确度, accuracy.均值(), accuracy.标准差())
# 精度、召回率和 F1 值
定义评估模型(model, X, y, cv):
precision = 交叉验证模型(model, X, y, cv, 评价指标='加权精度')
recall = 交叉验证模型(model, X, y, cv, 评价指标='加权召回率')
f1 = 交叉验证模型(model, X, y, cv, 评价指标='加权 F1')
打印(五折交叉验证的精度, precision.均值(), precision.标准差())
打印(五折交叉验证的召回率, recall.均值(), recall.标准差())
打印(五折交叉验证的 F1 值, f1.均值(), f1.标准差())
# 运行模型评估
评估模型(logreg, X, y, cv)
# 5. 使用测试集测试模型性能
y_pred = logreg.预测(X_test)
打印(测试集准确度, 计算准确度(y_test, y_pred))
打印(测试集精度, 计算精度(y_test, y_pred, 平均方式='加权'))
打印(测试集召回率, 计算召回率(y_test, y_pred, 平均方式='加权'))
打印(测试集 F1 值, 计算 F1 值(y_test, y_pred, 平均方式='加权'))
2. 算法主要代码
完整源代码\调用库方法(函数参数说明)
# 导入必要的库
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, cross_val_score, StratifiedKFold
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import precision_score, recall_score, f1_score, accuracy_score
from sklearn.model_selection import cross_val_predict
# 1. 加载 Iris 数据集
iris = load_iris()
X = iris.data # 特征数据
y = iris.target # 标签数据
# 2. 留出法划分数据集,1/3 作为测试集,2/3 作为训练集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42, stratify=y)
# 3. 使用逻辑回归算法训练模型
logreg = LogisticRegression(max_iter=200)
logreg.fit(X_train, y_train)
# 4. 使用五折交叉验证对模型性能进行评估
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
# 准确度评估
accuracy = cross_val_score(logreg, X, y, cv=cv, scoring='accuracy')
print(f'五折交叉验证的准确度: {accuracy.mean():.4f} (+/- {accuracy.std():.4f})')
# 精度、召回率和 F1 值
def evaluate_model(model, X, y, cv):
precision = cross_val_score(model, X, y, cv=cv, scoring='precision_weighted')
recall = cross_val_score(model, X, y, cv=cv, scoring='recall_weighted')
f1 = cross_val_score(model, X, y, cv=cv, scoring='f1_weighted')
print(f'五折交叉验证的精度: {precision.mean():.4f} (+/- {precision.std():.4f})')
print(f'五折交叉验证的召回率: {recall.mean():.4f} (+/- {recall.std():.4f})')
print(f'五折交叉验证的 F1 值: {f1.mean():.4f} (+/- {f1.std():.4f})')
# 运行模型评估
evaluate_model(logreg, X, y, cv)
# 5. 使用测试集测试模型性能
y_pred = logreg.predict(X_test)
print(f'测试集准确度: {accuracy_score(y_test, y_pred):.4f}')
print(f'测试集精度: {precision_score(y_test, y_pred, average="weighted"):.4f}')
print(f'测试集召回率: {recall_score(y_test, y_pred, average="weighted"):.4f}')
print(f'测试集 F1 值: {f1_score(y_test, y_pred, average="weighted"):.4f}')
注:函数参数简写说明
1. train_test_split() — 数据集划分
X:特征数据(输入)。
Y :目标标签数据。
test_size:测试集比例,如 0.33 表示 1/3 数据为测试集。
random_state :随机种子,保证结果一致。
Stratify :按标签分层抽样,确保训练集和测试集标签比例一致。
2. LogisticRegression() — 逻辑回归模型
max_iter :最大迭代次数,默认为 100,设为 200 可增加迭代次数。
random_state :随机种子,确保结果一致。
cross_val_score() — 交叉验证
logreg :训练模型。
X :特征数据。
Y :目标标签数据。
Cv :交叉验证的折数,通常为 5。
Scoring :评估指标,`'accuracy'` 为准确度。
StratifiedKFold() — 分层 K 折交叉验证
n_splits :折数,数据被划分成几份。
Shuffle :是否打乱数据,`True` 为打乱。
random_state :随机种子,保证结果一致。
accuracy_score() , precision_score() , recall_score() , f1_score() — 评估指标
y_test :真实标签。
y_pred :预测标签。
Average :多类别时的平均方法,weighted 按类权重加权。
3. 训练结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
四、实验结果分析
1. 测试结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
2. 对比分析
训练集性能优于测试集:可以看到训练集的各项指标明显高于测试集,说明模型在训练数据上过拟合,可能不了解测试集的特征。
下降幅度评估:准确度、精度、召回率和 F1 值都有所下降,表明模型的泛化能力需要改进。可能需要调整模型参数、选择更复杂的模型,或增加更多的训练数据以提高模型的鲁棒性。
浙公网安备 33010602011771号