| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 逻辑回归算法模型 -> 正文阅读 |
|
[人工智能]逻辑回归算法模型 |
前言从这一期开始,我们准备介绍一系列经典机器学习算法模型,主要包括逻辑回归,支持向量机,决策树,因子分析,主成分分析,K-Means聚类,多元线性回归,时间序列,关联规则,朴素贝叶斯,隐式马尔可夫,协同过滤,随机森林,XGBoost,LightGBM等,一般会涵盖算法模型的引入背景,算法模型依赖的数学原理,算法模型的应用范围,算法模型的优缺点及改进建议,工程实践案例等。既适合刚入门机器学习的新手,也适合有一定基础想要进一步掌握算法模型核心要义的读者,其中不免会涵盖许多数学符号,公式以及推导过程,如果你觉得晦涩难懂,可以来"三行科创"微信交流群和大家一起讨论交流。 从对数变换到逻辑回归逻辑回归是最常见的一种用于二分类的算法模型,由于其数学原理简单易懂,作用高效,实际应用非常广泛,虽然带回归二字,实则是分类模型,下面从logit变换开始。 我们在研究某一结果 y y y与一系列因素 ( x 1 , x 2 , ? ? , x n ) (x_1,x_2,\cdots,x_n) (x1?,x2?,?,xn?)之间的关系的时候,最直白的想法是建立因变量和自变量的多元线性关系模型 y = θ 0 + θ 1 x 1 + θ 2 x 2 + ? + θ n x n y=\theta_0+\theta_1x_1+\theta_2x_2+\cdots +\theta_nx_n y=θ0?+θ1?x1?+θ2?x2?+?+θn?xn? 其中
(
θ
0
,
θ
1
,
?
?
,
θ
n
)
(\theta_0,\theta_1,\cdots,\theta_n)
(θ0?,θ1?,?,θn?) 为模型的参数,如果因变量是数值型的话,可以解释成某某因素
x
i
x_i
xi?
(
0
≤
i
≤
n
)
(0\leq i \leq n)
(0≤i≤n)变化了多少导致结果
y
y
y 发生了多少变化,如果因变量
y
y
y 是用来刻画结果是否(0-1)发生?或者更一般的来刻画特定结果发生的概率(0~1)呢?这时候因素
x
i
x_i
xi?
(
0
≤
i
≤
n
)
(0\leq i \leq n)
(0≤i≤n)变化导致结果
y
y
y 的变化恐怕微乎其微,有时候甚至忽略不计。然而现实生活中,我们知道某些关键因素会直接导致某一结果的发生,如亚马逊雨林一只蝴蝶偶尔振动翅膀,就会引起两周后美国德克萨斯州的一场龙卷风。于是,我们需要让不显著的线性关系变得显著,使得模型能够很好解释随着因素的变化,结果也会发生显著的变化,这时候,人们想到了对数(logit)变换,下图是对数函数图像 从对数函数的图像来看,其在 ( 0 , 1 ) (0,1) (0,1)之间的因变量的变化是很迅速的,也就是说自变量的微小变化会导致因变量的巨大变化,这就符合了之前想要的效果。于是,对因变量进行对数变换,右边依然保持线性关系,有下面式子 l o g ( y ) = θ 0 + θ 1 x 1 + θ 2 x 2 + ? + θ n x n log(y)=\theta_0+\theta_1x_1+\theta_2x_2+\cdots +\theta_nx_n log(y)=θ0?+θ1?x1?+θ2?x2?+?+θn?xn? 虽然上式解决了因变量随着自变量变化的敏感性问题,同时也约束了 y y y 的取值范围在 ( 0 , + ∞ ) (0,+\infty) (0,+∞)。我们知道概率是用来描述某件事发生的可能性,一件事情发生与否,更应该是调和对称的,也就是说该事件发生与不发生有对立性,结果可以走向必然发生(发生概率为1),也可以走向必然不发生(发生概率为0),概率的取值范围为 [ 0 , 1 ] [0,1] [0,1],而等式左边 y y y 的取值范围是 ( 0 , + ∞ ) (0,+\infty) (0,+∞),所以需要进一步压缩,又引进了几率。 几率(odd)是指事件发生的概率与不发生的概率之比,假设事件 A 发生的概率为 p p p,不发生的概率为 1 ? p 1-p 1?p,那么事件 A 的几率为 o d d ( A ) = p 1 ? p odd(A)=\frac{p}{1-p} odd(A)=1?pp? 几率恰好反应了某一事件两个对立面,具有很好的对称性,下面我们再来看一下概率和几率的关系 首先,我们看到概率从0.01不断增大到 0.99,几率也从0.01随之不断变大到99,两者具有很好的正相关系,我们再对 p p p 向两端取极限有 lim ? p → 0 + ( p 1 ? p ) = 0 \lim\limits _ {p \to 0^+}(\frac{p}{1-p})=0 p→0+lim?(1?pp?)=0 lim ? p → 1 ? ( p 1 ? p ) = + ∞ \lim\limits _ {p \to 1^-}(\frac{p}{1-p})=+\infty p→1?lim?(1?pp?)=+∞ 于是,几率的取值范围就在 ( 0 , + ∞ ) (0, +\infty) (0,+∞),这就符合我们之前的因变量取值范围的假设。 正因为概率和几率有如此密切对等关系,于是想能不能用几率来代替概率刻画结果发生的可能性大小,这样既能满足结果对影响因素的敏感性,又能满足发生与否的对称性 ,便有了下面式子 l o g ( p 1 ? p ) = θ 0 + θ 1 x 1 + θ 2 x 2 + ? + θ n x n log(\frac{p}{1-p}) =\theta_0+ \theta_1x_1+\theta_2x_2+\cdots +\theta_nx_n log(1?pp?)=θ0?+θ1?x1?+θ2?x2?+?+θn?xn? 现在,我们稍微改一下,让等式左边对数变成自然对数 l n = l o g e ln=log_e ln=loge?,等式右边改成向量乘积形式,便有 l n ( p 1 ? p ) = θ X ln(\frac{p}{1-p})=\theta X ln(1?pp?)=θX 其中 θ = ( θ 0 , θ 1 , ? ? , θ n ) \theta=(\theta_0,\theta_1,\cdots,\theta_n) θ=(θ0?,θ1?,?,θn?), X = ( 1 , x 1 , x 2 , ? ? , x n ) T X=(1,x_1,x_2,\cdots,x_n)^T X=(1,x1?,x2?,?,xn?)T,我们解得 p = e θ X 1 + e θ X p=\frac{e^{\theta X}} {1+ e^{\theta X}} p=1+eθXeθX? 其中
e
e
e 是自然常数,保留5位小数是2.71828。这就是我们常见的逻辑模型表达式,作出其函数图像如下 我们看到逻辑模型的函数图像是一条S型曲线,又名sigmoid曲线,以 ( 0 , 0.5 ) (0,0.5) (0,0.5) 为对称中心,随着自变量 x x x 不断增大,其函数值不断增大接近1,随自变量 x x x 不断减小,其函数值不断降低接近0,函数的取值范围在 ( 0 , 1 ) (0,1) (0,1) 之间,且函数曲线在中心位置变化速度最快,在两端的变化速率最慢。 从上面的操作,我们可以看到逻辑回归模型从最初的线性回归模型基础上对因变量进行 对数变换,使得因变量对自变量显著,同时约束因变量取值范围为0到正无穷大,然后用几率表示概率,最后求出概率关于自变量的表达式,把线性回归的结果压缩在 ( 0 , 1 ) (0,1) (0,1) 范围内,这样最后计算出的结果是一个0到1之间的概率值,表示某事件发生的可能性大小,可以做概率建模,这也是为什么逻辑回归叫逻辑回归,而不叫逻辑分类了。 二项逻辑回归模型既然逻辑回归把输出结果压缩到连续的区间 ( 0 , 1 ) (0,1) (0,1),而不是离散的 0 或者1,然后我们可以取定一个阈值,通常以0.5为阈值,通过对比输出结果与阈值的大小关系而定,如果计算出来的概率大于等于0.5,则将结果归为一类 (1),如果计算出来的概率小于0.5,则将结果归为另一类 (0),用分段函数写出来便是 y = { 1 , p?>?0.5 0 , p?<?0.5 y= \begin{cases} 1,&\text{p > 0.5} \\ 0, & \text{p < 0.5} \end{cases} y={1,0,?p?>?0.5p?<?0.5? 这样逻辑回归就可以用来进行2分类了,在本文中,不特别指出,均指二项逻辑回归,假设数据结构如下
其中 m m m表示样本个数, n n n表示影响因数的个数, y i ( 1 ≤ i ≤ m ) y_i (1\leq i \leq m) yi?(1≤i≤m) 取 0 或者 1。现在我们结合数据,利用条件概率分布模型给出基于概率的二项逻辑回归模型如下 p ( y = 1 ∣ X ; θ ) = e θ X 1 + e θ X p(y=1|X;\theta)=\frac{e^{\theta X}}{1+e^{\theta X}} p(y=1∣X;θ)=1+eθXeθX? p ( y = 0 ∣ X ; θ ) = 1 1 + e θ X p(y=0|X;\theta)=\frac{1}{1+e^{\theta X}} p(y=0∣X;θ)=1+eθX1? 其中, y y y 表示因变量所属的类别, X X X 表示自变量, θ \theta θ 为模型待求的参数,模型解释为在特定的因素( X ; θ X; \theta X;θ)下,模型结果取1的概率和取0的概率。模型有了,接下来就需要进行机器训练,而怎么来给训练一种恰当反馈呢?答案就是损失函数,通过损失函数来评估模型学习的好坏和改进机制。 由前面阈值的取定原则,我们知道相当于我们用一个类别值代替概率值,而类别值是sigmoid 函数的两个最值,概率不可能时时刻刻都取到最值,这势必会造成误差,我们把这种误差称为损失,为了给出损失函数表达式,我们假设模型第 i i i 个样本所求的概率值为 p i p_i pi?,而真实类别值可能是 0 或者 1。 当类别真实值是 1 的情况下,所求的概率值
p
i
p_i
pi? 越小,越接近0,被划为类别 0 的可能性越大,被划为类别 1 的可能性越小,导致的损失越大。反之,所求的概率值
p
i
p_i
pi? 越大,越接近1,被划为类别 1 的可能性越大,被划为类别 0 的可能性越小,导致的损失越小。我们用下面的函数来描述这种变化关系 当类别真实值是0的情况下,所求的概率值 p i p_i pi? 越大,越接近1,其结果的类别判定更偏向于1,导致的损失越大。反之,所求的概率值 p i p_i pi? 越小,越接近0,其结果的类别判断更偏向于 0,导致的损失越小。我们用下面的函数来描述这种变化关系 ? l o g ( 1 ? p i ) -log(1-p_i) ?log(1?pi?) 现在就要把两种情况结合起来,就不需要分真实值是 1 还是 0 两种情况讨论,求出其期望值,做成一个交叉熵(cross entropy)的整体损失函数如下 c o s t i = ? y i l o g ( p i ) ? ( 1 ? y i ) l o g ( 1 ? p i ) cost_i = -y_ilog(p_i)-(1-y_i)log(1-p_i) costi?=?yi?log(pi?)?(1?yi?)log(1?pi?) 其中 y i y_i yi? 表示第 i i i 个样本的真实值(取0或者1), p i p_i pi? 是根据模型计算出来的概率值,当 y i = 1 y_i=1 yi?=1 时, c o s t i = ? l o g ( p i ) cost_i= -log(p_i) costi?=?log(pi?),当 y i = 0 y_i=0 yi?=0时, c o s t i = ? l o g ( 1 ? p i ) cost_i = -log(1-p_i) costi?=?log(1?pi?),这符合前面两种情况。 假设现在有 m m m 个样本,总体的损失函数为 C o s t = ∑ i = 1 m c o s t i = ∑ i = 1 m [ ? y i l o g ( p i ) ? ( 1 ? y i ) l o g ( 1 ? p i ) ] \begin{aligned} Cost &= \sum\limits_{i=1}^m cost_i \\ &=\sum\limits_{i=1}^m[-y_ilog(p_i)-(1-y_i)log(1-p_i)]\\ \end{aligned} Cost?=i=1∑m?costi?=i=1∑m?[?yi?log(pi?)?(1?yi?)log(1?pi?)]? 代入 p i = e θ X 1 + e θ X p_i=\frac{e^{\theta X}}{1+e^{\theta X}} pi?=1+eθXeθX?
C
o
s
t
=
∑
i
=
1
m
[
?
y
i
l
o
g
(
e
θ
X
1
+
e
θ
X
)
?
(
1
?
y
i
)
l
o
g
(
1
?
e
θ
X
1
+
e
θ
X
)
]
(1)
\begin{aligned} Cost &=\sum\limits_{i=1}^m[-y_ilog(\frac{e^{\theta X}}{1+e^{\theta X}})-(1-y_i)log(1-\frac{e^{\theta X}}{1+e^{\theta X}})] \end{aligned} \tag{1}
Cost?=i=1∑m?[?yi?log(1+eθXeθX?)?(1?yi?)log(1?1+eθXeθX?)]?(1) L ( X ∣ θ ) = C o s t = ∑ i = 1 m [ ? y l o g ( e θ X 1 + e θ X ) ? ( 1 ? y ) l o g ( 1 ? e θ X 1 + e θ X ) ] \mathcal{L}(X|\theta)=Cost =\sum\limits_{i=1}^m[-ylog(\frac{e^{\theta X}}{1+e^{\theta X}})-(1-y)log(1-\frac{e^{\theta X}}{1+e^{\theta X}})] L(X∣θ)=Cost=i=1∑m?[?ylog(1+eθXeθX?)?(1?y)log(1?1+eθXeθX?)] 对
L
(
X
∣
θ
)
\mathcal{L} (X|\theta)
L(X∣θ) 求关于
θ
\theta
θ 的偏导,主要是里面对数函数关于
θ
\theta
θ 的偏导数求解 p ( y = 1 ∣ X , θ ^ ) = e θ ^ X 1 + e θ ^ X p(y=1|X,\hat{\theta})=\frac{e^{\hat{\theta} X}}{1+e^{\hat{\theta} X}} p(y=1∣X,θ^)=1+eθ^Xeθ^X? p ( y = 0 ∣ X , θ ^ ) = 1 1 + e θ ^ X p(y=0|X,\hat{\theta})=\frac{1}{1+e^{\hat{\theta} X}} p(y=0∣X,θ^)=1+eθ^X1? 逻辑回归模型的应用既然逻辑回归模型主要用来二分类,那么凡是涉及到二分类的场景都有逻辑回归的用武之地,同时,我们还可以用逻辑回归模型预测某件事情的发生概率,我们常见的逻辑回归模型的应用场景有 逻辑回归模型的评价从逻辑回归模型的数学原理,以及就阈值取定的时候一刀切的做法,我们能够根据逻辑回归的这些特点给出模型优缺点评价 优点:
缺点:
实践案例逻辑回归算法模型的理论学了一通,是时候上一道硬菜,来一个实践案例好下饭,我们利用吴恩达机器学习系列课程里面的一个案例来展开。 本次实践目的是利用下列数据训练出逻辑回归算法模型并给出模型的评估,从ex2data1的数据来看,这份数据是没有表头的,一共100个样本,前2列是特征值表示某位申请者两门课程的评分,第三列是标签列表示该申请者是否被接收,其中1表示被接收,0表示不被接收。
通过数据可视化,我们可以很直白的看到申请者是否被接收大致可以分为2类,分界还是很清晰的,我们可以试着手动画一条直线将其分开 同时,我们可以利用前面的公式(1)把损失函数写出来
损失函数里面的mytheta是我们要求解的参数,这时可以调用scipy.optimize模块中的fmin函数进行求解
假设我们求出来的参数为 θ 0 , θ 1 , θ 2 \theta_0, \theta_1, \theta_2 θ0?,θ1?,θ2?,从而可以把边界函数表示出来 θ 0 + θ 1 ? x 1 + θ 2 ? x 2 = 0 \theta_0+\theta_1*x_1+\theta_2*x_2 = 0 θ0?+θ1??x1?+θ2??x2?=0 学过线性规划的同学知道,这条直线可以将一个平面一分为二,大于0的划分为一边,小于0的划分为另一边。 把边界函数的参数求解出来其实二项逻辑回归算法模型算是初步搭建完成了,因为这时候任给一个样本输入进来就可以判定其到底落于边界函数图形的左半边还是右半边。但一个优秀的算法模型不能仅仅做出来就算完事,还需要对其进行评估和优化,这时候混肴矩阵和ROC曲线就派上用场了。 对比图7和图6,图7是通过数据学到的边界函数,而图6是我们随手画的分界线,两者有几分相似,说明通过逻辑回归算法模型达到我们最初的预期效果,也说明前期的数据可视化为我们提供很多有意义的线索,然而仔细观察图7,有些不被接收的点落入被接收的类里面,有些被接收的点落入不被接收的类里面,出现了串类,我们知道平面里两点确定一条直线,在这个实例中,显然利用直线作为分类边界肯定不能分干净,需要寻求曲线边界我们试着手动画一条曲线把中间那些容易混肴的点也尽可能的画到一边去 考虑到原始特征只有exam1_score和exam2_score2一共2个,为了后续表述方便起见,简记为 x 1 , x 2 x_1,x_2 x1?,x2?,想要制作曲线边界可以考虑利用特征映射对特征进行扩充,具体做法是利用 x 1 , x 2 x_1,x_2 x1?,x2?生成 x 1 、 x 2 、 x 1 x 2 、 x 1 2 、 x 2 2 、 x 1 2 x 2 、 . . . 、 x 1 n 、 x 2 n x_1、x_2、x_1x_2、x_1^2、x_2^2、x_1^2x_2、... 、x_1^n、x_2^n x1?、x2?、x1?x2?、x12?、x22?、x12?x2?、...、x1n?、x2n?,因为更多的特征进行逻辑回归时,得到的边界曲线更具表现力。为了方便,我们设定其中的n=2,此时的决策函数如下,到时候求出来的参数也会有6个 θ 0 + θ 1 ? x 1 + θ 2 ? x 2 + θ 3 x 1 x 2 + θ 4 x 1 2 + θ 5 x 2 2 \theta_0+\theta_1*x_1+\theta_2*x_2+\theta_3x_1x_2+\theta_4x_1^2+\theta_5x_2^2 θ0?+θ1??x1?+θ2??x2?+θ3?x1?x2?+θ4?x12?+θ5?x22? 这时候有读者就会问,你这由原来2个特征一下构造出来5个特征,结果还能可视化吗?高维空间直接可视化肯定是不行的,但是可以将高维的曲面投影到二维平面画出其对应的等值线。
至此,关于逻辑回归算法模型我们除了正则化没讨论外几乎该讨论的都讨论了,其中在算法模型评估环节涉及到混肴矩阵,ROC曲线等概念后面我们会专门出一期博文,敬请期待。 附所有代码
参考文献 1,对数函数 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/8 4:22:58- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |