【机器学习】机器学习的基本分类-监督学习-逻辑回归(Logistic Regression)

逻辑回归是一种分类算法,尽管名字中包含"回归",但其主要用于解决二分类和多分类问题。它通过学习一个逻辑函数,预测输入属于某个类别的概率。


1. 逻辑回归的基本概念

目标

逻辑回归的目标是找到一个函数 h(x),输出一个概率值 P(y=1|x),表示输入样本 x 属于正类的概率。

逻辑函数(Sigmoid 函数)

逻辑回归使用 Sigmoid 函数将线性回归的结果映射到 (0, 1) 之间:

其中:

  • z 是线性模型的结果。
  • h(x) 是预测为正类的概率。

【机器学习】机器学习的基本分类-监督学习-逻辑回归-Sigmoid 函数-CSDN博客


2. 逻辑回归的损失函数

为了优化模型参数 w 和 b,逻辑回归最小化 对数似然损失函数

其中:

  • m 是样本数量。
  • 是第 i 个样本的真实标签。

逻辑回归通过梯度下降或其他优化算法最小化该损失函数。

【机器学习】机器学习的基本分类-监督学习-逻辑回归-对数似然损失函数(Log-Likelihood Loss Function)-CSDN博客


3. 逻辑回归的假设

  1. 数据集中的样本是独立的。
  2. 输入特征和目标变量之间是线性可分的(通过特征变换,可以扩展到非线性问题)。

4. Python 实现

4.1 数据生成

我们以二分类任务为例:

python 复制代码
from sklearn.datasets import make_classification
import matplotlib.pyplot as plt

# 生成二分类数据
# 参数说明:
# n_samples=100: 生成100个样本
# n_features=4: 每个样本有4个特征
# n_classes=2: 分为2个类别
# n_informative=2: 有2个特征是信息特征,对分类有帮助
# n_redundant=1: 有1个特征是冗余特征,对分类无直接帮助
# n_repeated=0: 没有重复的特征
# random_state=0: 设置随机种子,保证结果可重复
X, y = make_classification(n_samples=100, n_features=4, n_classes=2, n_informative=2, n_redundant=1, n_repeated=0,
                           random_state=0)

# 可视化生成的数据
# 这里只绘制了前两个特征,因为高维数据无法直接可视化
# c=y: 根据类别y上色
# cmap='viridis': 使用'viridis'颜色地图
# edgecolor='k': 设置点的边缘颜色为黑色
plt.scatter(X[:, 0], X[:, 1], c=y, cmap='viridis', edgecolor='k')
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.title("Generated Data")
plt.show()

4.2 使用 Scikit-learn 实现
python 复制代码
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report

# 生成二分类数据
# 参数说明:n_samples=100表示生成100个样本,n_features=4表示数据有4个特征,n_classes=2表示二分类问题,
# n_informative=2表示其中2个特征是有信息的,n_redundant=1表示1个特征是冗余的,n_repeated=0表示没有重复的特征,
# random_state=0表示随机种子,保证结果可重复
X, y = make_classification(n_samples=100, n_features=4, n_classes=2, n_informative=2, n_redundant=1, n_repeated=0,
                           random_state=0)

# 数据集划分
# 将数据集划分为训练集和测试集,test_size=0.2表示测试集占20%,random_state=42保证划分结果可重复
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 逻辑回归模型
# 初始化逻辑回归模型
model = LogisticRegression()
# 使用训练集数据拟合模型
model.fit(X_train, y_train)

# 模型预测
# 使用拟合好的模型对测试集进行预测
y_pred = model.predict(X_test)

# 评估模型
# 输出模型的准确率
print("Accuracy:", accuracy_score(y_test, y_pred))
# 输出模型的混淆矩阵
print("Confusion Matrix:\n", confusion_matrix(y_test, y_pred))
# 输出模型的分类报告,包括精确度、召回率、F1值等指标
print("Classification Report:\n", classification_report(y_test, y_pred))

输出结果

bash 复制代码
Accuracy: 0.9
Confusion Matrix:
 [[9 2]
 [0 9]]
Classification Report:
               precision    recall  f1-score   support

           0       1.00      0.82      0.90        11
           1       0.82      1.00      0.90         9

    accuracy                           0.90        20
   macro avg       0.91      0.91      0.90        20
weighted avg       0.92      0.90      0.90        20
4.3 自定义实现

使用 NumPy 手动实现逻辑回归的梯度下降:

python 复制代码
import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 生成二分类数据
# 参数说明:n_samples=100表示生成100个样本,n_features=4表示数据有4个特征,n_classes=2表示二分类问题,
# n_informative=2表示其中2个特征是有信息的,n_redundant=1表示1个特征是冗余的,n_repeated=0表示没有重复的特征,
# random_state=0表示随机种子,保证结果可重复
X, y = make_classification(n_samples=100, n_features=4, n_classes=2, n_informative=2, n_redundant=1, n_repeated=0,
                           random_state=0)

# 数据集划分
# 将数据集划分为训练集和测试集,test_size=0.2表示测试集占20%,random_state=42保证划分结果可重复
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Sigmoid 函数
# 用于将预测值映射到0到1之间,作为概率解释
def sigmoid(z):
    return 1 / (1 + np.exp(-z))


# 损失函数
# 计算模型预测值与真实值之间的交叉熵损失
def compute_loss(y, y_pred):
    return -np.mean(y * np.log(y_pred) + (1 - y) * np.log(1 - y_pred))


# 梯度下降实现逻辑回归
# 参数说明:X为特征数据,y为目标标签,learning_rate为学习率,n_iterations为迭代次数
# 返回值说明:weights为权重参数,bias为偏置参数
def logistic_regression(X, y, learning_rate=0.01, n_iterations=1000):
    m, n = X.shape
    weights = np.zeros(n)
    bias = 0

    for _ in range(n_iterations):
        # 计算预测值
        z = np.dot(X, weights) + bias
        y_pred = sigmoid(z)

        # 计算梯度
        dw = (1 / m) * np.dot(X.T, (y_pred - y))
        db = (1 / m) * np.sum(y_pred - y)

        # 更新参数
        weights -= learning_rate * dw
        bias -= learning_rate * db

    return weights, bias


# 使用模型
# 训练逻辑回归模型,得到权重参数和偏置参数
weights, bias = logistic_regression(X_train, y_train)
# 对测试集进行预测
z = np.dot(X_test, weights) + bias
y_pred = (sigmoid(z) >= 0.5).astype(int)

# 输出准确率
print("Accuracy:", accuracy_score(y_test, y_pred))

输出结果

bash 复制代码
Accuracy: 0.9

5. 多分类逻辑回归

逻辑回归也可以扩展到多分类问题,通过 一对多(One-vs-Rest)策略多项逻辑回归(Softmax Regression) 来处理多类别任务。

Softmax 函数

其中 ,是类别 k 的得分。


6. 优缺点

优点
  1. 简单易用:实现简单,计算速度快。
  2. 结果解释性强:可以直接查看每个特征的权重。
  3. 适合小数据集:在小规模数据上效果良好。
缺点
  1. 线性可分性假设:当数据不可线性分割时,效果较差。
  2. 对异常值敏感:异常数据会极大影响模型。
  3. 扩展性有限:不能直接处理复杂的非线性关系。

7. 应用场景

  1. 二分类问题
    • 邮件分类(垃圾邮件/正常邮件)。
    • 医疗诊断(患病/健康)。
  2. 多分类问题
    • 文本情感分析(积极/消极/中立)。
    • 图片分类(猫/狗/鸟)。

8. 优化与改进

  1. 特征工程:通过多项式特征扩展、标准化等提高模型效果。
  2. 正则化 :通过 L1(Lasso)或 L2(Ridge)正则化减少过拟合。
    • L1 可用于特征选择。
    • L2 提高模型的泛化能力。
  3. 核方法:结合核技巧(如支持向量机)处理非线性问题。

拓展内容

【机器学习】分类任务: 二分类与多分类-CSDN博客

【机器学习】机器学习的基本分类-监督学习-逻辑回归-Sigmoid 函数-CSDN博客

【机器学习】机器学习的基本分类-监督学习-逻辑回归-对数似然损失函数(Log-Likelihood Loss Function)-CSDN博客

相关推荐
花姐夫Jun6 分钟前
node.js基础学习-cheerio模块-简单小爬虫(五)
爬虫·学习·node.js·网络爬虫
Xlous_Mao9 分钟前
# issue 6 网络编程基础
服务器·网络·学习·issue
花姐夫Jun12 分钟前
node.js基础学习-fs模块-文件操作(六)
学习·node.js·文件操作·fs
erxij24 分钟前
【游戏引擎之路】登神长阶(十五)——DirectX12龙书:行百里者半九十(学习阶段完结)
c++·经验分享·学习·游戏·3d·游戏引擎
不会代码的小林26 分钟前
llamafactory微调
机器学习
老艾的AI世界1 小时前
AI让照片跳舞,人人都能是舞王!Swan下载介绍
人工智能·深度学习·神经网络·目标检测·机器学习·ai·图像识别·ai生成视频·ai跳舞·ai视频生成
美式小田1 小时前
ADS学习笔记 7. 超外差接收机设计
笔记·学习·射频工程
Mephisto.java2 小时前
【大数据学习 | Spark调优篇】Spark之JVM调优
大数据·学习·spark
生信宝典2 小时前
如何画出漂亮的决策树?
算法·决策树·机器学习
Qhumaing2 小时前
python学习——字典元素的访问和遍历
开发语言·python·学习