自学内容网 自学内容网

手动实现逻辑回归算法(LogisticRegression)

目录

1. 前言

2. 示例

3. 原理介绍

4. 实验代码


1. 前言

逻辑回归是一种解决分类问题的算法

值得注意的是,在机器学习中,回归指的是连续型数据的预测问题。而这里的逻辑回归特指分类任务,比如判断一个人是否患病、是否健康等等

逻辑回归引入曲线函数:S型曲线,sigmoid函数

它能将输出值压缩在0-1之间,从而解决了线性回归不适用分类问题的问题。

关于sigmoid函数的优缺点分析可以参考:神经网络中激活函数介绍、优缺点分析-CSDN博客

逻辑回归的核心思想是:使用线性回归的思想来计算一个分数,然后通过 S型曲线(Sigmoid函数)将这个分数转化为类别1的概率。

2. 示例

假设我们要预测某个人是否健康:

  • 假如输入变量 x、y 包含年龄和体重等信息,我们通过线性组合(如z =ax+ by)得到 。

  • 然后通过S型曲线将z 转换为一个概率。如果这个概率超过某个阈值(例如0.5),我们就预测这个人健康,否则就认为不健康。

例如:假设

用逻辑回归模型预测一个人是否某种健康。我们手里有数据集,每个样本都有两列:年龄和体重,输出是 0(健康)或 1(不健康)。

年龄 x体重 y是否健康 z
25700
45851
35650
50901

 

3. 原理介绍

逻辑回归的目标是预测二元分类问题,输出的结果是一个0或1的概率。为了将线性回归的输出(无限范围的实数)转化为一个概率,使用Sigmoid函数

Sigmoid函数将任何实数映射到0到1之间,适合用来表示概率:

其中z=ax+by等等,这里的x、y是输入数据,也就是特征,a、b是权重,也就是特征的重要程度

Sigmoid函数的输出可以理解为“属于类别1的概率”。当输出接近1时,模型认为数据点属于类别1的概率较高;当输出接近0时,模型认为数据点属于类别0的概率较高。

损失函数:交叉熵损失

为了优化模型,使用交叉熵损失函数(log loss)来衡量模型预测的概率与真实类别标签之间的差距。交叉熵损失定义如下:

其中,yi 是真实类别,pi是预测值

交叉熵函数这块尤其重要,特别对于图像分割而言,聊聊关于分类和分割的损失函数:nn.CrossEntropyLoss()-CSDN博客

这篇博文做了详细介绍和实验,建议不懂得自己看下

梯度下降

逻辑回归通常通过梯度下降法来更新权重和偏置项,以最小化损失函数。

矩阵的梯度计算:聊聊关于矩阵反向传播的梯度计算-CSDN博客

4. 实验代码

实验的逻辑、步骤如下

  • 数据生成:创建两个特征,使用简单的条件生成二元分类数据。两个特征之和大于0的点被归为类别1,反之为类别0。

  • 训练模型:使用 LogisticRegression 训练模型。

  • 性能评估:使用混淆矩阵、ROC曲线、模型系数等方式评估模型的表现。

  • 绘图部分:绘制四个图形,分别是数据分布图、混淆矩阵、ROC曲线、逻辑回归的特征系数图。

代码如下:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix, roc_curve, auc

# 生成虚拟数据集
np.random.seed(42)
N = 1000
X = np.random.randn(N, 2)  # 生成两个特征
y = (X[:, 0] + X[:, 1] > 0).astype(int)  # 逻辑回归目标类别(0或1)

# 分割训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 模型训练
model = LogisticRegression()
model.fit(X_train, y_train)

# 模型预测
y_pred = model.predict(X_test)
y_pred_prob = model.predict_proba(X_test)[:, 1]

# 计算模型精度
accuracy = accuracy_score(y_test, y_pred)
print(f'模型精度: {accuracy:.2f}')

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

# 绘图风格设置
sns.set(style="whitegrid")
plt.figure(figsize=(14, 10))

# 1. 绘制数据分布图
plt.subplot(2, 2, 1)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap='coolwarm', edgecolor='k')
plt.title('Data Distribution (Red: Class 1, Blue: Class 0)')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')

# 2. 混淆矩阵可视化
plt.subplot(2, 2, 2)
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', cbar=False)
plt.title('Confusion Matrix')
plt.xlabel('Predicted Class')
plt.ylabel('True Class')

# 3. ROC曲线
fpr, tpr, _ = roc_curve(y_test, y_pred_prob)
roc_auc = auc(fpr, tpr)
plt.subplot(2, 2, 3)
plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'ROC Curve (AUC = {roc_auc:.2f})')
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.legend(loc="lower right")

# 4. 逻辑回归系数
plt.subplot(2, 2, 4)
coefs = pd.Series(model.coef_[0], index=['Feature 1', 'Feature 2'])
coefs.plot(kind='bar', color='orange')
plt.title('Logistic Regression Coefficients')
plt.ylabel('Coefficient Value')

plt.tight_layout()
plt.show()

输出如下:

  1. 数据分布图:显示虚拟数据集的两个特征以及分类结果(红色为类别1,蓝色为类别0)。

  2. 混淆矩阵:展示预测与真实标签的对比,用颜色区分预测正确和错误的数量。

  3. ROC曲线:展示模型的假阳性率和真阳性率的权衡,计算AUC值衡量模型性能。

  4. 逻辑回归系数:展示模型训练后得到的特征权重,以柱状图的形式显示每个特征的重要性。

这里使用了库函数,如果想要从头实现逻辑回归,可以参考之前的代码:

pytorch 深度学习初体验_听风吹等浪起的博客-CSDN博客


原文地址:https://blog.csdn.net/qq_44886601/article/details/142432714

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!