手动实现逻辑回归算法(LogisticRegression)
目录
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 |
---|---|---|
25 | 70 | 0 |
45 | 85 | 1 |
35 | 65 | 0 |
50 | 90 | 1 |
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,蓝色为类别0)。
-
混淆矩阵:展示预测与真实标签的对比,用颜色区分预测正确和错误的数量。
-
ROC曲线:展示模型的假阳性率和真阳性率的权衡,计算AUC值衡量模型性能。
-
逻辑回归系数:展示模型训练后得到的特征权重,以柱状图的形式显示每个特征的重要性。
这里使用了库函数,如果想要从头实现逻辑回归,可以参考之前的代码:
pytorch 深度学习初体验_听风吹等浪起的博客-CSDN博客
原文地址:https://blog.csdn.net/qq_44886601/article/details/142432714
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!