2024.9.30
实验二:逻辑回归算法实现与测试
一、实验目的
深入理解对数几率回归(即逻辑回归的)的算法原理,能够使用 Python 语言实现对数
几率回归的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。
二、实验内容
(1)从 scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注
意同分布取样);
(2)使用训练集训练对数几率回归(逻辑回归)分类算法;
(3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选
择;
(4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验二的
部分。
三、算法步骤、代码、及结果
1. 算法伪代码
(1) 加载Iris数据集
(2) 提取特征集X和标签集y
(3) 使用留出法将数据集分为训练集(X_train, y_train)和测试集(X_test, y_test),测试集大小为1/3,保持类别比例
(4) 创建逻辑回归模型,设置最大迭代次数为200
(5) 训练模型:
(a) 使用训练集(X_train, y_train)训练逻辑回归模型
(6) 使用五折交叉验证评估模型性能:
(a) 对训练集(X_train, y_train)进行五折交叉验证
(b) 计算准确度、精度、召回率和F1值的平均值
(7) 输出交叉验证结果:
(a) 打印准确度、精度、召回率和F1值的平均值
(8) 使用测试集评估模型性能:
(a) 使用模型对测试集(X_test)进行预测,得到预测结果y_pred
(b) 计算测试集上的准确度、精度、召回率和F1值
(9) 输出测试集评估结果:
(a) 打印测试集上的准确度、精度、召回率和F1值
(10) 输出详细的分类报告:
(a) 使用y_test和y_pred生成分类报告,并打印
2. 算法主要代码
import pandas as pd
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, classification_report
# 加载Iris数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target
# 留出法分割数据集,留出1/3的样本作为测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42, stratify=y)
# 创建逻辑回归模型并训练
model = LogisticRegression(max_iter=200)
model.fit(X_train, y_train)
# 使用五折交叉验证评估模型性能
accuracy = cross_val_score(model, X_train, y_train, cv=5, scoring='accuracy')
precision = cross_val_score(model, X_train, y_train, cv=5, scoring='precision_macro')
recall = cross_val_score(model, X_train, y_train, cv=5, scoring='recall_macro')
f1 = cross_val_score(model, X_train, y_train, cv=5, scoring='f1_macro')
# 输出交叉验证结果
print(f'交叉验证准确度: {accuracy.mean():.4f}')
print(f'交叉验证精度: {precision.mean():.4f}')
print(f'交叉验证召回率: {recall.mean():.4f}')
print(f'交叉验证F1值: {f1.mean():.4f}')
# 使用测试集进行预测
y_pred = model.predict(X_test)
# 评估模型性能
accuracy_test = accuracy_score(y_test, y_pred)
precision_test = precision_score(y_test, y_pred, average='macro')
recall_test = recall_score(y_test, y_pred, average='macro')
f1_test = f1_score(y_test, y_pred, average='macro')
# 输出测试结果
print(f'测试集准确度: {accuracy_test:.4f}')
print(f'测试集精度: {precision_test:.4f}')
print(f'测试集召回率: {recall_test:.4f}')
print(f'测试集F1值: {f1_test:.4f}')
# 输出详细的分类报告
print(classification_report(y_test, y_pred, target_names=iris.target_names))
(2)调用库方法
1.load_iris():
来源:sklearn.datasets
参数:无
作用:加载Iris数据集。
train_test_split():
2.来源:sklearn.model_selection
参数:
X:特征数据。
y:目标数据。
test_size:测试集的比例,这里设置为0.33,即33%的数据用作测试集。
random_state:随机数生成器的种子,这里设置为42,确保每次划分的结果相同。
stratify:根据目标变量y的分布进行分层抽样,确保每个类别的比例在训练集和测试集中保持一致。
作用:将数据集划分为训练集和测试集。
LogisticRegression():
3.来源:sklearn.linear_model
参数:
max_iter:最大迭代次数,这里设置为200,用于确保模型能够收敛。
作用:创建一个逻辑回归模型实例。
fit():
4.来源:sklearn.base
参数:
X_train:训练集的特征数据。
y_train:训练集的目标数据。
作用:训练逻辑回归模型。
cross_val_score():
5.来源:sklearn.model_selection
参数:
model:要评估的模型。
X_train:训练集的特征数据。
y_train:训练集的目标数据。
cv:交叉验证的折数,这里设置为5。
scoring:评分标准,分别使用'accuracy'、'precision_macro'、'recall_macro'和'f1_macro'来评估模型的准确度、精度、召回率和F1值。
作用:使用交叉验证评估模型性能。
predict():
6.来源:sklearn.base
参数:
X_test:测试集的特征数据。
作用:使用训练好的模型对测试集进行预测。
accuracy_score()、precision_score()、recall_score()、f1_score():
7.来源:sklearn.metrics
参数:
y_test:测试集的真实目标数据。
y_pred:模型预测的目标数据。
average:计算平均值的方法,这里使用'macro',即不考虑类别不平衡,对所有类别同等重视。
作用:计算测试集上的准确度、精度、召回率和F1值。
classification_report():
8.来源:sklearn.metrics
参数:
y_test:测试集的真实目标数据。
y_pred:模型预测的目标数据。
target_names:类别名称,用于报告中显示。
作用:输出一个详细的分类报告,包括主要的分类指标和每个类别的指标。