逻辑回归算法
逻辑回归算法的概念不咋叙述
逻辑回归算法看上去是解决回归问题的算法,但是其实是解决的分类问题,那么回归算法是如何解决分类问题呢?逻辑回归的原理是将样本的特征和样本发生的概率联系起来,即预测这个样本的发生概率是多少,而这个概率是一个数,因此可称这个为回归问题
对于机器算法来说,其本质就是求解一个函数,将样本代入,经过函数计算以后可以得到一个预测的值,在线性回归和多项式回归中,预测的值和问题具有很强的关联性,但是在逻辑回归中,预测的值其本质就是概率值,也就是说,将样本代入函数计算以后,可以得到一个概率值,之后根据这个概率值进行分类,如果有一半的概率发生的话,就等于1,反之等于0(1和0的意义看问题)
从上面的叙述中可以发现,逻辑回归算法既可以看做是一个回归算法,又可以看作是一个分类算法,如果没有最后的分类的话,其就是一个回归算法,算出来的是根据样本特征来拟合一个事件发生的概率,不过通常拿来用于作为分类算法,注意的是,其只能解决二分类的问题,对于多分类问题,其本身是不支持的
逻辑回归的计算方式
一个样本包含若干特征,经过函数的计算,就得到了对应的y值,对于线性回归来说,其就是
这样得到的y值,其值域是正无穷到负无穷的,即通过线性回归的方式可以得到任意的值,对于概率来讲,只能在0和1之间取值,因此直接使用线性回顾的方式得到的结果没有值域的限制,这就让最后拟合出来的函数可信程度不高
解决方案很简单,使用线性回归的方式得到的结果,将这结果作为特征值送到新的函数中
经过转换以后就可以得到一个在0到1之间的值,这就得到了xb中发生某一个特定事件的概率是多少了
新的函数一般使用sigmoid函数,其表达式为
具体实现的操作
(在notebook中)
加载好包以后,定义sigmoid函数,设置绘制的x和y的范围,然后绘制
import numpy as np
import matplotlib.pyplot as plt
def sigmoid(t):
return 1 / (1 + np.exp(-t))
x = np.linspace(-10,10,500)
y = sigmoid(x)
plt.plot(x,y)
图像为
对于这根曲线来说,左端和右端都趋向于0和1,也就是说值域是在0和1之间,可以发现,在t>0的时候,p>0.5,t<0时,p<0.5,使用函数,将求出来的结果进行sigmoid函数计算,之后根据得到的值来分类
这就有了问题,对于给定的样本数据集,我们如何才能找到参数theta,使用这种方式可以最大程度的获得样本数据集对应的分类输出呢?
逻辑回归的损失函数
逻辑回归的整体框架如下
那么应该怎么建模来求出theta?
在线性回归中,在theta乘上xb之后就是估计值,让估计值减去真值,用这个差来度量估计的好坏,对这个差进行平方和以后再平均(MSE),作为损失函数,然后找到使损失函数最小的theta就行了
对于逻辑回归,整体方向是一样的,只不过比较麻烦,由于逻辑回归解决的是个分类问题,所以得出的数据,要不是1,要不是0,需要根据先前计算出的概率来估计是1还是0,那么损失函数也可以分成两类,如果真值为1,p越小,cost越大,如果真值等于0,p越大,cost越大(cost为损失)
也就是说首先根据分类的不同制定出了损失的大致趋势,根据真值的不同,分为两种情况
根据log函数的图像的特性,可以使用log函数来设计损失函数
在p取0的时候,此时函数趋近于正无穷,p取1的时候,函数为1,通过前面的分析和图像的理解,可以很清楚的明白其代表的意义
很显然,这个函数用起来是不太方便的,那么就在两个式子前加上一个系数,用来表示y的状态,这样就合为了一个函数
如果有m个样本,则就将这些损失加在一起
其中的预测结果为
那么整体的数学解函数就为(凸函数,只存在全局最优解)
接下来就是找到一组theta,使上式得到最小值,这个函数没有公式解,只能使用梯度下降法来求解
经过一系列的操作计算,最后可以得到对于逻辑回归的损失函数来说的相应的梯度为
这样只用使用公式以及梯度下降法就可以解除逻辑回归算法的问题