首页 > 编程语言 >逻辑斯特回归原理及Python实现

逻辑斯特回归原理及Python实现

时间:2024-05-11 10:53:28浏览次数:32  
标签:逻辑 mathbf Python 回归 tag 斯特 test frac

逻辑回归(Logistic Regression),又称为 logistic 回归分析,是一种广义的线性回归模型,通常用于解决分类问题。虽然名字里有“回归”,但实际上它属于机器学习中的监督学习方法。逻辑回归最初用于解决二分类问题,它也可以通过一些技巧扩展到多分类问题。在实际应用中,我们通常使用给定的训练数据集来训练模型,并在训练结束后利用测试集来评估模型的性能,以确保模型的泛化能力和预测准确性。逻辑回归因其简单、高效且易于解释的特点,在实际应用中得到了广泛的应用,特别是在医学、金融和市场营销等领域。

一、逻辑线性回归基础

考虑如下线性函数:

\[y = \mathbf{w}^\mathbf{T} \mathbf{x} + b \tag{1} \]

输出$ y $ 为连续的实值,如何让输出成为二值来完成二分类任务?即$ y \in {0, 1} $,最理想的是单位阶跃函数即:

\[y = \begin{cases} 0, & \text{if } z < 0 \\ 0.5, & \text{if } z = 0 \\ 1, & \text{if } z > 0 \end{cases} \tag{2} \]

但是,单位阶跃函数不连续,不利于求解权值,构建模型。于是引入sigmoid函数(对数几率函数,logistic function),它单调可微,并且形似阶跃函数,其公式描述如下所示:

\[y = \frac{1}{1 + e^{-(\mathbf{w}^\mathbf{T} \mathbf{x} + b)}} \tag{3} \]

对数线性回归 阶跃函数和对数几率

令 $y $ 表示当输入为 $x $ 时,输出为正例的概率(可能性),即 $y = P(Y=1|X=x) $;$1 - y $ 表示当输入为 $x $ 时,输出为反例的概率(可能性),即 $1 - y = P(Y=0|X=x) $。两者的比值 $\frac{y}{1-y} $ 称为几率(odds),对其取对数即达到对数几率,所以logistic回归又称为对数几率回归。因此根据(2)可得对数几率回归(logistic回归)公式如下所示:

$ \log \frac{y}{1-y} = \mathbf{w}^\mathbf{T} \mathbf{x} + b \tag{4} $

由式(3)可得二项逻辑斯蒂回归模型如下所示:

$ \log \frac{P(Y=1|X=x)}{1-P(Y=1|X=x)} = \mathbf{w}^\mathbf{T} \mathbf{x} \tag{5} $

其中, $$\mathbf{w} = (w_1, w_2, ..., w_m,b)^\mathbf{T},\mathbf{x} = (x_1, x_2, ..., x_m, 1)$$学习模型的关键是对权值 $\mathbf{w} $ 的学习,已知的是训练样本即输入及其对应的标签,利用已知输入样本来如何学习权值?该学习过程可以转化为带约束的最优化问题,或者以极大似然函数为目标函数(策略)并使用梯度上升或者牛顿法等最优化算法。
极大似然函数的假设:训练样本出现的概率最大。换句话所就是,有些事情具有多种可能,而其中一种可能值出现,其他可能值未出现,在这个过程中,出现的可能值具有较大概率,所以才会出现。
一种学习方法的假设很重要,合理、科学的假设代表了学习方法的正确方向,在该假设条件下,得出的模型往往能够达到预期效果。设训练样本 \(\{ \mathbf{X},\mathbf{y}\}\),其中$\mathbf{X} = {\mathbf{x}_j },\mathbf{x}_j \in \mathbb{R}^n ,\mathbf{y} \in \mathbb{R}^n ,y_i \in {0, 1} ,i = 1, 2, ..., n ,j = 1, 2, ..., m $,则逻辑斯蒂回归输出 \(\hat{y} = \frac{1}{1+e^{-(\mathbf{w}^\mathbf{T} \mathbf{x})}} \in (0,1)\) 为区间在0和1的连续实值(表示概率)。则 样本的似然函数为

\[L(\mathbf{w})=\prod_{i=1}^{n}\hat{y}_i^{y_i}(1-\hat{y}_i)^{(1-y_i)} \tag{6} \]

对数似然函数为

\[ L(\mathbf{w})=\sum_{i=1}^{n}(y_i\log\hat{y}_i+(1-y_i)\log(1-\hat{y_i})) \\\\ \quad =\sum_{i=1}^{n}(y_i\log\frac{\hat{y}_i}{(1-\hat{y_i})}+\log(1-\hat{y_i})) \\\\ \qquad =\sum_{i=1}^{n}(y_i\mathbf{w}^\mathbf{T}\mathbf{x}_i-\log(1+e^{(\mathbf{w}^\mathbf{T}\mathbf{x}_i)}))\tag{7} \]

则逻辑斯蒂回归模型学习可转化为如下最优化问题:

$ \max_{\mathbf{w}}L(\mathbf{w}) \quad \tag{8} $

采用梯度上升算法来求解函数的最大值(梯度下降求解函数的最小值):对式(7)对权值求偏导得如下公式:

\[ \nabla\_{\mathbf{w}}=\left[ \begin{matrix} \nabla_{w_1}\\\\ \nabla_{w_2}\\\\ \vdots\\\\ \nabla_{w_m} \end{matrix} \right] =\frac{\partial L(\mathbf{w})}{\partial \mathbf{w}} =\sum_{i=1}^{n}(y_i\mathbf{x}_i-\frac{1}{1+e^{(\mathbf{w}^\mathbf{T}\mathbf{x}_i)}}e^{(\mathbf{w}^\mathbf{T}\mathbf{x}\_i)}\mathbf{x}_i) \\\\ =\sum_{i=1}^{n}(y_i-\frac{1}{1+e^{-(\mathbf{w}^\mathbf{T}\mathbf{x}_i)}})\mathbf{x}_i=\sum_{i=1}^{n}(y_i-\hat{y}_i)\mathbf{x}_i \\\\ =\mathbf{X}^\mathbf{T}(\mathbf{y}-\hat{\mathbf{y}}) \tag{9} \]

在此需注意到: $\mathbf{y}-\hat{\mathbf{y}} $ 为误差向量。梯度上升算法的迭代公式如下所示:

\[\mathbf{w}:= \mathbf{w}+\alpha \nabla_{\mathbf{w}} \tag{10} \]

其中, $\alpha $ 为步长因子,需人为给定,$\mathbf{w} $ 的初始值一般设置为 $[-0.01,0.01] $ 之间。梯度下降算法为:

\[\mathbf{w}:= \mathbf{w}-\alpha \nabla_{\mathbf{w}} \]

二、逻辑回归原理

2.1 二项逻辑斯谛回归

二项逻辑斯谛回归模型定义了如下的条件概率分布:

\[P(Y=1|x) = \frac{\exp(w \cdot x + b)}{1 + \exp(w \cdot x + b)} \tag{11} \]

\[P(Y=0|x) = \frac{1}{1 + \exp(w \cdot x + b)} \tag{12} \]

其中$x \in \mathbb{R}^n $ 是输入,\(Y \in \{0,1\}\) 是输出,\(w\in \mathbb{R}^n\)是权重向量参数,\(b \in \mathbb{R}\) 是偏置项,\(w \cdot x\) 表示 $ w $ 和 $ x $ 的内积。

通过将权重向量和输入向量扩充,记作 $ w $ 和 $ x $ ,即:

\[w = \left( w^{(1)}, w^{(2)}, ..., w^{(n)}, b \right)^T \]

\[x = \left( x^{(1)}, x^{(2)}, ..., x^{(n)} \right) \]

二项逻辑斯谛回归模型可以表示为:

\[P(Y=1|x) = \frac{\exp(w \cdot x)}{1 + \exp(w \cdot x)} \tag{13} \]

\[P(Y=0|x) = \frac{1}{1 + \exp(w \cdot x)} \tag{14} \]

2.2 多项逻辑斯谛回归

二项逻辑斯谛回归通常用于二分类问题。它可以扩展为多项逻辑斯谛回归模型,用于多分类任务。
假设离散型随机变量 $ Y$ 的取值集合为 ${1, 2, ..., K} $,则多项逻辑斯谛回归模型为:

\[P(Y=k|x) = \frac{\exp(w_k \cdot x)}{1 + \sum_{k=1}^{K-1} \exp(w_k \cdot x)} \tag{15} \]

其中,$x \in \mathbb{R}^{n+1}),( w_k \in \mathbb{R}^{n+1} $。

流程图 阶跃函数和对数几率

三、逻辑回归Python实现

3.1 案例1

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn import metrics
import seaborn as sn

candidates = {'gmat': [780,750,690,710,680,730,690,720,740,690,610,690,710,680,770,610,580,650,540,590,620,600,550,550,570,670,660,580,650,660,640,620,660,660,680,650,670,580,590,690],
              'gpa': [4,3.9,3.3,3.7,3.9,3.7,2.3,3.3,3.3,1.7,2.7,3.7,3.7,3.3,3.3,3,2.7,3.7,2.7,2.3,3.3,2,2.3,2.7,3,3.3,3.7,2.3,3.7,3.3,3,2.7,4,3.3,3.3,2.3,2.7,3.3,1.7,3.7],
              'work_experience': [3,4,3,5,4,6,1,4,5,1,3,5,6,4,3,1,4,6,2,3,2,1,4,1,2,6,4,2,6,5,1,2,4,6,5,1,2,1,4,5],
              'admitted': [1,1,1,1,1,1,0,1,1,0,0,1,1,1,1,0,0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,1]
              }

df = pd.DataFrame(candidates,columns= ['gmat', 'gpa','work_experience','admitted'])
df[:10]

X = df[['gmat', 'gpa','work_experience']]
y = df['admitted']
#  75%的数据用来做训练集,25%的数据用作测试集
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.25,random_state=0)

logistic_regression= LogisticRegression()
#训练
logistic_regression.fit(X_train,y_train)
#预测
y_pred=logistic_regression.predict(X_test)

#绘制热力图
confusion_matrix = pd.crosstab(y_test, y_pred, rownames=['Actual'], colnames=['Predicted'])
sn.heatmap(confusion_matrix, annot=True)

print('精度: ',metrics.accuracy_score(y_test, y_pred))

3.2 案例2

[Dry_Bean_Dataset.csv数据下载地址链接](https://www.kaggle.com/datasets/muratkokludataset/dry-bean-dataset)

import pandas as pd
import matplotlib.pyplot as plt
data=pd.read_csv('Dry_Bean_Dataset.csv')
df=pd.DataFrame(data)
color=[]
for i in df['Class'][0:3349]:
    if i=='SEKER':
        color.append('red')
    else:
        color.append('blue')
plt.scatter(df['MajorAxisLength'][0:3349],df['MinorAxisLength'][0:3349],color=color)
plt.xlabel('MajorAxisLength')
plt.ylabel('MinorAxisLength')
plt.show()
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn import metrics
import seaborn as sn
import matplotlib.pyplot as plt

data = pd.read_csv('Dry_Bean_Dataset.csv')
df = pd.DataFrame(data)

# Drop rows with missing values 数据中有(NAN)
df.dropna(inplace=True)

# Assuming the target column is one of the existing columns, let's choose the last column as the target
target_column = df.columns[-1]  # Assuming the last column is the target column

X = df.drop(columns=[target_column])
y = df[target_column]

# Splitting the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)

# Creating the logistic regression model
logistic_regression = LogisticRegression()

# Training the model
logistic_regression.fit(X_train, y_train)

# Making predictions
y_pred = logistic_regression.predict(X_test)

# Creating a confusion matrix
confusion_matrix = pd.crosstab(y_test, y_pred, rownames=['Actual'], colnames=['Predicted'])

# Plotting the confusion matrix as a heatmap with values rounded to two decimal places
sn.heatmap(confusion_matrix, annot=True, fmt=".2f")
plt.show()

# Calculating and printing the accuracy
print('Accuracy: ', metrics.accuracy_score(y_test, y_pred))

分类展示 混淆矩阵

总结

逻辑斯特回归(Logistic Regression)是一种常用的分类算法,尤其适用于二分类问题。该算法基于线性回归模型,但通过对输出结果应用逻辑斯特函数(Sigmoid函数)来实现输出结果在0到1之间的概率值,进而进行分类决策。以下是逻辑斯特回归的主要特点和总结:

概率建模:逻辑斯特回归通过Sigmoid函数将线性组合的输入转换为0到1之间的概率值。这种概率模型使得逻辑斯特回归可以输出样本属于某个类别的概率,而不仅仅是简单的分类结果。
线性决策边界:逻辑斯特回归基于线性回归模型,因此其决策边界是一个线性函数。这意味着它假设数据是线性可分的,因此在非线性数据集上的表现可能不佳。
参数学习:逻辑斯特回归的参数学习通常使用最大似然估计法。通过最大化样本观测到的标签概率的乘积,可以得到模型参数的最优估计。
易于解释:逻辑斯特回归的结果是概率值,可以直观地解释为样本属于某个类别的可能性。此外,模型的系数(权重)也可以解释为不同特征对分类结果的影响程度。
适用性广泛:逻辑斯特回归适用于许多应用场景,包括医学诊断、金融风控、自然语言处理等。它的简单性和可解释性使得它成为了许多实际问题的首选算法之一。

参考资料

  1. 数据挖掘术语解析
  2. logistic回归算法原理及python实现
  3. 逻辑回归(Logistic Regression)详解
  4. 统计学习方法笔记(八)-逻辑斯谛回归(LogisticRegression)原理及python实现

标签:逻辑,mathbf,Python,回归,tag,斯特,test,frac
From: https://www.cnblogs.com/haohai9309/p/18185645

相关文章

  • 《最新出炉》系列入门篇-Python+Playwright自动化测试-46-鼠标滚轮操作
    1.简介有些网站为了节省流量和资源,提高加载效率,采用的是动态加载(懒加载)的,也就是当拖动页面右侧滚动条后会自动加载网页下面的内容,不拖动就不会加载的或者通过鼠标滚轮操作。2.wheel模拟鼠标滚动wheel模拟鼠标滚动,就是通过调度一个wheel事件。(滚轮事件如果不处理可能会导致滚动,......
  • python pip的各功能工作中使用说明
    根据pip命令行出来的有如下功能。installInstallpackages.downloadDownloadpackages.uninstallUninstallpackages.freezeOutputinstalledpackagesinrequirementsformat.list......
  • Python最全的外汇、黄金、贵金属数据API接口
    1、前言Python最全的股票数据API接口、外汇数据接口、贵金属黄金数据接口在当今数字化的金融世界中,股市API、外汇API接口很重要,通过股票API、外汇API接口接口获取准确且实时的股票数据对于投资者和程序开发者来说至关重要。Python作为一种广泛使用的编程语言,提供了丰富的工具和......
  • AI已来,我与AI一起用Python编写了一个消消乐小游戏
    在数字化与智能化的浪潮中,目前AI(人工智能)几乎在各行各业中发挥了不可忽略的价值,今天让我们也来体验一下AI的威力:我通过命令,一步一步的教AI利用Python编程语言打造了一款富有创意和趣味性的消消乐小游戏……本文Python消消乐游戏源代码:https://gitee.com/obullxl/Pytho......
  • Python随机波动性SV模型:贝叶斯推断马尔可夫链蒙特卡洛MCMC分析英镑/美元汇率时间序列
    全文链接:https://tecdat.cn/?p=33885原文出处:拓端数据部落公众号本文描述了帮助客户使用马尔可夫链蒙特卡洛(MCMC)方法通过贝叶斯方法估计基本的单变量随机波动模型,就像Kim等人(1998年)所做的那样。定义模型以及从条件后验中抽取样本的函数的代码也在Python脚本中提供。  ......
  • Python入门教程(三)
    数据类型str(字符串)Python中最常用的数据类型就是字符串,其用途也很多,我们可以使用单引号‘’或者双引号“”来创建字符串。字符串是不可修改的。关于字符我们从创建、索引、切片、长度、遍历、删除、分割、清除空白、大小写转换、判断以等方面对字符串进行介绍。 Int(数字......
  • 【学习笔记】Python 装饰器
    装饰器是Python中一种非常强大的语法特性,它允许你在不改变函数代码的情况下,动态地增加功能。装饰器本质上是一个函数,它接受一个函数作为参数,并返回一个新的函数。下面是Python装饰器的基本语法:defdecorator_function(original_function):defwrapper_function(*args,*......
  • ETL中如何执行Python脚本
    Python的解读Python 是一种高级、通用的编程语言,由荷兰程序员吉多·范罗苏姆(Guido van Rossum)于1990年代初设计并发布。Python的设计哲学强调代码的可读性和简洁性,它的语法清晰且表达力强,使得开发者能够以更少的代码行数表达复杂的概念。这使得Python成为了编程入门者的理想选......
  • Python进阶之多态和鸭子类型
    【一】多态【1】什么是多态多态指的是一类事物有多种形态【2】示例#动物有多种形态:人、狗、猪等importabc#总的类:动物classAnimal(metaclass=abc.ABCMeta):@abc.abstractmethoddeftalk(self):pass#动物的一类:人classPeople(Animal):......
  • Python进阶之绑定方法和非绑定方法
    【一】绑定方法和非绑定方法介绍【1】绑定方法绑定给谁,谁来调用就自动将它本身当作第一个参数传入(1)绑定到类的方法用classmethod装饰器装饰的方法为类量身定制类.boud_method(),自动将类当作第一个参数传入其实对象也可调用,但仍将类当作第一个参数传入(2)绑定到对象的方......