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 ...
随机推荐
- DataReader转换
public static partial class Extension { private static ConcurrentDictionary<Type, ConcurrentDicti ...
- Storm VS Flink ——性能对比
1.背景 Apache Flink 和 Apache Storm 是当前业界广泛使用的两个分布式实时计算框架.其中 Apache Storm(以下简称"Storm")在美团点评实时 ...
- Unity - 2D中的物理关节
本文概述: 分析Unity中几个2D物理关节组件的基本功能.使用方法.运用场景等 开发环境:Unity2019.3.0a2 / VS2017 项目资源包: 2D Joints Starter 说明: ...
- 《剑指offer》:[62]序列化二叉树
题目:请实现两个函数,分别来序列化和反序列化二叉树. 方案分析:我们知道通过二叉树的中序和任何一个前或者后续遍历都可以反序列化一棵二叉树,但是这样做有一个缺点就是,序列化的数据不能有重复的数据,否则会 ...
- Java多线程之原子操作类
在并发编程中很容易出现并发安全问题,最简单的例子就是多线程更新变量i=1,多个线程执行i++操作,就有可能获取不到正确的值,而这个问题,最常用的方法是通过Synchronized进行控制来达到线程安全 ...
- Https与Http的区别以及Https的解说
http:信息不加密,具有信息被盗的危险 https:信息加密,第三获取原信息 1:https多了一层SSL,而这一层的设计是为了达到如下的 (1) 所有信息都是加密传播,第三方无法窃听. (2) 具 ...
- 2019-2020-1 20199314 <Linux内核原理与分析>第二周作业
1.基础学习内容 1.1 冯诺依曼体系结构 计算机由控制器.运算器.存储器.输入设备.输出设备五部分组成. 1.1.1 冯诺依曼计算机特点 (1)采用存储程序方式,指令和数据不加区别混合存储在同一个存 ...
- Windows导出文件夹中的文件名列表
在需要导出的目录中,shift+右键,打开cmd或者powershell 运行命令:dir -name >list.txt 刷新文件夹,打开list.txt
- Rsync 服务部署与参数详解
Rsync 简介 rsync 是一款开源的.快速的.多功能的.可实现全量及增量的本地或远程数据同步备份的优秀工具.Rsync软件适用于unix/linux/windows等多种操作系统平台. 传统的 ...
- 数据分析--numpy的基本使用
一.numpy概述 NumPy是高性能科学计算和数据分析的基础包.它是pandas等其他各种工具的基础. NumPy的主要功能: ndarray,一个多维数组结构,高效且节省空间 无需循环对整组数据进 ...