逻辑斯谛回归(Logistic回归)最详解

article/2025/10/14 2:47:00

                                                                                Logistic回归学习思路

一.逻辑回归模型的原理与定义(主要思想)

逻辑斯谛回归是经典的分类方法,它属于对数线性模型,原理是根据现有的数据对分类边界线建立回归公式,以此进行分类。(主要思想)

定义:

在线性回归模型的基础上,使用Sigmoid函数,将线性模型的结果压缩到[0,1]之间,使其拥有概率意义,它可以将任意输入映射到[0,1]区间,实现值到概率转换。

  • 属于概率性判别式模型
  • 线性分类算法

在学习逻辑回归模型之前,先来看一下逻辑斯谛分布,因为我们的逻辑斯蒂模型就是根据逻辑斯蒂分布得到的;通过参数估计方法直接估计出参数,从而得到P(Y|X)。

下面给出《统计学习方法》上逻辑斯蒂分布的定义:

二.逻辑回归的推导过程

为了实现根据所有输入预测出类别,为此引入了sigmoid函数p=1/(1+exp(-z)),sigmoid函数刚好也有二分类的功能。

1. 为什么要使用sigmoid函数作为假设?

因为线性回归模型的预测值为一般为大于1的实数,而样本的类标签为(0,1),我们需要将分类任务的真实标记y与线性回归模型的预测值联系起来,也就是找到广义线性模型中的联系函数。如果选择单位阶跃函数的话,它是不连续的不可微。而如果选择sigmoid函数,它是连续的,而且能够将z转化为一个接近0或1的值。

当z=0时,p=0.5
当z>0时,p>0.5  归为1类
当z<0时,p<0.5  归为0类
确定了分类器的函数形式,最佳回归系数是多少,如何确定?
sigmoid函数的输入记为z,将线性模型结果赋值到z,即:
z=w0x0+w1x1+w2x2+w3x3...wnxn
如果采用向量的写法,
上述公式写成z=WT*X,
其中向量X是分类器的输入数据,即为特征值;向量W就是我们要找到的最佳参数,从而使得分类器尽可能精确。
为了找出最佳的回归系数,所以我们可以对两种损失函数进行优化算法
①均方差 (后面会介绍舍弃使用这种作为损失函数)

②对数极大似然估计法

三.数学模型

二项逻辑斯蒂回归模型

知道分布的定义和推导过程之后,就是给出我们的逻辑斯蒂模型了:

引用了李航的《统计学习方法》书中如下

注意(1)最终的结果是通过比较P(Y=1|X)和P(Y=0|X)的大小来确定类别的(类似于朴素贝叶斯);

          (2)b在这里其实可以看做是w0x0,其中x0 = 1;

          (3)其实本质上这个就是一个二项分布,所以遵循二项分布的分布律。

事件的对数几率(log odds)

也就是说,如果我的模型是逻辑回归模型,那么事件{Y=1|X}发生的对数几率就是输入X的线性函数(模型),反之,知道了这个推论,我们是可以反推出逻辑斯蒂模型的形式的

四.目标函数

求目标参数,常用目标函数的选取:

①损失函数:均方差(标准值-预测值)

对数似然函数

首先极大似然函数是一种确定模型参数的方法,它确定参数值的方法是通过找到最大化模型产生真实数据的那一组参数。

最大似然估计就是通过已知结果去反推最大概率导致该结果的参数

极大似然估计是概率论在统计学中的应用,它提供了一种给定观察数据来评估模型参数的方法,即 “模型已定,参数未知”,通过若干次试验,观察其结果,利用实验结果得到某个参数值能够使样本出现的概率为最大,则称为极大似然估计。逻辑回归是一种监督式学习,是有训练标签的,就是有已知结果的,从这个已知结果入手,去推导能获得最大概率的结果参数,只要我们得出了这个参数,那我们的模型就自然可以很准确的预测未知的数据了。(对极大似然函数的详细理解可以参考:https://blog.csdn.net/qq_44543774/article/details/109735754

 

通过极大似然推导得出逻辑回归的目标函数,这里我给出手写的推导:

极大似然函数是概率论在统计学中的应用,它提供了一种给定观察数据来评估模型参数的方法,即 “模型已定,参数未知”,通过若干次试验,观察其结果,利用实验结果得到某个参数值能够使样本出现的概率为最大,则称为极大似然估计。通过求极大似然函数来得到参数w的估计值。

以上就是通过极大似然函数作为目标函数,得出了参数向量w值

综上logistic回归模型的目标函数是极大似然函数

五.算法源码

源码:

from sklearn.linear_model import LogisticRegression
from math import exp
from math import *
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from numpy import *
import numpy as npclass LogisticRegressionClassifier(object):def __init__(self,eta=0.1,loop=30):self.eta=etaself.loop=loopdef sigmoid(self,x):return 1.0/(1+exp(-x))def data_tranforce(self,x_train):data=[]d=[]for x in x_train:   #x因为是数组类型data.append([1.0,*x])   #将每一行数组增加一个1.0数值,*x是去掉[]符号,形成一行数值#c=list(x)  #将一维数组变成列表#c.insert(0, 1.0)  #这种insert()方法必须是列表#print(list(x).insert(0,1.0))#d.append(c)  #类似d=[[1.0,2,3],[1.0,3,4.8]]return datadef fit(self,x_train,y_train):data_mat=self.data_tranforce(x_train)  #处理每个样本的特征值n=shape(data_mat)[1]  #求出data_mat对应参数的个数self.weight=ones((n,1))  #初始化参数w数组cls=self.loopfor k in range(cls):     #循环多少次for i in range(len(x_train)):    #遍历每一个样本h=self.sigmoid(np.dot(data_mat[i],self.weight))err=(y_train[i]-h)#随着每次更新err下面就会更新self.weight的向量self.weight+=self.eta*err*np.transpose([data_mat[i]])   #[data_mat[i]]变成1*4的数组,一维数组转置必须加一个[]#测试训练模型的准确性def test(self,x_test,y_test):numbers=0x_test = self.data_tranforce(x_test)  # 处理每个样本的特征值加一个1.0for x,y in zip(x_test,y_test):result=np.dot(x,self.weight)if(result>0 and y==1)or(result<0 and y==0):numbers+=1return float(numbers)/float(len(x_test))
def main():load=load_iris()x=load.data[:100,:2]y=load.target[:100]y=np.where(y==1,1,0)x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.3)my_l=LogisticRegressionClassifier()my_l.fit(x_train,y_train)print("准确率:",my_l.test(x_test,y_test))if __name__== "__main__":main()

运行结果:

用示例来解释代码的执行过程:

六.优缺点

优点:计算代价不高,易于理解和实现
缺点:容易欠拟合,分类精度不高

七.应用场景

逻辑回归主要是解决二分类问题

使用逻辑回归判断年收入

项目描述

二元分类是机器学习中最基础的问题之一,在这份教学中,你将学会如何实作一个线性二元分类器,来根据人们的个人资料,判断其年收入是否高于 50,000 美元。我们将用 logistic regression 来达成以上目的,你可以尝试了解、分析两者的设计理念及差别。 实现二分类任务:

  • 个人收入是否超过50000元?

数据集介绍

这个资料集是由UCI Machine Learning Repository 的Census-Income (KDD) Data Set 经过一些处理而得来。为了方便训练,我们移除了一些不必要的资讯,并且稍微平衡了正负两种标记的比例。事实上在训练过程中,只有 X_train、Y_train 和 X_test 这三个经过处理的档案会被使用到,train.csv 和 test.csv 这两个原始资料档则可以提供你一些额外的资讯。

  • 已经去除不必要的属性。
  • 已经平衡正标和负标数据之间的比例。

特征格式

  1. train.csv,test_no_label.csv。
  • 基于文本的原始数据
  • 去掉不必要的属性,平衡正负比例。
  1. X_train, Y_train, X_test(测试)
  • train.csv中的离散特征=>在X_train中onehot编码(学历、状态...)
  • train.csv中的连续特征 => 在X_train中保持不变(年龄、资本损失...)。
  • X_train, X_test : 每一行包含一个510-dim的特征,代表一个样本。
  • Y_train: label = 0 表示 "<=50K" 、 label = 1 表示 " >50K " 。

项目要求

  1. 请动手编写 gradient descent 实现 logistic regression

  2. 请动手实现概率生成模型。
  3. 单个代码块运行时长应低于五分钟。
  4. 禁止使用任何开源的代码(例如,你在GitHub上找到的决策树的实现)。

数据准备

项目数据集以及源码:https://e.coding.net/xucancan1/logistic/logistic.git。

源码:

# 下面该你动手啦!
import pandas as pd
import numpy as np
from math import exp
from math import *
df=pd.read_csv("work/data/X_train",encoding="big5")
#print(df)
train_label=pd.read_csv("work/data/Y_train",encoding="big5")
train_label=train_label.iloc[:700,1:]  #处理标签
train_label=np.array(train_label)  #处理标签
print(train_label.shape)
#print(train_label)  #打印标签
df=df.iloc[:700,1:]  #处理特征
print(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
df=np.array(df)
df=df.astype("float")  #训练集特征的处理
#print(df.shape)
#print(df)w=np.ones((511,1))  #初始化w
eta=0.00000008
loop=  100 #循环次数
m=len(train_label)
data=[]
def sigmoid(x):return 1.0/(1+exp(-x))
for k in df:data.append([1.0,*k])  #每一个特征数据样本添加一个1.0
#print(np.shape(data))
data=np.array(data)  #特征数据
#print(data)w=np.mat(w)
data=np.mat(data)for i in range(1000):   #梯度下降,第一种:根据矩阵乘法直接计算wh1=[]for k in range(m):h=sigmoid(np.dot(data[k],w))h1.append(h)h2=np.array(h1)h2=h2.reshape(700,1)  #变成列向量#print(h2.shape)err=train_label-h2w+=eta*data.transpose()*err  #用矩阵梯度下降,下面也是
#print(w.shape)打印参数w
#print(w)
'''
for i in range(100):  #梯度下降,第二种:一个一个的下降,训练模型参数wfor k in range(m):h=sigmoid(np.dot(data[k],w))err=train_label[k]-h#print(err)d=data[k].reshape(511,1)d=np.array(d)w+=eta*err*d  #梯度下降print(w)
'''test=pd.read_csv("work/data/X_test",encoding="big5")  #处理测试集
test=test.iloc[:,1:]  #处理数据集
test=np.array(test)
print(test.shape)
#print(test)
true=1
false=0
for t in test: #在每个测试样本增加一个1.0的特征值,并预测年收入dt=[1.0,*t]h=np.dot(dt,w)if h>0:print(true)  #输出为1,大于5000else:print(false) #输出为0,小于等于5000

逻辑回归也可以做以下的二分类问题:
1.区分是否是垃圾邮件
2.银行判断是否给用户办信用卡

3.从氙气病症预测病马的死亡率

 


http://chatgpt.dhexx.cn/article/QvhhGQIL.shtml

相关文章

常用服务器型号整理

转载于:https://www.cnblogs.com/quzq/p/11285548.html

查看linux cpu 内存 服务器型号 序列号 磁盘 raid信息

安装dmidecode&#xff1a;yum -y install dmidecode 查看cpu的型号: 查看cpu的颗数&#xff1a; dmidecode -t processor |grep "Version" dmidecode -t processor |grep "Socket" 查看内存最大容量&#xff1a; 查看内存插槽数量&#xff1a; 查看内存大…

浪潮官网服务器型号,浪潮服务器有哪些型号,哪位了解?

NF8520系列市场价格&#xff1a;&#xffe5;152000-175000 浪潮英信NF8520采用全新QPI架构高速互联技术的四路服务器&#xff0c;支持最新英特尔至强处理器E7系列&#xff0c;成四个具备IOAT2VMDQ技术的高性能千兆网卡&#xff0c;在全面提升网络IO能力的同时&#xff0c;对虚…

服务器内存怎么看型号,怎么查看服务器内存的型号

怎么查看服务器内存的型号 内容精选 换一换 设备实时状态查询是检测设备在运行过程中的状态信息。用户可任选以下指令之一查看设备实时状态查询命令的可用参数。ascend-dmi -i -hascend-dmi -i --help各参数解释如表1所示。以查看芯片的详细信息为例。ascend-dmi -i -dt若推理服…

阿里云服务器型号大全及机型如何选择(建议收藏)

不同的阿里云实例规格可以提供的计算能力不同&#xff0c;适用于不同的业务场景和使用场景。 1、根据使用场景来选择 下图显示了阿里云ECS的部分通用计算和异构计算实例规格族及其对应的业务场景 简单来看&#xff0c;g6e和g6型能够满足一般的通用需求&#xff0c;对于比如金…

当前主流服务器型号,当前服务器的主流品牌 型号 配置

当前服务器的主流品牌 型号 配置 内容精选 换一换 Atlas 800 推理服务器(型号 3000)安装上架、服务器基础参数配置、安装操作系统等操作请参见《Atlas 800 推理服务器 用户指南(型号 3000)》&#xff0c;安装操作系统完成后&#xff0c;配置业务网口IP地址&#xff0c;请参见配…

系统里能看服务器型号,操作系统如何查看服务器型号

操作系统如何查看服务器型号 内容精选 换一换 硬件要求如表1所示。操作系统要求如表2所示。如果是全新安装操作系统&#xff0c;可选择“Minimal Install”安装方式并勾选Development Tools套件&#xff0c;否则很多软件包需要手动安装。 硬件要求如表1所示。操作系统要求如表2…

服务器主板型号命令,Linux通过命令查询服务器型号、主板、CPU、内存及硬盘信息...

测试环境:Dell服务器 CentOS 6.4 主要使用到的命令: dmidecode、cat、megaCli64、df 查询服务器型号: dmidecode -t 1 查询主板信息: dmidecode -t 2 查询CPU信息:查看CPU型号 cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c 查看CPU物理个数 cat /proc/cpuinfo …

计算机服务器的品牌型号怎么看,戴尔服务器型号怎么看

在计算机流行的高科技时代&#xff0c;在使用计算机产品的时候&#xff0c;往往就会遇到各种各样的硬件问题以及操作系统带来的问题&#xff0c;如果在遇到这些问题之后自己无法处理&#xff0c;那么就需要报修&#xff0c;或者是咨询相关的官方人员&#xff0c;但是各位小伙伴…

华为服务器设备型号查询,查询服务器型号和操作系统

查询服务器型号和操作系统 内容精选 换一换 创建HECS时支持选择云平台提供的“公共镜像”和“市场镜像”。但不能在创建HECS时选择“私有镜像”和“共享镜像”。您可以使用云平台提供的“公共镜像”创建临时的HECS,通过“切换操作系统”功能,使用私有镜像切换临时云服务器的操…

什么命令能查看服务器的型号,查看服务器型号的命令

查看服务器型号的命令 内容精选 换一换 Linux操作系统云服务器的安全组出方向已按照元数据获取的前提条件进行配置,但是无法通过169.254.169.254获取元数据。在配置了静态IP的Linux系统云服务器中执行以下命令:# ip route| grep 169.254如果169.254.169.254路由不存在,并且1…

联想服务器型号更替,联想服务器型号对照表

型号及配置 万全T100 G10 S5800 2G/500S 万全T168 G6 S3430 一路塔式 2G/500S 万全T168 G6 S3430 2G/2*500S热插拔HR1 万全T168 G6 S3430 2G/3*500S热插拔HR5 万全T 万全T260 G3 S5506 500S热插拔HR HR1 2G/2*500S热插拔HR1 万全T260 G3 S5506 2G/146ANR4热插拔 万全T350 G7 S5…

linux查看服务器品牌和型号,linux 查看服务器型号

linux 查看服务器型号 内容精选 换一换 登录弹性云服务器查询磁盘设备信息,发现磁盘的设备名称与控制台上显示的挂载点不一致,不清楚磁盘具体挂载在哪个设备上或磁盘对应的逻辑卷标识。本节操作介绍如何根据控制台上显示的磁盘信息,查询该磁盘在弹性云服务器内对应的设备名称…

查看windows服务器型号,windows 查看服务器型号

windows 查看服务器型号 内容精选 换一换 确认服务器服务是否开启。登录虚拟机内部。执行如下命令,查看系统的端口监听状态,如图1所示。netstat -ntplWindows虚拟机可以在命令行中执行netstat -ano查看系统的端口监听状态,或者查看服务端软件状态。系统的端口监听状态登录虚…

python中re模块的match、search、findall、sub方法使用

正则表达式 正则表达式是对字符串操作的一种逻辑公式&#xff0c;就是用事先定义好的一些特定字符、及这些特定字符的组合&#xff0c;组成一个“规则字符串”&#xff0c;这个“规则字符串”用来表达对字符串的一种过滤逻辑。&#xff08;来自百度&#xff09; 正则表达式语…

Python中正则表达式findall用法

一&#xff1a;前言 在写着自动化测试的脚本时&#xff0c;重新复习了一下正则表达式findall()方法。为了深化印象&#xff0c;输出点东西&#xff0c;就来写个通过正则表达式爬取菜鸟教程标题的小案例。 参考教程&#xff1a;菜鸟教程之Python正则表达式 二&#xff1a;操作…

python爬虫beautifulsoup findall函数详解

测试网站&#xff1a; http://www.pythonscraping.com/pages/warandpeace.html 内容初探 有一些奇怪的红绿分类 网页源码介入&#xff1a; 我们所要做的就是识别<>中的信息&#xff0c;然后提取它后面的内容 基础网络连接代码&#xff1a; html urlopen("h…

正则表达式入门-findall()函数

正则表达式入门-findall()函数 findall()函数 例子 import re a 123abc rere.findall(\d\d\d,a) print(re)导入用于完成正则表达式操作的re库 使用re库中的findall()函数提取文本 \d表示匹配1个数字&#xff0c;那么\d\d\d就表示匹配连续的3个数字 语法为 re.findall(匹…

38 匹配字符串——findall()方法

文章目录 语法案例 语法 findall()方法用于在整个字符串中搜索所有符合正则表达式的字符串&#xff0c;并以列表的形式返回。如果匹配成功&#xff0c;则返回包含匹配结构的列表&#xff0c;否则返回空列表。findall()方法的语法格式如下&#xff1a; re.findall(pattern, st…

Qt QLabel样式表总结

先来个例子 QLabel {font-family: "Microsoft YaHei";font-size: 14px;color: #BDC8E2;background-color: #2E3648; }效果 上面的例子是基本的样式设置&#xff0c;下面我们将探讨 QLable 各种样式设置&#xff1a; 字体样式 font-family: "Microsoft YaHe…