Logistics Regression (对数几率回归)及numpy实现
Logistics Regression
我们知道线性回归模型可以处理回归问题,但是如何处理分类问题?
对于一个二分类问题,或许我们可以认为w*x+b > 0为正类,其他情况为负类。
那么模型不就变成了:y = f(z) ,z = w*x+b,即 y = f(w*x+b)

z大于零就判为正例,小于零就判为反例,z为临界值零则可任意判别 。
不难发现我们提出了一个新的函数 f ,也就是阶跃函数作为一个联系函数,把 z = w*x+b一个线性模型和 y 联系起来了。
于是我们把这种加入了联系函数的新的线性模型称之为广义线性模型。
广义线性模型的一般形式为:

在这里,g 称为联系函数,因此我们刚才说的 f 是联系函数是有点区别的,f 函数应该是 g 的反函数,g 是关于y 的一个函数,也就 g(y) = w*x+b,不难发现,广义线性模型的目的是希望用线性模型w*x+b来逼近y 的衍生物 g(y)。
Why logistic ?
从阶跃函数的图像上看,不难发现它是一个不是一个严格单调的函数(ps:西瓜书上说是因为连续,并未说明要求单调,但是笔者认为是因为不是严格单调所以才不能使用阶跃函数),因此不能作为 g 的反函数。于是我们想引入一个单调可微的函数,sigmoid函数。

所以 :

若将 y 视为样本 x 下作为正例的可能性,则1-y 则是负例的可能性(这里其实我们使用了一个假设,在给定x的情况下y服从Bernoulli分布)。我们称

为几率(odds) ,几率反映了x作为正例的相对可能性,对几率取对数得到对数几率(log odds,也称 logit):

此处我们进行一番推导:

至此,我们发现对数几率 logit 和 y 的关系是sigmoid函数关系,这也是开头为什么我们要用sigmoid函数原因。
接着我们根据这个式子,我们提出假设: 对数几率 logit 和 x 满足线性相关,即 logit = w*x+b。
因此呼应了我们提出的对数几率回归模型,使用sigmoid函数作为联系函数,用线性模型去逼近真实的对数几率。

因此这就是为什么该模型称为对数几率回归模型。
当我们不知道数据分布的情况下,我们得到的模型输出不仅仅是预测的类别,而是近似的概率。
什么时候能够确定我们的输出是概率呢?
需要满足两个条件:
1. y服从Bernoulli分布(只有分类问题0,1值,经常会选择该假设。该假设的意义在于对每一个确定的x,y仍然是一个随机变量,给出的x不同,y服从的Bernoulli分布参数也不同)
2. 对数几率 logit 和 x 满足线性相关。
只有这两个条件满足输出的才是概率,否则输出的是一种近似概率的置信度。
代码实现:
数据集:德国信用数据集:UCI German Credit
训练集和测试集按9:1划分。
笔者没有进行特征归一化的测试结果准确率是64%,归一化后,同一个验证集上准确率达到了73%,数据归一化确实提升了模型的泛化能力。


代码如下:
1 import numpy as np
2 import math
3
4 class LR(object):
5 def __init__(self,nums_feature,lr = 0.001,batch = 32,epoch=1000):
6 self.lr=lr
7 self.nums_class = 2 # y的分类数,这里只有二分类,所以是2
8 self.nums_feature = nums_feature # x 的特征数
9 self.w = np.random.normal(0, 1,nums_feature).reshape(nums_feature,1)
10 self.b = np.zeros(1)
11 self.batch_size = batch
12 self.epoch = epoch
13
14 def sigmoid(self,x):
15 return 1 / (1 + np.exp(-x))
16
17 def delta_sigmoid(self,x): # sigmoid 导数
18 s = self.sigmoid(x)
19 return (1-s)*s
20
21 def calculate_loss(self,xx,yy):
22 # xx shape: nums*f
23 # yy shape: nums*1
24 nums = xx.shape[0]
25 mat = np.matmul(xx, self.w) + self.b.repeat(nums).reshape(nums,1)
26 # mat shape : nums*1
27 loss = (np.log(1+np.exp(mat))-mat*yy).sum()
28 return loss/nums # float
29
30 def get_grad(self,xx,yy):
31 nums = xx.shape[0]
32 mat = np.matmul(xx, self.w)+self.b.repeat(nums).reshape(nums,1)
33 active_mat = self.sigmoid(mat)
34 delta = np.repeat(yy - active_mat,repeats= self.nums_feature).reshape(nums,self.nums_feature)
35 w_grad = delta*xx
36 w_grad = -1*np.sum(w_grad,axis=0)/nums
37 b_grad = -1*(yy - active_mat).sum()/nums
38 return w_grad.reshape(self.nums_feature,1) , b_grad
39
40 def fit(self,X,Y):
41 # 输入X,Y为numpy的格式
42 samples_num = X.shape[0]
43 SX = X
44 SY = Y
45 Y = Y.reshape(samples_num,1)
46 for epoch in range(1,self.epoch+1):
47 shuffle_ix = np.random.permutation(np.arange(samples_num))
48 X = X[shuffle_ix] # nums*f
49 Y = Y[shuffle_ix] # nums*1
50 loss = 0.0
51 for idx in range(0,samples_num,self.batch_size):
52 xx = X[idx:idx+self.batch_size]
53 yy = Y[idx:idx+self.batch_size]
54 loss = loss + self.calculate_loss(xx,yy)
55 w_grad,b_grad = self.get_grad(xx,yy) # 计算梯度
56 self.w = self.w - self.lr*w_grad # w 权值更新
57 self.b = self.b - self.lr*b_grad # b 权值更新
58 acc= self.predict(SX,SY)
59 print('epoch: ',epoch,' loss ',loss/(samples_num//self.batch_size),' 训练集 acc: ',acc)
60 pass
61
62 def predict(self,X,Y):
63 nums = X.shape[0]
64 prey = self.sigmoid(np.matmul(X, self.w) + self.b.repeat(nums).reshape(nums,1)).squeeze()
65 pre_label = np.where(prey > 0.5,1,0)
66 acc = np.where(pre_label==Y,1,0).sum()
67 return acc/nums
68
69 np.random.seed(123)
70 data = np.loadtxt("german.data-numeric")
71 print(data)
72 # 数据归一化
73 # n, l = data.shape
74 # for j in range(l-1):
75 # meanVal = np.mean(data[:, j])
76 # stdVal = np.std(data[:, j])
77 # data[:, j] = (data[:, j]-meanVal) / stdVal
78
79 shuffle_ix = np.random.permutation(np.arange(data.shape[0])) # 打乱数据集
80 data = data[shuffle_ix]
81 X = data[:900,:-1]
82 Y = data[:900,-1]-1 # Y label = 1 or 2 , Y = Y-1 get label = 0 or 1
83 print(data.shape)
84 print(X.shape)
85 print(Y.shape)
86 LR = LR(24)
87 LR.fit(X,Y)
88 X =data[900:,:-1]
89 Y =data[900:,-1] -1
90 print('验证集ACC:',LR.predict(X,Y))
参考资料:
1、周志华——《机器学习》
2、逻辑回归输出的值是真实的概率吗?——https://www.jianshu.com/p/a8d6b40da0cf
3、李航——《统计学习方法》
4、实战-logistic 回归二元分类——https://zhuanlan.zhihu.com/p/99473017
Logistics Regression (对数几率回归)及numpy实现的更多相关文章
- 对数几率回归法(梯度下降法,随机梯度下降与牛顿法)与线性判别法(LDA)
本文主要使用了对数几率回归法与线性判别法(LDA)对数据集(西瓜3.0)进行分类.其中在对数几率回归法中,求解最优权重W时,分别使用梯度下降法,随机梯度下降与牛顿法. 代码如下: #!/usr/bin ...
- 对数几率回归(逻辑回归)原理与Python实现
目录 一.对数几率和对数几率回归 二.Sigmoid函数 三.极大似然法 四.梯度下降法 四.Python实现 一.对数几率和对数几率回归 在对数几率回归中,我们将样本的模型输出\(y^*\)定义 ...
- 机器学习总结-LR(对数几率回归)
LR(对数几率回归) 函数为\(y=f(x)=\frac{1}{1+e^{-(w^{T}x+b)}}\). 由于输出的是概率值\(p(y=1|x)=\frac{e^{w^{T}x+b}}{1+e^{w ...
- 学习笔记TF009:对数几率回归
logistic函数,也称sigmoid函数,概率分布函数.给定特定输入,计算输出"success"的概率,对回题回答"Yes"的概率.接受单个输入.多维数据或 ...
- 机器学习5- 对数几率回归+Python实现
目录 1. 对数几率回归 1.1 求解 ω 和 b 2. 对数几率回归进行垃圾邮件分类 2.1 垃圾邮件分类 2.2 模型评估 混淆举证 精度 交叉验证精度 准确率召回率 F1 度量 ROC AUC ...
- Popular generalized linear models|GLMM| Zero-truncated Models|Zero-Inflated Models|matched case–control studies|多重logistics回归|ordered logistics regression
============================================================== Popular generalized linear models 将不同 ...
- 1.1、Logistics Regression模型
1.线性可分VS线性不可分 对于一个分类问题,通常可以分为线性可分与线性不可分两种 .如果一个分类问题可以使用线性判别函数正确的分类,则称该问题为线性可分.如图所示为线性可分,否则为线性不可分: 下图 ...
- ogistic regression (逻辑回归) 概述
:http://hi.baidu.com/hehehehello/blog/item/0b59cd803bf15ece9023d96e.html#send http://en.wikipedia.or ...
- 【转】Logistic regression (逻辑回归) 概述
Logistic regression (逻辑回归)是当前业界比较常用的机器学习方法,用于估计某种事物的可能性.比如某用户购买某商品的可能性,某病人患有某种疾病的可能性,以及某广告被用户点击的可能性等 ...
- 转:Logistic regression (逻辑回归) 概述
Logistic regression (逻辑回归)是当前业界比较常用的机器学习方法,用于估计某种事物的可能性.比如某用户购买某商品的可能性,某病人患有某种疾病的可能性,以及某广告被用户点击的可能性等 ...
随机推荐
- 小白python和pycharm安装大佬勿扰
编程语言发展和Python安装 计算机语言的发展 机器语言 1946年2月14日,世界上第一台计算机ENIAC诞生,使用的是最原始的穿孔卡片.这种卡片上使用的语言是只有专家才能理解的语言,与人类语言差 ...
- C++算法之旅、05 基础篇 | 第二章 数据结构
常用代码模板2--数据结构 - AcWing 笔试用数组模拟而不是结构体 使用结构体指针,new Node() 非常慢,创建10万个节点就超时了,做笔试题不会用这种方式(优化是提前初始化好数组,但这样 ...
- EXE一机一码加密大师1.3.0更新
EXE一机一码打包加密大师可以打包加密保护EXE文件,同时给EXE文件添加上一机一码认证,或者静态密码,不同的电脑打开加密后的文件需要输入不同的激活码才能正常使用,保护文件安全,方便向用户收费. 1. ...
- Vue 核心技术
1.1 Vue简介 1.1.1 官网 英文官网 中文官网 1.1.2 介绍与描述 动态构建用户界面的 渐进式 JavaScript 框架 作者:尤雨溪 1.1.3 Vue的特点 遵循 MVVM 模式 ...
- 关于wake on lan远程唤醒主机的问题,长时间关机无法远程唤醒
英特尔在年初发布了几款低功耗的CPU,国内厂商在迷你主机领域纷纷搭载新款CPU,卖的火爆.之前关注过迷你主机这块,于是,我也入手一个迷你主机玩玩,买的是板载N100的迷你主机.使用过程中会涉及到如何远 ...
- Navicat连接MySQL,出现2059 - authentication plugin 'caching_sha2_password'的解决方法
cmd(管理员)登录mysql执行如下 ALTER USER 'YOURUSERNAME'@'localhost' IDENTIFIED WITH mysql_native_password BY ' ...
- Python基础——深浅拷贝、python内存泄露、你并不了解的format、decimal
文章目录 深浅拷贝 先看赋值运算 浅拷贝copy 深拷贝deepcopy 相关面试题 python内存泄露 起因 方案 编写安全的代码 弱引用 你并不了解的format.decimal format格 ...
- it 作形式主语:It's no good doing sth.
It's no good doing sth. 这个 句型其实是一个省 略介词 in 的句型,完整形式是 It's no good in doing sth. 其中, good 是形容词,和介词 in ...
- C#/.NET/.NET Core优秀项目和框架精选(2023年10月更新,项目分类已整理完成欢迎大家踊跃提交PR一起完善让优秀的项目和框架不被埋没)
前言 帮助开发者发现功能强大.性能优越.创新前沿.简单易用的C#/.NET/.NET Core优秀项目和框架,无论你是寻找灵感.学习新技术.改进代码质量,还是想拓展自己的技术视野,都能为你提供有价值的 ...
- gson如何序列化子类
需求 目前有一个需求,不同对象有一些公共属性,分别也有一些不同的属性.对方传过来的json字符串中,把这些对象组成了一个数组返回过来的.这样该如何反序列化呢? 举例 定义Person类.Student ...