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

一、实验目的

深入理解对数几率回归(即逻辑回归的)的算法原理,能够使用 Python 语言实现对数

几率回归的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。

二、实验内容

(1)从 scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注

意同分布取样);

(2)使用训练集训练对数几率回归(逻辑回归)分类算法;

(3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选

择;

(4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验二的

部分。

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

   1. 算法伪代码

# 输入:训练数据 (X_train, y_train),学习率 (alpha),迭代次数 (num_iterations)

# 输出:训练好的模型参数 w 和 b

 

# 1. 初始化参数 w 和 b

w = 0  # 权重初始化为 0

b = 0  # 偏置初始化为 0

 

# 2. 设置学习率和迭代次数

alpha = 0.01  # 学习率

num_iterations = 1000  # 最大迭代次数

 

# 3. 定义 Sigmoid 函数

function sigmoid(z):

    return 1 / (1 + exp(-z))

 

# 4. 定义损失函数:Log-Loss (交叉熵损失)

function compute_loss(X, y, w, b):

    m = len(y)  # 样本数量

    cost = 0

    for i = 1 to m:

        z = dot_product(w, X[i]) + b  # 计算预测值

        prediction = sigmoid(z)  # 计算 Sigmoid 输出

        cost += -y[i] * log(prediction) - (1 - y[i]) * log(1 - prediction)

    return cost / m  # 返回平均损失

 

# 5. 训练模型:梯度下降法

for i = 1 to num_iterations:

    # 计算模型的预测值

    m = len(X_train)  # 样本数量

    dw = 0  # 权重的梯度

    db = 0  # 偏置的梯度

    

    # 计算梯度(损失函数关于 w 和 b 的导数)

    for i = 1 to m:

        z = dot_product(w, X_train[i]) + b  # 计算预测值

        prediction = sigmoid(z)  # 计算 Sigmoid 输出

        

        # 计算梯度

        dw += (prediction - y_train[i]) * X_train[i]

        db += prediction - y_train[i]

    

    # 更新参数

    w -= alpha * dw / m  # 更新权重

    b -= alpha * db / m  # 更新偏置

    

    # 每迭代 100 次输出一次损失值

    if i % 100 == 0:

        loss = compute_loss(X_train, y_train, w, b)

        print("Iteration", i, "loss:", loss)

 

# 6. 返回训练好的模型参数

return w, b

 

   2. 算法主要代码

import numpy as np
import pandas as pd
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.metrics import classification_report, confusion_matrix
from sklearn.model_selection import StratifiedKFold

# 1. 加载Iris数据集
data = load_iris()
X = data.data
y = data.target

# 2. 留出法:将数据分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42, stratify=y)

# 3. 使用逻辑回归算法训练模型
log_reg = LogisticRegression(max_iter=200)
log_reg.fit(X_train, y_train)

# 4. 使用五折交叉验证评估模型
kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
cross_val_scores = cross_val_score(log_reg, X_train, y_train, cv=kfold, scoring='accuracy')

# 输出五折交叉验证的平均准确率
print(f'五折交叉验证的平均准确率: {cross_val_scores.mean():.4f}')

# 计算其他评估指标(精度、召回率、F1分数)
y_train_pred = log_reg.predict(X_train)
train_report = classification_report(y_train, y_train_pred)
print("训练集评估报告:\n", train_report)

# 5. 使用测试集评估模型
y_test_pred = log_reg.predict(X_test)

# 计算测试集的性能
test_report = classification_report(y_test, y_test_pred)
print("测试集评估报告:\n", test_report)

# 生成混淆矩阵
conf_matrix = confusion_matrix(y_test, y_test_pred)
print("混淆矩阵:\n", conf_matrix)

# 提供准确度(accuracy)作为最终模型评估的一个关键指标
test_accuracy = np.mean(y_test == y_test_pred)
print(f'测试集准确率: {test_accuracy:.4f}')

(2)调用库方法

1、numpy库:np.mean()用于计算输入数组的平均值,用于计算模型的准确度。

2、pandas库

3、sklearn.datasets库:load_iris()用于加载Iris 数据集sklearn.model_selection库:train_test_split()用于将数据集划分为训练集和测试集。参数有X:特征数据;y:目标标签;test_size=0.33:设置测试集的大小为 33%;random_state=42:设置随机种子以保证结果可复现;stratify=y:按照目标标签的分布来划分数据,确保训练集和测试集中的标签分布一致。cross_val_score()用于计算交叉验证的得分(如准确度)。参数有log_reg:使用的模型(逻辑回归模型);X_train:训练集的特征数据;y_train:训练集的目标标签;cv=kfold:交叉验证折数和分层设置,使用之前定义的 StratifiedKFold;scoring='accuracy':评估指标为准确度。

4、StratifiedKFold()库:参数有n_splits=5:指定交叉验证折数为 5;shuffle=True:是否对数据进行打乱;random_state=42:确保结果可复现。

5、sklearn.linear_model库:LogisticRegression(max_iter=200)参数有max_iter=200:指定最大迭代次数为 200。

6、sklearn.metrics库:classification_report()有参数y_train  y_test:实际的标签;y_train_pred  y_test_pred:预测的标签;confusion_matrix()有参数y_test:实际标签;y_test_pred:预测标签。

 

 

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

 

 

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

 

 

posted @ 2024-11-18 09:16  不会JAVA的小袁  阅读(14)  评论(0编辑  收藏  举报