文章目录
Logistic 回归虽然名称叫做回归,但其实是一种分类模型;
在周志华老师的西瓜书中,把这一方法叫做:对数几率回归,其实看完整个推导过程,感觉这个名称更合适一些。几率就是一个事件发生的概率和不发生的概率的比值;
问题描述:
已知某些样本x,具有n个特征值
w
1
,
w
2...
w
n
w1,w2...w_n
w1,w2...wn, 以及对应的标签
y
y
y;
对样本x进行正确分类;
解决思路:
最简单的方法,就是找到一个函数来拟合特征之间的关系,比如最简单的线性函数,然后把这个函数值用一个可微的函数,把真实的标签跟线性回归预测的值联系起来即可;如果特征之间不是线性组合,也就是数据是线性不可分的,可以用多项式函数或者其他函数来替代线性回归;目前我们只考虑线性回归的情况。
z = w T ∗ x + b z = w^T * x + b z=wT∗x+b
f ( z ) = 1 1 + e − z f(z) = \frac{1}{1+e^{-z}} f(z)=1+e−z1
我们假设y为x为正样本的概率,那么1-y,就是x为负样本的概率,那么就可以用 y 1 − y \frac{y}{1-y} 1−yy 来表示x为正样本的几率
l n y 1 − y = z = w T ∗ x + b ln \frac{y}{1-y} = z = w^T * x + b ln1−yy=z=wT∗x+b
y = e z 1 + e z y = \frac{e^z}{1+e^z} y=1+ezez
即:
l n p ( y = 1 ∣ x ) p ( y = 0 ∣ x ) = z ln \frac{p(y=1|x)}{p(y=0|x)} = z lnp(y=0∣x)p(y=1∣x)=z
p ( y = 1 ∣ x ) = e z 1 + e z p(y=1|x) = \frac{e^z}{1+e^z} p(y=1∣x)=1+ezez
p ( y = 0 ∣ x ) = 1 1 + e z p(y=0|x) = \frac{1}{1+e^z} p(y=0∣x)=1+ez1
有些问题当中,y的取值是-1或者1, 而不是0或者1;
这个如果 $ y = {-1, 1}$, 则上式可以写成:
p ( y ) = 1 1 + e y z p(y) = \frac{1}{1+e^{yz}} p(y)=1+eyz1
损失函数
我们可以直接使用最大似然函数:
m
a
x
L
(
w
,
b
)
=
∑
l
n
p
(
y
∣
x
,
w
,
b
)
max L(w, b) = \sum ln p(y|x, w, b)
maxL(w,b)=∑lnp(y∣x,w,b)
m i n L ( w , b ) = ∑ l n ( 1 + e − y ( w x + b ) ) min L(w, b) = \sum ln(1+e^{-y(wx + b)}) minL(w,b)=∑ln(1+e−y(wx+b))
这是一个关于w的高阶可导连续凸函数;根据凸优化理论,经典的数值优化算法都可以对此求解,比如随机梯度下降。我们接下来就使用随机梯度下降算法来优化求解:
w
j
=
w
j
−
r
∗
∑
i
x
i
j
∗
y
i
∗
f
(
−
y
i
x
i
w
)
wj = wj - r * \sum_ix_{ij}*y_i* f(-yixiw)
wj=wj−r∗i∑xij∗yi∗f(−yixiw)
其中的r表示步长,也就是学习率;
而如果给定的标签y={0, 1}, 那么损失函数则是如下表达式:
L = y ∗ l o g p ( y = 1 ) + ( 1 − y ) ∗ l o g p ( y = 0 ) L = y*logp(y=1) + (1-y)*log p(y=0) L=y∗logp(y=1)+(1−y)∗logp(y=0)
L = y ∗ z + l o g ( e z + 1 ) L = y*z + log (e^z + 1) L=y∗z+log(ez+1)
梯度更新方法:
w j = w j − r ∗ ∑ i x i j ∗ ( y i − f ( w ∗ x ) ) wj = wj - r * \sum_ix_{ij}* (y_i - f(w*x)) wj=wj−r∗i∑xij∗(yi−f(w∗x))
最大似然损失函数、两种交叉熵损失函数
在分类问题中,我们看一看到,其实最大似然损失函数,跟交叉熵损失函数长得一样一样的。
在机器学习中,还会经常看到两种长得不一样的损失函数:
− t j ∗ l o g ( y j ) -t_j * log(y_j) −tj∗log(yj) // t i 表 示 样 本 真 实 的 l a b e l , i 表 示 样 本 下 标 t_i表示样本真实的label, i表示样本下标 ti表示样本真实的label,i表示样本下标
− ∑ i t i ∗ l o g ( y i ) + ( 1 − t i ) ∗ l o g ( 1 − y i ) -\sum_i t_i* log(y_i) + (1-t_i)*log(1-y_i) −∑iti∗log(yi)+(1−ti)∗log(1−yi)
而这两个长得形式完全不同的损失函数都是交叉熵损失函数,但是对应的模型的最后输出层不一样,前者对应的是softmax, 而后者对应的是sigmoid函数输出
因为交叉熵是衡量两个数据分布的差异,如果是最后一层是softmax的话,本身就是数据的一个分布,所以可以直接衡量真实标签和预测值之间的差异从;
但如果最后输出层是sigmoid的话,相当于输出就不是一个分布了,因为和不是1;每个神经元对应的是伯努利分布,输出的就是对应的概率
Python实现code
import numpy as tf
def read()
Logister回归模型相比于SVM的区别
- 前者是交叉熵损失函数, 后者是合页损失函数
- 前者处理非线性,需要组合特征或者特征离散化; 后者靠核函数;
- 前者对异常点比较敏感,
- 后者适合处理数据量比较少的场景
- 前者是参数化模型,后者是非参数化模型
如何选取这两个模型的问题:
用m表示特征数量,用n表示样本数量;
1) 如果m远远大于n, 则选择LR;
2)如果两者差不多,选择SVM + 高斯核函数;
3)如果m小于n,则需要手动增加一些特征,变成第一种情况,然后使用LR
==================================
参数模型:根据预先设计的规则,例如方差损失最小,进行学习,参数模型例子:回归(线性回归、逻辑回归)模型;最好可以看一下或者直接进行一下相关的推导;根据规则,拥有少部分数据就可以;
非参数模型:不需要事先假设规则,直接挖掘潜在数据中的规则;非参数模型例子:KNN,决策树,挖掘数据潜在的特征,所以比较灵活;
特征离散化
在工业界,很少直接将连续值作为逻辑回归模型的特征输入,而是将连续特征离散化为一系列0、1特征交给逻辑回归模型,这样做的优势有以下几点:
离散特征的增加和减少都很容易,易于模型的快速迭代;
稀疏向量内积乘法运算速度快,计算结果方便存储,容易扩展;
离散化后的特征对异常数据有很强的鲁棒性:比如一个特征是年龄>30是1,否则0。如果特征没有离散化,一个异常数据“年龄300岁”会给模型造成很大的干扰;
逻辑回归属于广义线性模型,表达能力受限;单变量离散化为N个后,每个变量有单独的权重,相当于为模型引入了非线性,能够提升模型表达能力,加大拟合;
离散化后可以进行特征交叉,由M+N个变量变为M*N个变量,进一步引入非线性,提升表达能力;
特征离散化后,模型会更稳定,比如如果对用户年龄离散化,20-30作为一个区间,不会因为一个用户年龄长了一岁就变成一个完全不同的人。当然处于区间相邻处的样本会刚好相反,所以怎么划分区间是门学问;
特征离散化以后,起到了简化了逻辑回归模型的作用,降低了模型过拟合的风险。