文章目录
Logister 回归虽然名称叫做回归,但其实是一种分类模型;
在周志华老师的西瓜书中,把这一方法叫做:对数几率回归,其实看完整个推导过程,感觉这个名称更合适一些。几率就是一个事件发生的概率和不发生的概率的比值;
问题描述:
已知某些样本x,具有n个特征值
, 以及对应的标签
;
对样本x进行正确分类;
解决思路:
最简单的方法,就是找到一个函数来拟合特征之间的关系,比如最简单的线性函数,然后把这个函数值用一个可微的函数,把真实的标签跟线性回归预测的值联系起来即可;如果特征之间不是线性组合,也就是数据是线性不可分的,可以用多项式函数或者其他函数来替代线性回归;目前我们只考虑线性回归的情况。
我们假设y为x为正样本的概率,那么1-y,就是x为负样本的概率,那么就可以用 来表示x为正样本的几率
即:
有些问题当中,y的取值是-1或者1, 而不是0或者1;
这个如果 $ y = {-1, 1}$, 则上式可以写成:
损失函数
我们可以直接使用最大似然函数:
这是一个关于w的高阶可导连续凸函数;根据凸优化理论,经典的数值优化算法都可以对此求解,比如随机梯度下降。我们接下来就使用随机梯度下降算法来优化求解:
其中的r表示步长,也就是学习率;
而如果给定的标签y={0, 1}, 那么损失函数则是如下表达式:
梯度更新方法:
最大似然损失函数、两种交叉熵损失函数
在分类问题中,我们看一看到,其实最大似然损失函数,跟交叉熵损失函数长得一样一样的。
在机器学习中,还会经常看到两种长得不一样的损失函数:
//
而这两个长得形式完全不同的损失函数都是交叉熵损失函数,但是对应的模型的最后输出层不一样,前者对应的是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作为一个区间,不会因为一个用户年龄长了一岁就变成一个完全不同的人。当然处于区间相邻处的样本会刚好相反,所以怎么划分区间是门学问;
特征离散化以后,起到了简化了逻辑回归模型的作用,降低了模型过拟合的风险。