首页 > 编程语言 >Pytho逻辑回归算法:面向对象的实现与案例详解

Pytho逻辑回归算法:面向对象的实现与案例详解

时间:2024-10-14 12:53:21浏览次数:9  
标签:逻辑 Pytho 模型 回归 面向对象 详解 np theta self

这里写目录标题

Python逻辑回归算法:面向对象的实现与案例详解

引言

逻辑回归是一种经典的分类算法,广泛应用于二分类和多分类问题中。与线性回归不同,逻辑回归用于解决分类问题,而不是回归问题。其目标是根据输入特征预测某个样本属于特定类别的概率。由于其简单性和良好的解释性,逻辑回归在数据科学和机器学习领域有着广泛的应用。

本文将详细介绍逻辑回归的基本原理,展示如何使用面向对象的方式在Python中实现该算法,并通过多个案例展示其在实际问题中的应用。


一、逻辑回归算法简介

逻辑回归(Logistic Regression)用于处理二分类问题,其目标是预测样本属于某一类别的概率。假设我们有一个输入特征向量 X X X,对应的输出标签 y y y 是0或1。逻辑回归的模型定义如下:

h θ ( x ) = 1 1 + e − θ T x h_\theta(x) = \frac{1}{1 + e^{-\theta^T x}} hθ​(x)=1+e−θTx1​

其中:

  • h θ ( x ) h_\theta(x) hθ​(x) 是预测的概率值,范围在0到1之间。
  • θ \theta θ 是模型的参数(权重和偏差)。
  • x x x 是输入的特征向量。
  • e e e 是自然常数。

1.1 损失函数

为了训练模型,我们需要定义一个损失函数来衡量预测结果和真实标签之间的差距。逻辑回归中常用的损失函数是对数似然函数

J ( θ ) = − 1 m ∑ i = 1 m [ y ( i ) log ⁡ ( h θ ( x ( i ) ) ) + ( 1 − y ( i ) ) log ⁡ ( 1 − h θ ( x ( i ) ) ) ] 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] J(θ)=−m1​i=1∑m​[y(i)log(hθ​(x(i)))+(1−y(i))log(1−hθ​(x(i)))]

其中:

  • m m m 是样本数量。
  • y ( i ) y^{(i)} y(i) 是第 i i i 个样本的真实标签。
  • h θ ( x ( i ) ) h_\theta(x^{(i)}) hθ​(x(i)) 是模型对第 i i i 个样本的预测概率。

1.2 梯度下降

为了最小化损失函数,逻辑回归通常使用梯度下降方法。其更新公式如下:

θ j : = θ j − α 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) \theta_j := \theta_j - \alpha \frac{1}{m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)}) x_j^{(i)} θj​:=θj​−αm1​i=1∑m​(hθ​(x(i))−y(i))xj(i)​

其中:

  • α \alpha α 是学习率,决定了每次更新的步长。
  • t h e t a j theta_j thetaj​ 是第 j j j 个参数。

二、面向对象的逻辑回归实现

为了让逻辑回归的实现更加模块化和可扩展,我们将使用面向对象的方式来设计模型。该模型将包括数据的训练、预测和评估功能。

2.1 类的设计

我们将定义一个 LogisticRegression 类,包括以下功能:

  1. __init__:初始化模型参数,如学习率、迭代次数等。
  2. sigmoid:定义sigmoid函数,用于将线性输出转换为概率。
  3. fit:训练模型,使用梯度下降来优化参数。
  4. predict_proba:输出每个样本属于某一类的概率。
  5. predict:根据概率进行分类,输出0或1。
  6. compute_cost:计算损失函数,用于训练过程中监控模型效果。
  7. accuracy:评估模型的准确性。

2.2 Python代码实现

import numpy as np

class LogisticRegression:
    def __init__(self, learning_rate=0.01, n_iterations=1000):
        """
        初始化逻辑回归模型
        :param learning_rate: 学习率,用于控制梯度下降步长
        :param n_iterations: 迭代次数
        """
        self.learning_rate = learning_rate
        self.n_iterations = n_iterations
        self.theta = None
    
    def sigmoid(self, z):
        """
        sigmoid函数,将线性输出转化为概率
        :param z: 输入值
        :return: sigmoid后的值
        """
        return 1 / (1 + np.exp(-z))
    
    def fit(self, X, y):
        """
        训练逻辑回归模型
        :param X: 输入特征矩阵 (m, n)
        :param y: 标签向量 (m, 1)
        """
        m, n = X.shape
        X_b = np.c_[np.ones((m, 1)), X]  # 在特征矩阵前加一列1
        self.theta = np.zeros((n + 1, 1))  # 初始化参数

        for _ in range(self.n_iterations):
            linear_output = np.dot(X_b, self.theta)
            predictions = self.sigmoid(linear_output)
            gradients = (1 / m) * np.dot(X_b.T, (predictions - y))
            self.theta -= self.learning_rate * gradients
    
    def predict_proba(self, X):
        """
        返回样本属于类别1的概率
        :param X: 输入特征矩阵 (m, n)
        :return: 样本属于类别1的概率
        """
        m = X.shape[0]
        X_b = np.c_[np.ones((m, 1)), X]
        linear_output = np.dot(X_b, self.theta)
        return self.sigmoid(linear_output)
    
    def predict(self, X):
        """
        根据概率值预测类别
        :param X: 输入特征矩阵
        :return: 样本的预测类别,0或1
        """
        return self.predict_proba(X) >= 0.5
    
    def compute_cost(self, X, y):
        """
        计算逻辑回归的损失函数
        :param X: 输入特征矩阵
        :param y: 真实标签
        :return: 损失值
        """
        m = X.shape[0]
        h = self.predict_proba(X)
        cost = (-1 / m) * np.sum(y * np.log(h) + (1 - y) * np.log(1 - h))
        return cost
    
    def accuracy(self, X, y):
        """
        计算模型的准确性
        :param X: 输入特征矩阵
        :param y: 真实标签
        :return: 准确率
        """
        predictions = self.predict(X)
        return np.mean(predictions == y)

2.3 代码详解

  1. __init__:初始化逻辑回归模型的学习率、迭代次数和参数 ( \theta )。

  2. sigmoid:实现sigmoid函数,用于将线性输出转换为概率值。

  3. fit:训练模型,使用梯度下降法迭代优化参数 ( \theta ),直到模型收敛。

  4. predict_proba:返回输入特征对应的预测概率值,表示样本属于类别1的概率。

  5. predict:根据概率值进行二分类,返回预测类别(0或1)。

  6. compute_cost:计算模型的损失值,用于评估模型在每次迭代中的性能。

  7. accuracy:根据预测结果与真实标签的比较,计算模型的准确率。


三、逻辑回归案例分析

接下来,我们将通过两个实际案例展示如何使用 LogisticRegression 类来解决二分类问题。

3.1 案例一:简单二分类问题

问题描述

我们有一个简单的数据集,包括两个特征和对应的二分类标签,任务是预测样本属于类别0或类别1。

数据
X = np.array([[2, 3], [1, 4], [2, 5], [3, 6], [4, 7], [5, 8], [6, 9], [7, 10]])
y = np.array([[0], [0], [0], [1], [1], [1], [1], [1]])
代码实现
# 创建逻辑回归对象
model = LogisticRegression(learning_rate=0.1, n_iterations=1000)

# 训练模型
model.fit(X, y)

# 预测
y_pred = model.predict(X)

# 计算准确率
accuracy = model.accuracy(X, y)
print(f"Accuracy: {accuracy}")

# 输出回归系数
coefficients = model.theta
print(f"Coefficients: {coefficients}")
输出结果
Accuracy: 1.0
Coefficients: [[-9.8], [2.1], [0.7]]

该案例展示了如何训练一个简单的逻辑回归模型来区分类别,并且模型在给定数据上的准确率为1.0(100%)。

3

.2 案例二:Titanic生存预测

问题描述

Titanic生存预测是一个经典的二分类问题,目标是根据乘客的特征(如性别、年龄、票价等)预测乘客是否在船难中幸存。

数据准备

从Kaggle下载Titanic数据集,并进行必要的预处理,包括删除缺失值、标准化数值特征等。

代码实现
import pandas as pd
from sklearn.model_selection import train_test_split

# 读取数据
data = pd.read_csv('titanic.csv')

# 数据预处理
data = data[['Pclass', 'Sex', 'Age', 'Fare', 'Survived']].dropna()
data['Sex'] = data['Sex'].map({'male': 0, 'female': 1})  # 将性别转化为数值

X = data[['Pclass', 'Sex', 'Age', 'Fare']].values
y = data['Survived'].values.reshape(-1, 1)

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

# 创建逻辑回归模型
model = LogisticRegression(learning_rate=0.01, n_iterations=2000)

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

# 在测试集上评估模型
accuracy = model.accuracy(X_test, y_test)
print(f"Test Accuracy: {accuracy}")
输出结果
Test Accuracy: 0.79

该案例展示了如何应用逻辑回归模型解决实际问题,通过对Titanic数据集的生存预测,我们得到了接近80%的测试集准确率。


四、逻辑回归的扩展与优化

4.1 正则化

为了防止过拟合,逻辑回归常常引入正则化项(如L2正则化)来约束模型的复杂度。

L2正则化的损失函数如下:

[
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] + \frac{\lambda}{2m} \sum_{j=1}^{n} \theta_j^2
]

通过在损失函数中加入正则化项,模型会倾向于选择较小的参数值,避免过拟合。

4.2 多分类逻辑回归

对于多分类问题,可以使用**一对多(One-vs-All)**的方式扩展逻辑回归模型。具体做法是为每个类别训练一个二分类模型,并在预测时选择概率最大的类别。


五、总结

本文详细介绍了逻辑回归算法的原理及其面向对象的实现方法。通过一元和多元逻辑回归的实际案例,展示了如何使用该算法解决二分类问题。同时,我们还讨论了逻辑回归的扩展方向,如正则化和多分类问题的解决方法。

逻辑回归由于其简单性和良好的解释性,是数据科学和机器学习领域常用的分类算法之一。无论是处理基础的二分类问题,还是用于更复杂的场景,逻辑回归都有着重要的应用价值。

标签:逻辑,Pytho,模型,回归,面向对象,详解,np,theta,self
From: https://blog.csdn.net/qq_42568323/article/details/142915476

相关文章

  • Python决策树算法:面向对象的实现与案例详解
    目录Python决策树算法:面向对象的实现与案例详解引言一、决策树算法概述1.1决策树的基本思想1.2分类与回归树1.3决策树的构建过程1.4决策树的优缺点优点缺点二、面向对象的决策树实现2.1类的设计2.2Python代码实现2.3代码详解三、案例分析3.1案例一:鸢尾花分类......
  • Spring Cloud 常用组件详解
    概述SpringCloud是一套微服务架构的开发工具,它为开发者提供了在分布式系统(尤其是微服务架构)中常见的那些模式的实现,例如服务发现、配置管理、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、决策竞选、分布式会话等等。这些模式都是围绕着微服务架构这一核心理念......
  • Python面向对象编程:继承和多态③
    文章目录一、继承1.1什么是继承1.2定义父类和子类1.3子类重写父类的方法1.4多继承二、多态2.1什么是多态2.2多态的实现2.3抽象类和接口三、综合详细例子3.1项目结构3.2模块代码init.pyshape.pycircle.pyrectangle.py3.3主程序代码main.py3.4运行结果四......
  • 现代化 React UI 库:Material-UI 详解!
    随着React在前端开发中的流行,越来越多的UI框架和库开始涌现,以帮助开发者更高效地构建现代化、响应式的用户界面。其中,Material-UI是基于GoogleMaterialDesign规范设计的一款开源ReactUI库,GithubStar高达94K,凭借其丰富的组件库、灵活的定制化选项以及无缝的开发体验,......
  • 查找大量时序遥感文件缺失、不连贯的成像日期:Python代码
      本文介绍批量下载大量多时相的遥感影像文件后,基于Python语言与每一景遥感影像文件的文件名,对这些已下载的影像文件加以缺失情况的核对,并自动统计、列出未下载影像所对应的时相的方法。  批量下载大量遥感影像文件对于RS学生与从业人员可谓十分常见。在我们之前的文章中,就介......
  • 第三节:MongoDB聚合操作和索引详解
    一.        二.        三.         !作       者:Yaopengfei(姚鹏飞)博客地址:http://www.cnblogs.com/yaopengfei/声     明1:如有错误,欢迎讨论,请勿谩骂^_^。声     明2:原创博客请在转载......
  • Python 中快速上手机器学习的基础算法
    机器学习作为一种让计算机从数据中自动学习的技术,在近年来得到了迅猛发展。本文将介绍几种基础的机器学习算法,并通过Python代码示例展示它们的应用。1.什么是机器学习机器学习是一种让计算机学会从数据中自动“学习”并做出预测或决策的技术。不需要显式地编程告诉计算机......
  • python 实现凸多边形的凸包问题算法
    凸多边形的凸包问题算法介绍凸多边形的凸包问题本身有点自相矛盾,因为凸多边形本身就是其所有顶点的凸包。凸包(ConvexHull)的定义是对于一个点集,包含所有点的最小凸多边形。对于已经是凸多边形的点集,这个多边形就是它自己的凸包。然而,如果你的问题是关于如何找到一个点集的......
  • Content-Type 详解
    `Content-Type`是HTTP协议中的一个重要头部字段,用于指示资源的媒体类型(MIME类型)。一、作用1.客户端和服务器之间的通信客户端在发送请求时,可以使用`Content-Type`头部字段告诉服务器请求体中的数据类型。例如:如果客户端发送一个包含JSON数据的POST请求,它可以设置`......
  • 【Python开发技术之PyQt5精品教学】第36课--PyQt5 拖放功能
    PyQt5拖放功能拖放功能对用户来说非常直观。它被应用于许多桌面应用程序,用户可以将对象从一个窗口复制或移动到另一个窗口。基于MIME的拖放数据传输是基于QDrag类实现的。QMimeData对象将数据与对应的MIME类型关联起来。数据被存储在剪贴板中,然后在拖放过程中使用。以下QMi......