当前位置: 首页 > article >正文

逻辑回归(Logistic Regression) —— 机器学习中的经典分类算法

1. 逻辑回归简介

逻辑回归是一种线性分类模型,常用于二分类问题。它通过学习特征权重,将输入映射为0 到 1 之间的概率值,并根据阈值将样本归入某一类别。逻辑回归使用Sigmoid 函数将线性结果转化为概率。

尽管名字中有“回归”,但逻辑回归主要是用于分类任务


2. 数学公式

预测函数

逻辑回归的预测公式为: h_\theta(x) = \frac{1}{1 + e^{-\theta^T x}}

  • x 为输入特征向量;
  • θ 为参数向量;
  • h_\theta(x) 表示样本属于正类的概率。
损失函数

逻辑回归的损失函数是对数损失函数(Log Loss)

J(\theta) = -\frac{1}{m} \sum_{i=1}^{m} \left[ y^{(i)} \log(h_\theta(x^{(i)})) + (1 - y^{(i)}) \log(1 - h_\theta(x^{(i)})) \right]

  • m 为样本数量;
  • y^{(i)} 为真实标签(0 或 1);
  • h_\theta(x^{(i)}) 为第 i 个样本的预测概率。
  • θ 为权重参数。

3. 示例代码

这里用 Python + scikit-learn 实现逻辑回归模型:

示例任务:使用鸢尾花数据集进行分类
# 导入必要的库
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report

# 1. 加载数据集
iris = load_iris()
X = iris.data[:, :2]  # 选取前两个特征便于可视化
y = (iris.target != 0).astype(int)  # 转换成二分类问题(是否为第一类)

# 2. 数据预处理
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
scaler = StandardScaler()  # 标准化特征
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# 3. 训练逻辑回归模型
model = LogisticRegression()
model.fit(X_train, y_train)

# 4. 预测并评估
y_pred = model.predict(X_test)
print("模型准确率:", accuracy_score(y_test, y_pred))
print("分类报告:\n", classification_report(y_test, y_pred))

# 5. 可视化决策边界
def plot_decision_boundary(X, y, model):
    h = 0.01
    x_min, x_max = X[:, 0].min() - 0.5, X[:, 0].max() + 0.5
    y_min, y_max = X[:, 1].min() - 0.5, X[:, 1].max() + 0.5
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
    Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    plt.contourf(xx, yy, Z, alpha=0.8)
    plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', marker='o')
    plt.xlabel("Feature 1")
    plt.ylabel("Feature 2")
    plt.title("Logistic Regression Decision Boundary")
    plt.show()

plot_decision_boundary(X_test, y_test, model)


4. 代码说明

  1. 加载数据集

    • load_iris() 加载鸢尾花数据集,将标签转换为二分类问题(0 或 1)。
  2. 数据预处理

    • 使用 StandardScaler 对特征标准化,使其均值为 0,方差为 1。
  3. 模型训练

    • 使用 LogisticRegression 训练逻辑回归模型。
  4. 模型评估

    • 使用 accuracy_scoreclassification_report 评估模型性能。
  5. 可视化

    • 绘制逻辑回归的决策边界

5. 模型分析与扩展

优点
  • 输出概率值,具有良好的可解释性;
  • 计算简单,训练速度快;
  • 适合线性可分问题。
缺点
  • 对于复杂的非线性关系表现不佳;
  • 容易受到异常值的影响。
扩展
  • 多分类逻辑回归:通过 multi_class='multinomial'solver='lbfgs' 参数,逻辑回归可以实现多分类。
  • 正则化penalty 参数可设置 L1(Lasso)或 L2(Ridge)正则化来防止过拟合。

6. 进一步提升

  • 特征工程:创建更多有效的特征,如多项式特征。
  • 正则化:合理设置正则化参数 C 以控制模型复杂度。
  • 非线性模型:如果逻辑回归效果不佳,可以尝试更复杂的非线性模型,如 SVM 或神经网络。

逻辑回归模型输入数据格式

LogisticRegression 模型来自 scikit-learn 库,fit(X_train, y_train) 方法用于训练模型。这里的 X_trainy_train 是输入特征和标签,要求的数据格式如下:


1. X_train(特征矩阵)

  • 类型numpy.ndarraypandas.DataFrame 或其他可被转换为 NumPy 数组的格式。
  • 形状(n_samples, n_features)
    • n_samples:样本数量(行数)。
    • n_features:每个样本的特征数量(列数)。
示例

如果有 100 个样本,每个样本有 4 个特征,那么 X_train 的形状为 (100, 4)

X_train = np.array([[5.1, 3.5, 1.4, 0.2],
                    [4.9, 3.0, 1.4, 0.2],
                    ...  # 省略其他样本
                    ])

2. y_train(标签向量)

  • 类型numpy.ndarraypandas.Series 或其他可被转换为一维数组的格式。
  • 形状(n_samples,)
    • n_samples:标签数量,必须与 X_train 的样本数量相同。
值的范围
  • 二分类问题时,y_train 通常为 0 或 1;
  • 多分类问题时,y_train 为类别索引(如 0、1、2 等整数)。
示例

如果有 100 个样本,y_train 为长度为 100 的一维数组:

y_train = np.array([0, 1, 0, 1, 1, 0, ...])

3. 输入数据注意事项

  1. 缺失值

    • X_train 不允许有缺失值(NaN),可以使用 SimpleImputer 等方法填充缺失值。
  2. 数据类型

    • 输入数据最好为浮点型。可以通过 X_train.astype(float) 将数据转换为 float 类型。
  3. 标准化/归一化

    • 对特征进行标准化或归一化可以加快模型收敛速度,尤其是当特征值的量级差距较大时。

4. 示例代码

以下是完整的数据格式示例:

import numpy as np
from sklearn.linear_model import LogisticRegression

# 示例数据
X_train = np.array([[5.1, 3.5, 1.4, 0.2],
                    [4.9, 3.0, 1.4, 0.2],
                    [4.7, 3.2, 1.3, 0.2]])
y_train = np.array([0, 1, 0])  # 标签对应样本类别

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

5. 输出

  • 训练后的模型:保存了特征权重 theta,可以通过 model.coef_ 查看;
  • 预测新数据:调用 model.predict(X_test),输入格式同 X_train

总结:X_train 为二维矩阵,y_train 为一维向量,并且二者的样本数量需要一致。如果数据有问题(如缺失值或数据类型不匹配),需要在训练前进行预处理。


http://www.kler.cn/a/466253.html

相关文章:

  • 利用webworker解决性能瓶颈案例
  • 概述(讲讲python基本语法和第三方库)
  • Python入门教程 —— 模块和包
  • 解决CentOS 8 YUM源更新后报错问题:无法下载AppStream仓库元数据
  • 【数据结构-堆】力扣2530. 执行 K 次操作后的最大分数
  • 基于Java的超级玛丽游戏的设计与实现【源码+文档+部署讲解】
  • 【Nginx Docker】Office Word Web addin 部署nginx docker
  • 2024转转技术年货发布啦
  • 中建海龙:科技助力福城南产业片区绿色建筑发展
  • HarmonyOS鸿蒙开发 应用开发常见问题总结(持续更新...)
  • Python 链接 Pcomm
  • [CTF/网络安全] 攻防世界 simple_js 解题详析
  • python 插入排序(Insertion Sort)
  • MyBatis一级缓存与二级缓存详解
  • Spring Boot项目中分布式锁实现方案:Redisson
  • Java(四十四)file
  • JavaScript Math(算数) 对象的用法详解
  • 【UE5 C++课程系列笔记】17——DeveloperSettings(开发者设置)的基本使用——读取修改Settings
  • 初步认识UML
  • 动态库dll与静态库lib编程3:DLL导出函数的调用
  • 深度学习笔记10-数据增强(Tensorflow)
  • 在Vue3项目中使用svg-sprite-loader
  • Gitee 的基本用法
  • 查看打开的端口
  • 【JavaWeb后端学习笔记】MySQL的数据控制语言(Data Control Language,DCL)
  • 多线程访问FFmpegFrameGrabber.start方法阻塞问题