逻辑回归算法实现与测试
逻辑回归算法实现与测试
一、实验目的
深入理解对数几率回归(即逻辑回归的)的算法原理,能够使用 Python 语言实现对数
几率回归的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。
二、实验内容
(1)从 scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注
意同分布取样);
(2)使用训练集训练对数几率回归(逻辑回归)分类算法;
(3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选
择;
(4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验二的
部分。
三、算法步骤、代码、及结果
1. 算法伪代码
加载数据集 (X, y)
划分数据集 为训练集和测试集 (train_test_split)
创建逻辑回归模型 (LogisticRegression)
使用训练集训练模型 (logreg.fit(X_train, y_train))
初始化 5 折交叉验证 (StratifiedKFold)
对模型进行交叉验证 (cross_val_score)
输出交叉验证结果 (accuracy, precision, recall, F1)
使用测试集评估模型 (logreg.predict(X_test))
计算并输出测试集结果 (accuracy, precision, recall, F1)
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)
- 对比分析
五折交叉验证通过将数据集分成 5 个子集,进行多次训练和测试,提供了更稳定的评估结果,避免了数据划分的偏差。评估指标如准确度、精度、召回率和 F1 值反映了模型的整体性能,尤其是在多个数据集上的一致性。测试集评估模型在未见数据上的表现,反映了模型的泛化能力。与交叉验证相比,测试集可能因为只使用一次数据划分而存在偏差,准确度和其他指标通常较低。
准确度:交叉验证的准确度通常较为稳定,而测试集的准确度更能反映模型在实际应用中的效果。
精度、召回率和 F1 值:交叉验证可能略优于测试集,因为它充分利用了所有数据进行训练。测试集的结果更能体现模型在真实环境中的表现。