逻辑回归算法实现与测试

逻辑回归算法实现与测试

一、实验目的

 

深入理解对数几率回归(即逻辑回归的)的算法原理,能够使用 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 :随机种子,确保结果一致。

 

  1. cross_val_score()  — 交叉验证

 

 logreg :训练模型。

 X :特征数据。

 Y :目标标签数据。

 Cv :交叉验证的折数,通常为 5

 Scoring :评估指标,`'accuracy'` 为准确度。

 

  1. StratifiedKFold()  — 分层 K 折交叉验证

 

 n_splits :折数,数据被划分成几份。

 Shuffle :是否打乱数据,`True` 为打乱。

 random_state :随机种子,保证结果一致。

 

  1. accuracy_score() , precision_score() ,  recall_score() , f1_score()  — 评估指标

 

 y_test :真实标签。

 y_pred :预测标签。

 Average :多类别时的平均方法,weighted 按类权重加权。

 

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

 

 

 

四、实验结果分析

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

 

 

  1. 对比分析

五折交叉验证通过将数据集分成 5 个子集,进行多次训练和测试,提供了更稳定的评估结果,避免了数据划分的偏差。评估指标如准确度、精度、召回率和 F1 值反映了模型的整体性能,尤其是在多个数据集上的一致性。测试集评估模型在未见数据上的表现,反映了模型的泛化能力。与交叉验证相比,测试集可能因为只使用一次数据划分而存在偏差,准确度和其他指标通常较低。

准确度:交叉验证的准确度通常较为稳定,而测试集的准确度更能反映模型在实际应用中的效果。

精度、召回率和 F1 :交叉验证可能略优于测试集,因为它充分利用了所有数据进行训练。测试集的结果更能体现模型在真实环境中的表现。

posted @ 2024-11-20 09:25  艾鑫4646  阅读(12)  评论(0编辑  收藏  举报