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) 精度与召回率的权衡

  • 若模型的精度很高而召回率较低,可能表明模型对负样本的预测较好,但对正样本的漏判较多。反之,若召回率较高而精度较低,则可能说明模型在一些类别上的过拟合,导致了很多假阳性。

 

posted @ 2024-12-25 10:06  cvjj  阅读(69)  评论(0)    收藏  举报