10/30

实验二:逻辑回归算法实现与测试

一、实验目的

深入理解对数几率回归(即逻辑回归的)的算法原理,能够使用 Python 语言实现对数 几率回归的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。

二、实验内容

1)从 scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注 意同分布取样); (2)使用训练集训练对数几率回归(逻辑回归)分类算法; (3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选 择; (4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验二的 部分。

三、算法步骤、代码、及结果

   1. 算法伪代码

1. 开始

2. 加载iris数据集,获取特征集X和标签集y

3. 使用留出法将数据集分为训练集和测试集,测试集占1/3,随机种子设置为42

4. 创建逻辑回归分类器实例,使用'liblinear'求解器和设置随机种子为42

5. 使用OneVsRestClassifier包装逻辑回归分类器,以支持多类分类

6. 使用训练集数据训练模型

7. 定义评分函数,包括准确度、精度、召回率和F1值,均使用宏观平均(macro average)

8. 使用五折交叉验证评估模型性能,计算准确度、精度、召回率和F1值的交叉验证分数

9. 打印五折交叉验证的平均准确度、精度、召回率和F1值

10. 使用测试集测试模型性能,预测测试集结果

11. 计算测试集上的准确度、精度、召回率和F1值

12. 打印测试集上的准确度、精度、召回率和F1值

13. 结束

   2. 算法主要代码

完整源代码\调用库方法(函数参数说明)

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.multiclass import OneVsRestClassifier
from sklearn.metrics import make_scorer, accuracy_score, precision_score, recall_score, f1_score

# 加载iris数据集
iris = load_iris()
X, y = iris.data, iris.target

# 使用留出法留出1/3的样本作为测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/3, random_state=42)

# 创建逻辑回归分类器实例,并使用OneVsRestClassifier进行多类分类
logreg = OneVsRestClassifier(LogisticRegression(solver='liblinear', random_state=42))

# 使用训练集训练模型
logreg.fit(X_train, y_train)

# 定义评分函数
accuracy = make_scorer(accuracy_score)
precision = make_scorer(precision_score, average='macro')
recall = make_scorer(recall_score, average='macro')
f1 = make_scorer(f1_score, average='macro')

# 使用五折交叉验证评估模型性能
cv_accuracy = cross_val_score(logreg, X_train, y_train, cv=5, scoring=accuracy)
cv_precision = cross_val_score(logreg, X_train, y_train, cv=5, scoring=precision)
cv_recall = cross_val_score(logreg, X_train, y_train, cv=5, scoring=recall)
cv_f1 = cross_val_score(logreg, X_train, y_train, cv=5, scoring=f1)

print(f"五折交叉验证准确度: {cv_accuracy.mean()}")
print(f"五折交叉验证精度: {cv_precision.mean()}")
print(f"五折交叉验证召回率: {cv_recall.mean()}")
print(f"五折交叉验证F1值: {cv_f1.mean()}")

# 使用测试集测试模型性能
y_pred = logreg.predict(X_test)
test_accuracy = accuracy_score(y_test, y_pred)
test_precision = precision_score(y_test, y_pred, average='macro')
test_recall = recall_score(y_test, y_pred, average='macro')
test_f1 = f1_score(y_test, y_pred, average='macro')

print(f"测试集准确度: {test_accuracy}")
print(f"测试集精度: {test_precision}")
print(f"测试集召回率: {test_recall}")
print(f"测试集F1值: {test_f1}")

 

load_iris

  • 用途:从scikit-learn库中加载iris数据集。
  • 参数:无参数需要指定,直接调用即可加载数据。

train_test_split

  • 用途:将数据集划分为训练集和测试集。
  • 参数
    • test_size=1/3:指定测试集占总数据集的比例为1/3。
    • random_state=42:随机数生成器的种子,确保每次划分的结果都是一样的,以便于复现结果。

LogisticRegression

  • 用途:逻辑回归分类器。
  • 参数
    • solver='liblinear':指定求解优化问题的算法,'liblinear'适用于小数据集,特别是当特征数量不多时。
    • random_state=42:随机数生成器的种子,确保结果可复现。

OneVsRestClassifier

  • 用途:用于多类分类问题的包装器,将二分类算法扩展到多分类问题。
  • 参数:接受一个分类器作为参数,这里传入的是LogisticRegression实例。

cross_val_score

  • 用途:进行交叉验证,并计算给定评分标准的得分。
  • 参数
    • cv=5:表示五折交叉验证。
    • scoring:指定评分标准,可以是字符串(如'accuracy')或者使用make_scorer函数创建的评分函数。

make_scorer

  • 用途:创建一个评分函数,可以指定评分标准和参数。
  • 参数
    • 第一个参数是评分函数,如accuracy_score、precision_score等。
    • average='macro':指定多分类问题中的平均策略,'macro'表示简单平均,不考虑各类别的样本数量。

accuracy_score

  • 用途:计算准确度,即预测正确的样本数占总样本数的比例。
  • 参数
    • average='macro':在多分类问题中,指定平均策略。

precision_score

  • 用途:计算精度,即预测为正类的样本中实际为正类的比例。
  • 参数
    • average='macro':在多分类问题中,指定平均策略。

recall_score

  • 用途:计算召回率,即实际为正类的样本中被预测为正类的比例。
  • 参数
    • average='macro':在多分类问题中,指定平均策略。

f1_score

  • 用途:计算F1值,即精度和召回率的调和平均值。
  • 参数
    • average='macro':在多分类问题中,指定平均策略。

 

   3. 训练结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)

 

四、实验结果分析

1. 测试结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)

 

2. 对比分析

  1. 准确度:五折交叉验证的准确度为0.94,而测试集的准确度达到了1.0。这表明模型在测试集上的表现优于交叉验证的平均表现。
  2. 精度:交叉验证的精度为0.9537,而测试集的精度为1.0。这意味着模型在测试集上没有将任何负类错误地预测为正类。
  3. 召回率:交叉验证的召回率为0.9429,而测试集的召回率为1.0。这表明模型在测试集上能够正确识别所有正类样本。
  4. F1:交叉验证的F1值为0.9420,而测试集的F1值为1.0。F1值是精度和召回率的调和平均,测试集上的F1值达到1.0表明模型在测试集上的表现非常完美。
posted @ 2024-10-30 17:40  Hbro  阅读(15)  评论(0)    收藏  举报