2024.11.21
机器学习实验二
实验二:逻辑回归算法实现与测试
一、实验目的
深入理解对数几率回归(即逻辑回归的)的算法原理,能够使用Python语言实现对数 几率回归的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。
二、实验内容
(1)从scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注 意同分布取样);
(2)使用训练集训练对数几率回归(逻辑回归)分类算法;
(3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选 择;
(4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验二的 部分。
三、算法步骤、代码、及结果
1. 算法伪代码
输入:鸢尾花数据集(X, y),逻辑回归模型
输出:交叉验证结果、模型性能指标、分类报告
1. 加载数据
1.1 使用 sklearn 的 datasets 加载 iris 数据集。
1.2 分离特征数据 X 和目标标签 y。
2. 划分数据集
2.1 使用 train_test_split 函数将数据集划分为训练集和测试集,测试集占 1/3。
2.2 确保训练集和测试集的类别分布一致。
3. 初始化并训练模型
3.1 创建逻辑回归模型,并设置最大迭代次数为 200。
3.2 使用训练集拟合模型。
4. 执行五折交叉验证
4.1 使用 cross_validate 函数进行 5 折交叉验证。
4.2 评估指标包括准确率、精度(宏平均)、召回率(宏平均)和 F1 值(宏平均)。
4.3 输出每个评估指标的平均值。
5. 测试模型性能
5.1 使用测试集进行预测。
5.2 计算并输出准确率、精度、召回率和 F1 值。
5.3 输出分类报告,显示各类别的详细性能。
6. 输出最终结果
6.1 输出交叉验证和测试集的性能结果。
6.2 输出分类报告,展示每个类别的精度、召回率、F1 值以及支持数。
2. 算法主要代码
完整源代码\调用库方法(函数参数说明)
# 导入必要的库
import numpy as np # 用于数值计算
from sklearn import datasets # 从 sklearn 加载内置数据集
from sklearn.model_selection import
train_test_split, cross_val_score, cross_validate # 数据划分与交叉验证
from sklearn.linear_model import
LogisticRegression # 逻辑回归模型
from sklearn.metrics import
accuracy_score, precision_score, recall_score, f1_score,
classification_report # 性能评估指标
# Step 1: 加载数据集
iris = datasets.load_iris() # 加载 iris 数据集(鸢尾花数据集)
X, y = iris.data, iris.target # 分离特征变量 (X) 和目标变量 (y)
# Step 1 解析:
# - iris.data 包含 150 个样本的 4 个特征(形状为 (150, 4))
# - iris.target 包含每个样本的分类标签(0, 1, 2 对应 3 个鸢尾花类别)
# 留出法划分训练集和测试集(1/3 作为测试集)
X_train, X_test, y_train, y_test =
train_test_split(
X, y, test_size=1/3, random_state=42,
stratify=y
)
# Step 1 解析:
# - train_test_split 将数据集划分为训练集和测试集。
# - test_size=1/3 表示测试集占总样本的 1/3。
# - random_state=42 固定随机种子,使得划分结果可复现。
# - stratify=y 确保划分后训练集和测试集中类别分布一致。
# Step 2: 训练逻辑回归模型
model =
LogisticRegression(max_iter=200, random_state=42) # 初始化逻辑回归模型,设置最大迭代次数为
200
model.fit(X_train, y_train) # 用训练集拟合逻辑回归模型
# Step 2 解析:
# - LogisticRegression 是 sklearn 提供的逻辑回归模型类。
# - fit 方法对模型进行训练,输入为训练集的特征 (X_train) 和标签 (y_train)。
# Step 3: 使用五折交叉验证
scoring_metrics = ['accuracy',
'precision_macro', 'recall_macro', 'f1_macro']
# 评估指标列表
cv_results = cross_validate(model,
X_train, y_train, cv=5, scoring=scoring_metrics)
print("五折交叉验证结果:")
for metric in scoring_metrics:
print(f"{metric}:
{cv_results['test_' + metric].mean():.4f}")
# Step 3 解析:
# - cross_validate 函数执行 5 折交叉验证,返回包含各折得分的字典。
# - scoring 参数指定评估指标:准确度 (accuracy)、宏平均精度 (precision_macro)、宏平均召回率 (recall_macro) 和宏平均 F1 值 (f1_macro)。
# - cv=5 表示进行 5 折交叉验证。
# - 结果通过循环输出每个指标的平均值。
# Step 4: 测试模型性能
y_pred = model.predict(X_test) # 用测试集预测结果
# 计算并打印性能指标
accuracy = accuracy_score(y_test,
y_pred) # 准确率
precision = precision_score(y_test,
y_pred, average='macro') # 精度(宏平均)
recall = recall_score(y_test, y_pred,
average='macro') # 召回率(宏平均)
f1 = f1_score(y_test, y_pred,
average='macro') # F1 值(宏平均)
print("\n测试集性能:")
print(f"Accuracy: {accuracy:.4f}")
print(f"Precision: {precision:.4f}")
print(f"Recall: {recall:.4f}")
print(f"F1 Score: {f1:.4f}")
# 输出分类报告
print("\n分类报告:")
print(classification_report(y_test, y_pred, target_names=iris.target_names))
# Step 4 解析:
# - predict 方法用模型预测测试集的类别。
# - accuracy_score, precision_score, recall_score, f1_score 用于计算模型性能指标:
# - 准确率(Accuracy):正确分类样本占总样本的比例。
# - 精度(Precision):预测为某类中正确的比例。
# - 召回率(Recall):某类样本中被正确预测的比例。
# - F1 值(F1):精度和召回率的调和平均值。
# - classification_report 给出每类的详细性能,包括精度、召回率、F1 值和支持数。
调用参数:
1. datasets.load_iris():
- 功能:加载鸢尾花数据集。
- 参数:无。
- 返回值:一个包含数据(data)、目标标签(target)以及其他信息的字典。
2. train_test_split(X, y, test_size=1/3, random_state=42, stratify=y):
- 功能:将数据集划分为训练集和测试集。
- 参数:
- o X, y:特征和目标数据。
- o test_size=1/3:测试集占总数据的比例。
- o random_state=42:设置随机种子,确保结果可复现。
- o stratify=y:按目标标签的比例划分数据,确保训练集和测试集的类别分布一致。
3. LogisticRegression(max_iter=200, random_state=42):
- 功能:初始化逻辑回归模型。
- 参数:
- o max_iter=200:最大迭代次数,防止模型无法收敛。
- o random_state=42:设置随机种子,确保每次模型训练结果一致。
4. cross_validate(model, X_train, y_train, cv=5, scoring=scoring_metrics):
- 功能:执行交叉验证,评估模型的性能。
- 参数:
- o model:待评估的模型。
- o X_train, y_train:训练集特征和目标数据。
- o cv=5:执行 5 折交叉验证。
- o scoring:评估指标,指定为 ['accuracy', 'precision_macro', 'recall_macro', 'f1_macro']。
5. accuracy_score(y_test, y_pred):
- 功能:计算准确率(预测正确的样本占总样本的比例)。
6. precision_score(y_test, y_pred, average='macro'):
- 功能:计算精度(宏平均),average='macro' 表示对所有类别计算精度并求平均。
7. recall_score(y_test, y_pred, average='macro'):
- 功能:计算召回率(宏平均)。
8. f1_score(y_test, y_pred, average='macro'):
- 功能:计算 F1 值(宏平均)。
9. classification_report(y_test, y_pred, target_names=iris.target_names):
- 功能:输出分类报告,包含每个类别的精度、召回率、F1 值和支持数。
3. 训练结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
四、实验结果分析
1. 测试结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
2. 对比分析
(1) 交叉验证与测试集的结果对比:
- 准确率:交叉验证和测试集的准确率通常会比较接近,表明模型没有过度拟合训练数据。若测试集的准确率显著低于交叉验证结果,说明模型可能存在过拟合现象,即模型对训练数据的拟合过于精细,以至于在未见过的数据上无法保持较好的表现。
- 精度、召回率、F1 值:这些指标的宏平均结果展示了模型在各个类别上的表现。通常,交叉验证和测试集的精度、召回率和 F1 值会保持一致。如果测试集的精度较低,而召回率较高,说明模型可能存在较多的假阳性(即错误分类为某一类别的样本),而相反,如果精度较高而召回率较低,则可能存在较多的假阴性(即未能正确预测为某一类别的样本)。
(2) 模型的泛化能力:
- 如果五折交叉验证的结果优于测试集的结果,可能是因为训练集和测试集存在数据分布差异,导致模型在测试集上的表现不佳。
- 如果交叉验证和测试集的结果相似,则表明模型具备良好的泛化能力,能够在不同的数据集上表现一致。
(3) F1 值的平衡性:
- 在分类问题中,尤其是多分类任务时,单独使用准确率可能会误导我对模型性能的评估。精度和召回率通常无法同时优化,因此 F1 值作为综合指标能更好地反映模型在不同类别上的表现平衡。可以看到,模型的 F1 值较为均衡,说明其在识别各类鸢尾花时能够做到相对公平和精准。
(4) 精度与召回率的权衡:
- 若模型的精度很高而召回率较低,可能表明模型对负样本的预测较好,但对正样本的漏判较多。反之,若召回率较高而精度较低,则可能说明模型在一些类别上的过拟合,导致了很多假阳性。