02-12 Logistic(逻辑)回归
更新、更全的《机器学习》的更新网站,更有python、go、数据结构与算法、爬虫、人工智能教学等着你:https://www.cnblogs.com/nickchen121/p/11686958.html
逻辑回归
虽然逻辑回归的名字里有“回归”两个字,但是它并不是一个回归算法,事实上它是一个分类算法。
一、逻辑回归学习目标
- 二元逻辑回归的目标函数
- 最小化二元逻辑回归目标函数
- 二元逻辑回归的正则化
- 多元逻辑回归
- 逻辑回归的流程
- 逻辑回归的优缺点
二、逻辑回归引入
曾经在感知机引入时我们讲过,操场上男生和女生由于受传统思想的影响,男生和女生分开站着,并且因为男生和女生散乱在操场上呈线性可分的状态,因此我们总可以通过感知机算法找到一条直线把男生和女生分开,并且最终可以得到感知机模型为
\]
如果你细心点会发现,由于感知模型使用的是sign函数,如果当计算一个样本点\(w^Tx=0.001\)的时候,\(sign(w^Tx)=1\),即该函数会把该样本归为\(1\),但是为什么他不能是\(0\)类呢?并且由于sign函数在\(x=0\)处有一个阶跃,即函数不连续,该函数在数学上也是不方便处理的。
由此逻辑函数使用sigmoid函数对\(w^Tx\)做处理,并且把sigmoid函数得到的值\(\hat{y}\)当成概率进行下一步处理,这也正是逻辑回归对感知机的改进。
上述整个过程其实就是逻辑回归一步一步被假想出来的的一个过程,接下来将从理论层面抽象的讲解逻辑回归。
# 感知机引入图例
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
%matplotlib inline
font = FontProperties(fname='/Library/Fonts/Heiti.ttc')
np.random.seed(1)
x1 = np.random.random(20)+1.5
y1 = np.random.random(20)+0.5
x2 = np.random.random(20)+3
y2 = np.random.random(20)+0.5
# 一行二列第一个
plt.subplot(121)
plt.scatter(x1, y1, s=50, color='b', label='男孩(+1)')
plt.scatter(x2, y2, s=50, color='r', label='女孩(-1)')
plt.vlines(2.8, 0, 2, colors="r", linestyles="-", label='$wx+b=0$')
plt.title('线性可分', fontproperties=font, fontsize=20)
plt.xlabel('x')
plt.legend(prop=font)
# 一行二列第二个
plt.subplot(122)
plt.scatter(x1, y1, s=50, color='b', label='男孩(+1)')
plt.scatter(x2, y2, s=50, color='r', label='女孩(-1)')
plt.scatter(3.5, 1, s=50, color='b')
plt.title('线性不可分', fontproperties=font, fontsize=20)
plt.xlabel('x')
plt.legend(prop=font)
plt.show()
%E5%9B%9E%E5%BD%92_6_0.png?x-oss-process=style/watermark)
三、逻辑回归详解
3.1 线性回归与逻辑回归
线性回归的假设函数为
\]
此时的\(\hat{y}\)是连续值,所以它是一个回归模型,如果\(\hat{y}\)是离散值呢?
可能你已经想到了,对假设函数得到的连续值再做一次转换,即\(g(\hat{y})\),并且令\(g(\hat{y})\)函数值在\(\hat{y}\)属于某个区间时为\(c_1\)类;\(\hat{y}\)属于另一个区间时为\(c_2\)类,这样就能得到一个二元分类模型。
3.2 二元逻辑回归的假设函数
上一节讲到对线性回归的结果通过函数\(g\)做一次转换即可得逻辑回归。在逻辑回归当中函数\(g\)通常使用Sigmoid函数替代,即函数\(g\)为
\]
3.2.1 让步比
让步比可以理解成有利于某一特定事件的概率,可以定义为
\]
在已知二分类问题的情况下每个分类的概率分别为\(\hat{y_i}\)和\(1-\hat{y_i}\),可以定义logit函数,即让步比的对数形式(log-odds)为
\log{it}(\hat{y_i}) & = \log{\frac{p(y=1|x,\omega)}{p(y=0|x,\omega)}} \\
& = \log{\frac{\hat{y_i}}{1-\hat{y_i}}} \\
& = \log{\frac{{\frac{1}{1+e^{-\omega^Tx}}}}{{\frac{-\omega^Tx}{1+e^{-\omega^Tx}}}}} \\
& = \omega^Tx
\end{align}
\]
其中\(\log{it}(p)\)函数等于事件发生的概率除以不发生的概率取对数,即表示特征值和对数概率之间的线性关系。
然而特征值和对数概率之间的线性关系并不重要,重要的是预测值与它发生的概率的关系,即让步比的逆形式,也就是上述说到的Sigmoid函数。
e^{w^Tx} = {\frac{p}{1-p}} \\
p = {\frac{1}{1+e^{-w^Tx}}} \\
\]
3.2.2 Sigmoid函数图像
# Sigmoid函数图像图例
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
def sigmoid(z):
return 1 / (1 + np.exp(-z))
ax = plt.subplot(111)
# 描绘十字线
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data', 0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data', 0))
z = np.linspace(-10, 10, 256)
hat_y = sigmoid(z)
plt.plot(z, hat_y, c='r', label='Sigmoid')
# 描绘y=0.5和y=1.0两条直线
plt.yticks([0.0, 0.5, 1.0])
ax = plt.gca()
ax.yaxis.grid(True)
plt.xlabel('z')
plt.ylabel('$\hat{y}$')
plt.legend()
plt.show()
%E5%9B%9E%E5%BD%92_15_0.png?x-oss-process=style/watermark)
上图为Sigmoid函数图像,可以看出当\(z\)趋于正无穷时,\(g(z)\)趋于1;当\(z\)趋于负无穷时,\(g(z)\)趋于0,这个属性非常适合上述所说的分类模型。
因此可以把线性函数的假设函数看成是Sigmoid函数的自变量,即逻辑回归的假设函数为
\]
虽然改变了逻辑回归的假设函数,但是Sigmoid函数的输出值是\((0,1)\)范围内的连续值,并不是二元分类模型想要的二元离散值,因此需要对逻辑回归的假设函数做进一步处理,即
\hat{y}>0.5即\omega^Tx>0, \quad y=1 \\
\hat{y}<0.5即\omega^Tx<0, \quad y=0 \\
\end{cases}
\]
如果\(\hat{y}=0.5即\omega^Tx=0\),不在逻辑回归模型的讨论范围内,一般而言视具体情况而定。
3.3 二元逻辑回归的目标函数
得到了逻辑回归的假设函数,则需要通过最小化目标函数即最小化误差找到最合适的参数\(\omega\)。
由于线性回归是预测连续值的模型,因此可以使用均方误差代价函数。但是逻辑回归是预测离散值的模型,因此可以使用极大似然估计推导出逻辑回归的目标函数。
上一节假设逻辑回归的输出为类别\(0\)或类别\(1\),用概率表达方式为
& p(y=1|x,\omega)=\pi(x) \\
& p(y=0|x,\omega)=1-\pi(x)
\end{align}
\]
由于\(y\)只可能是\(0\)或\(1\),则可以把上述两个公式联立可得\(y\)的概率分布函数表达式
\]
通过\(y\)的概率分布函数表达式即可得似然函数为
\]
其中\(m\)为样本的个数。
通过似然函数得到对数似然函数即目标函数(注:该目标函数与交叉熵损失函数的形式一致,二元逻辑回归可以理解为交叉熵损失函数两个类变量的特殊形式,交叉熵详见《熵和信息增益》)为
J(\omega) & = \log{L(\omega)} \\
& = \sum_{i=1}^m [y_i\log\pi(x_i)+(1-y_i)\log(1-\pi(x_i))]
\end{align}
\]
对\(J(\omega)\)求极大值,即可得到\(\omega\)的估计值。
一般采用梯度上升法或拟牛顿法求解\(\omega\)的估计值。
3.3.1 不同样本分类的代价
逻辑回归的目标函数为
\]
对于二分类问题,可以求出\(y=1\)和\(y=0\)的代价函数
\begin{cases}
-\log\pi(x) \quad if y=1 \\
-\log(1-\pi(x)) \quad if y=0 \\
\end{cases}
\]
# 不同样本实例分类的代价图例
def cost_1(z):
return -np.log(sigmoid(z))
def cost_0(z):
return -np.log(1-sigmoid(z))
z = np.linspace(-10, 10, 256)
pi_x = sigmoid(z)
c1 = [cost_1(i) for i in z]
c0 = [cost_0(i) for i in z]
plt.plot(pi_x, c1, c='r', linestyle='--',
label='$J(\omega), \quad if \quad y=1$')
plt.plot(pi_x, c0, c='g', label='$J(\omega), \quad if \quad y=0$')
plt.xlabel('$\pi(x)$')
plt.ylabel('$J(\omega)$')
plt.legend()
plt.show()
%E5%9B%9E%E5%BD%92_21_0.png?x-oss-process=style/watermark)
上图可以看出如果正确地预测样本属于第\(1\)类,代价会接近0(虚线);如果正确的预测\(y=0\)(实线),代价也会接近0。如果预测错误,代价则会趋近于无穷大,即用越来越大的代价惩罚错误的预测。
3.4 二元逻辑回归目标函数最大化
3.4.1 梯度上升法
二元逻辑回归的目标函数为
\]
得到二元逻辑回归的目标函数,我们需要最大化似然函数,即最大化二元逻辑回归的目标函数。
目标函数对\(\omega\)的偏导为
{\frac{\partial{J(\omega)}}{\partial{\omega_j}}} & = \sum_{i=1}^m({\frac{y_i}{\pi(x_i)}}-{\frac{1-y_i}{1-\pi(x_i)}}){\frac{\partial{\pi(x_i)}}{\partial{\omega_j}}} \\
& = \sum_{i=1}^m({\frac{y_i}{g(\omega^Tx_i)}}-{\frac{1-y_i}{1-g(\omega^Tx_i)}}){\frac{\partial{g(\omega^Tx_i)}}{\partial{\omega_j}}} \\
& = \sum_{i=1}^m({\frac{y_i}{g(\omega^Tx_i)}}-{\frac{1-y_i}{1-g(\omega^Tx_i)}})g(\omega^Tx_i)(1-g(\omega^Tx_i)){\frac{\partial{\omega^Tx_i}}{\partial{\omega_j}}} \\
& = \sum_{i=1}^m (y_i(1-g(\omega^Tx_i))-(1-y_i)g(\omega^Tx_i)){x_i}_j \\
& = \sum_{i=1}^m (y_i - g(\omega^Tx_i)){x_i}_j
\end{align}
\]
其中\(i\)为第\(i\)个样本,\(j\)为第\(j\)个特征。
逻辑回归参数的学习规则为
\]
3.4.2 线性回归和逻辑回归的参数更新
线性回归的参数学习公式为
\]
逻辑回归的参数学习公式为
\]
从上述两个参数学习公式可以看出线性回归和逻辑回归的参数更新方式有着相同的公式,但是由于线性回归是最小化目标函数,而逻辑回归是最大化似然函数即最大化目标函数,因此线性回归是梯度下降法、逻辑回归是梯度上升法,曾经也讲过其实梯度下降法和梯度上升法可以转换。
3.4.3 拟牛顿法
收敛速度更快,但是如果特征维度较大计算时间漫长。
3.5 二元逻辑回归模型
假设求得逻辑回归参数为为\(\omega^T\),则二元逻辑回归模型为
& p(y=1|x) = {\frac{e^{-\omega^T{x}}}{1+e^{-\omega^T{x}}}} \\
& p(y=0|x) = {\frac{1}{1+e^{-\omega^T{x}}}}
\end{align}
\]
3.6 二元逻辑回归的正则化
3.6.1 L1正则化
二元逻辑回归的L1正则化与普通线性回归的L1正则化类似,增加了L1范数作为惩罚,即
\]
二元逻辑回归L1正则化目标函数常用的优化方法有坐标轴下降和最小角回归。
3.6.2 L2正则化
二元逻辑回归的L2正则化与普通线性回归的L2正则化类似,增加了L2范数作为惩罚,即
\]
3.7 多元逻辑回归
上面介绍的逻辑回归都是二元分类模型,用于二分类问题,可以使用以下三种方法将其推广为多元逻辑回归。OvR和MvM主要是对数据做处理,这里不介绍其具体过程。而Softmax回归则是优化模型,因此主要讲解Softmax回归。
3.7.1 OvR
假设一个数据集\(D\)有\(c_1,c_2,\ldots,c_k\)共\(k\)个类别,则可以把\(c_1\)看成一个类别,把\(c_2,c_3,\ldots,c_k\)看成另外一个类别,即把\(D\)分为两个子集,把多分类问题则变成了关于\(c_1\)和\(c_2,c_3,\ldots,c_k\)的二分类问题,然后对含有多个类别的子集再次使用OvR方法,直至无法分类为止。通常这种方法称为OvR(One-vs-Rest)。
3.7.2 MvM
假设一个数据集\(D\)有\(c_1,c_2,\ldots,c_k\)共\(k\)个类别,则可以先把\(c_1,c_2,\ldots,c_i, \quad i<k\)看成一个类别,把\(c_i,c_{i+1},\ldots,c_k\)看成另外一个类别,即把\(D\)分为两个子集,多分类问题则变成了关于\(c_1,c_2,\ldots,c_i\)和\(c_i,c_{i+1},\ldots,c_k\)的二分类问题,然后对两个子集再次使用MvM方法,直至无法分类为止。通常这种方法称为MvM(Many-vs-Many)。
如果每次只选择两个个类别进行分类的话,则该方法称为OvO(One-vs-One),一般情况下首先考虑使用OvO。
3.7.3 Softmax回归
详见《Softmax回归》
四、逻辑回归流程
4.1 输入
有\(m\)个实例\(n\)维特征的数据集
\]
其中\(x_i\)是实例的特征向量即\(({x_i}^{(1)},{x_i}^{(2)},\cdots,{x_i}^{(n)})\)。
4.2 输出
\(\omega\)和二元逻辑回归模型。
4.3 流程
- 选取初值\(\omega=0\)
- 训练集中选取数据\((x_i,y_i)\),对\(\omega\)使用梯度上升更新
\]
- 重复步骤2,直至\(\omega\)收敛停止更新
- 得到最小化的目标函数\(J(\omega)\),同时可以得到最优的\(\omega^*\),二元逻辑回归模型为
& p(y=1|x) = {\frac{e^{-\omega^T{x}}}{1+e^{-\omega^T{x}}}} \\
& p(y=0|x) = {\frac{1}{1+e^{-\omega^T{x}}}}
\end{align}
\]
五、逻辑回归优缺点
5.1 优点
- 由于计算量只和特征的数目有关,训练速度相较其他的分类器例如支持向量机快
- 形式简单,模型的可解释性非常好。从特征的权重可以看到不同的特征对最后结果的影响,某个特征的权重值比较高,那么这个特征最后对结果的影响会比较大
- 可以手动调整阈值(并不一定要0.5),输出结果可以手动调节控制,灵活
5.2 缺点
- 因为类似线性回归很容易欠拟合,分类精度不高
- 假设数据分类严重不平衡,例如1:10000,则分类时会有倾向问题
- 逻辑回归本身无法筛选特征,通常通过GBDT筛选特征后再使用逻辑回归
六、小结
逻辑回归引入时说到逻辑回归一定程度上也是基于感知机演化而来,在替换sigmoid函数的同时,将sigmoid函数得到的值转换为概率的形式,进而可以最大化似然函数得到最优\(w^*\),这也是逻辑回归的巧妙之处,但是两者还是换汤不换药,都是基于特征的线性模型分类。
由于感知机、线性回归和逻辑回归都和线性模型有一定的关系,因此放在一起讲,下面将会将一个单独的算法,它从理论上而言是最简单易懂的一个算法,即k近邻算法。
02-12 Logistic(逻辑)回归的更多相关文章
- logistic逻辑回归公式推导及R语言实现
Logistic逻辑回归 Logistic逻辑回归模型 线性回归模型简单,对于一些线性可分的场景还是简单易用的.Logistic逻辑回归也可以看成线性回归的变种,虽然名字带回归二字但实际上他主要用来二 ...
- SAS LOGISTIC 逻辑回归中加(EVENT='1')和不加(EVENT='1')区别
区别在于:最大似然估计分析中估计是刚好正负对调加上EVENT:%LET DVVAR = Y;%LET LOGIT_IN = S.T3;%LET LOGIT_MODEL = S.Model_Params ...
- [笔记]机器学习(Machine Learning) - 02.逻辑回归(Logistic Regression)
逻辑回归算法是分类算法,虽然这个算法的名字中出现了"回归",但逻辑回归算法实际上是一种分类算法,我们将它作为分类算法使用.. 分类问题:对于每个样本,判断它属于N个类中的那个类或哪 ...
- Python实践之(七)逻辑回归(Logistic Regression)
机器学习算法与Python实践之(七)逻辑回归(Logistic Regression) zouxy09@qq.com http://blog.csdn.net/zouxy09 机器学习算法与Pyth ...
- Logistic回归(逻辑回归)和softmax回归
一.Logistic回归 Logistic回归(Logistic Regression,简称LR)是一种常用的处理二类分类问题的模型. 在二类分类问题中,把因变量y可能属于的两个类分别称为负类和正类, ...
- 【机器学习】逻辑回归(Logistic Regression)
注:最近开始学习<人工智能>选修课,老师提纲挈领的介绍了一番,听完课只了解了个大概,剩下的细节只能自己继续摸索. 从本质上讲:机器学习就是一个模型对外界的刺激(训练样本)做出反应,趋利避害 ...
- 机器学习算法与Python实践之(七)逻辑回归(Logistic Regression)
http://blog.csdn.net/zouxy09/article/details/20319673 机器学习算法与Python实践之(七)逻辑回归(Logistic Regression) z ...
- 机器学习方法(五):逻辑回归Logistic Regression,Softmax Regression
欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. 技术交流QQ群:433250724,欢迎对算法.技术.应用感兴趣的同学加入. 前面介绍过线性回归的基本知识, ...
- 通俗地说逻辑回归【Logistic regression】算法(二)sklearn逻辑回归实战
前情提要: 通俗地说逻辑回归[Logistic regression]算法(一) 逻辑回归模型原理介绍 上一篇主要介绍了逻辑回归中,相对理论化的知识,这次主要是对上篇做一点点补充,以及介绍sklear ...
随机推荐
- [系列] go-gin-api 路由中间件 - 捕获异常(四)
概述 首先同步下项目概况: 上篇文章分享了,路由中间件 - 日志记录,这篇文章咱们分享:路由中间件 - 捕获异常.当系统发生异常时,提示 "系统异常,请联系管理员!",同时并发送 ...
- 学习 Nginx+IIS 分布式测试
首先,从Nginx官网(http://nginx.org/en/download.html)下载了一个Window版本,解压后如图: 修改conf文件夹里面的配置文件nginx.conf,默认的808 ...
- Python默认参数
在python函数中, 可以使用如下方式声明并初始化参数 def to_smash(total_candies, n_friends=3): """Return the ...
- 实验吧CTF练习题---WEB---因缺思汀的绕过解析
实验吧web之因缺思汀的绕过 地址:http://www.shiyanbar.com/ctf/1940 flag值: 解题步骤: 1.点开题目,观察题意 2.通过观察题目要求,判断此道题还有代码审 ...
- 彻底解决android拍照后无法显示的问题
这是对上篇"android 图片拍照,相册选图,剪切并显示"的文章之后的 改进 上一篇文章虽然能解决图片的拍照剪切以及显示,但是发现他有一个缺点, 如果该程序单独运行,貌似没有任何 ...
- Golang error 的突围
目录 error 的困局 尝试破局 Errors are just values handle not just check errors Only handle errors once 小结 胎死腹 ...
- AirFlow简介
1, 简介 Airflow是一个可编程,调度和监控的工作流平台,基于有向无环图(DAG),airflow可以定义一组有依赖的任务,按照依赖依次执行.airflow提供了丰富的命令行工具用于系统管控 ...
- Metasploit工具----漏洞利用模块
漏洞利用是指由渗透测试者利用一个系统.应用或者服务中的安全漏洞进行的攻击行为.流行的渗透攻击技术包括缓冲区溢出.Web应用程序攻击,以及利用配置错误等,其中包含攻击者或测试人员针对系统中的漏洞而设计的 ...
- Linux 笔记 - 第十章 Shell 基础知识
博客地址:http://www.moonxy.com 一.前言 Shell 是系统的用户界面,提供了用户与内核进行交互操作的一种接口,它接收用户输入的命令并把它送入内核去执行.实际上 Shell 是一 ...
- 外部服务器使用jedis操作redis数据库
使用maven获取jedis的包,我本来想去找jedis的jar包的,但是没找到. (maven) <dependency> <groupId>redis.client ...