统计学习方法 逻辑斯蒂回归与最大熵模型
逻辑斯蒂回归与最大熵模型都属于对数线性模型。
逻辑斯蒂回归模型
逻辑斯蒂分布
定义
设X是连续随机变量,X服从逻辑斯蒂分布时指X具有下列分布函数和密度函数:
u为位置参数,y>0为形状参数。
二项逻辑斯蒂回归模型
二项逻辑斯蒂回归模型是一种分类模型,形式为参数化的逻辑斯蒂分布。随机变量X取值为实数,随机变量Y取值为1或0。我们通过监督学习方法来估计模型参数。
定义(逻辑斯蒂回归模型)
二项逻辑斯蒂回归模型是如下的条件概率分布:
x是输入,Y取{0,1}是输出,w,b是参数,w称为权值向量,b称为偏置。对于输入实例x,逻辑回归比较两个条件概率值的大小,将x分到概率值较大的那一类。
一个事件的几率(odds)指该事件发生的概率与该事件不发生的概率的比值,事件发生的概率为p,则事件的对数几率(log odds)或logit函数是
即输出Y=1的对数几率是由输入x的线性函数表示的模型,即逻辑斯蒂回归模型。
换一个角度看,考虑对输入x进行分类的线性函数wx,其值域为实数域。通过逻辑斯蒂回归模型可以将线性函数wx转换为概率:
这时,线性函数的值越接近正无穷,概率值就越接近1,线性函数的值越接近负无穷,概率值就越接近0.
模型参数估计
可以应用极大似然估计法估计模型参数,从而得到逻辑斯蒂回归模型。
多项逻辑斯蒂回归
假设离散型随机变量Y的取值集合是{1,2,…,K},那么多项逻辑斯蒂回归模型是:
二项逻辑斯蒂回归的参数估计法也可以推广到多项逻辑斯蒂回归。
最大熵模型
最大熵原理是概率模型学习的一个准则.最大熵原理认为,学习概率模型时,在所有可能的概率模型(分布)中,熵最大的模型是最好的模型.通常用约束条件来确定概率模型的集合,所以,最大熵原理也可以表述为在满足约束条件的模型集合中选取熵最大的模型.
假设离散随机变量X的概率分布是P(X),则其熵是
当X服从均匀分布时,熵最大。
博客
梯度上升算法
z是一个矩阵,θ是参数列向量(要求解的),x是样本列向量(给定的数据集)。θ^T表示θ的转置。g(z)函数实现了任意实数到[0,1]的映射,这样我们的数据集([x0,x1,…,xn]),不管是大于1或者小于0,都可以映射到[0,1]区间进行分类。hθ(x)给出了输出为1的概率。比如当hθ(x)=0.7,那么说明有70%的概率输出为1。输出为0的概率是输出为1的补集,也就是30%。如果这个概率大于0.5,我们就可以说样本是正样本,否则样本是负样本。
对于正样本,概率越接近一,分类效果越好,对于负样本,1-负样本的值越接近1越好。对于正样本和负样本两个公式合二为一:
为了简化问题,对表达式求对数。
至此,针对一个样本的代价函数已经出来了,假定样本与样本之间相互独立,整个样本集生成的概率即为所有样本生成概率的乘积,再将公式对数化,便得到公式:
满足J(θ)的最大的θ值即是我们需要求解的模型。
由于是求最大值,所以我们需要使用梯度上升算法,也就是求负值的最小也就是梯度下降。
逻辑回归的优缺点
如何凸显你是一个对逻辑回归已经非常了解的人呢。那就是用一句话概括它!逻辑回归假设数据服从伯努利分布,通过极大化似然函数的方法,运用梯度下降来求解参数,来达到将数据二分类的目的。
逻辑回归应用到工业界中的一些优点:
- 形式简单,模型的可解释性非常好。从特征的权重可以看到不同的特征对最后结果的影响,某个特征的权重值比较高,那么这个特征最后对结果的影响会比较大。
- 模型效果不错。在工程上是可以接受的(作为baseline),如果特征工程做的好,效果不会太差,并且特征工程可以大家并行开发,大大加快开发的速度。
- 训练速度较快。分类的时候,计算量仅仅只和特征的数目相关。并且逻辑回归的分布式优化sgd发展比较成熟,训练的速度可以通过堆机器进一步提高,这样我们可以在短时间内迭代好几个版本的模型。
- 资源占用小,尤其是内存。因为只需要存储各个维度的特征值。
- 方便输出结果调整。逻辑回归可以很方便的得到最后的分类结果,因为输出的是每个样本的概率分数,我们可以很容易的对这些概率分数进行cutoff,也就是划分阈值(大于某个阈值的是一类,小于某个阈值的是一类)。
缺点:
- 准确率并不是很高。因为形式非常的简单(非常类似线性模型),很难去拟合数据的真实分布。
- 很难处理数据不平衡的问题。
- 处理非线性数据较麻烦。逻辑回归在不引进其他方法的情况下,只能处理线性可分的数据,或者进一步说,处理二分类的问题。
- 逻辑回归本身无法筛选特征。有时候,我们会用gbdt来筛选特征,然后再上逻辑回归。
实践
AUC
评价分类的指标。
差分与取对数
滑动平均值是从一个有n项的时间序列中来计算多个连续m项序列的平均值。
多项式回归
关键词:正则化,get_Variable,sess.run
https://github.com/zdkswd/myTensorflowExamples/blob/master/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/%E5%A4%9A%E9%A1%B9%E5%BC%8F%E5%9B%9E%E5%BD%92.py
逻辑回归与Softmax回归
softmax就是多分类的逻辑回归,使用的损失函数是交叉熵,交叉熵就是负的逻辑回归的极大似然估计。
softmax成为了激活函数。
https://github.com/zdkswd/TensorFlow-Examples/blob/master/examples/2_BasicModels/logistic_regression.py
逻辑回归
从博客内容可知,为了使J(θ)最大,就尽可能的分对。
https://github.com/zdkswd/MLcode/tree/master/%E7%AE%97%E6%B3%95%E5%AE%9E%E7%8E%B0/%E9%80%BB%E8%BE%91%E5%9B%9E%E5%BD%92
这个分类结果相当不错,从上图可以看出,只分错了几个点而已。但是,尽管例子简单切数据集很小,但是这个方法却需要大量的计算(300次乘法)。因此将对改算法稍作改进,从而减少计算量,使其可以应用于大数据集上。
逻辑回归算法的改进
梯度上升算法在每次更新回归系数(最优参数)时,都需要遍历整个数据集。
假设,我们使用的数据集一共有100个样本。那么,dataMatrix就是一个1003的矩阵。每次计算h的时候,都要计算dataMatrixweights这个矩阵乘法运算,要进行1003次乘法运算和1002次加法运算。同理,更新回归系数(最优参数)weights时,也需要用到整个数据集,要进行矩阵乘法运算。总而言之,该方法处理100个左右的数据集时尚可,但如果有数十亿样本和成千上万的特征,那么该方法的计算复杂度就太高了。因此,需要对算法进行改进,我们每次更新回归系数(最优参数)的时候,能不能不用所有样本呢?一次只用一个样本点去更新回归系数(最优参数)?这样就可以有效减少计算量了,这种方法就叫做随机梯度上升算法。
算法改进的第一点在于alpha在每次迭代都会调整,并且,虽然alpha会随着迭代次数不断减小,但永远不会减小到0,因为这里还存在一个常数项。必须这样做的原因是为了保证在多次迭代之后新数据仍然具有一定的影响。如果需要处理的问题是动态变化的,那么可以适当加大上述常数项,来确保新的值获得更大的回归系数。另一点值得注意的是,在降低alpha的函数中,alpha每次减少1/(j+i),其中j是迭代次数,i是样本点的下标。第二个改进的地方在于更新回归系数(最优参数)时,只使用一个样本点,并且选择的样本点是随机的,每次迭代不使用已经用过的样本点。这样的方法,就有效地减少了计算量,并保证了回归效果。
MLcode/逻辑回归随机梯度下降.py at master · zdkswd/MLcode · GitHub
当数据集较小时,我们使用梯度上升算法
当数据集较大时,我们使用改进的随机梯度上升算法
对应的,在Sklearn中,我们就可以根据数据情况选择优化算法,比如数据较小的时候,我们使用liblinear,数据较大时,我们使用sag和saga。
使用Sklearn构建Logistic回归分类器
LogisticRegression这个函数,一共有14个参数:
https://cuijiahua.com/blog/2017/11/ml_7_logistic_2.html
看文中的参数说明。
代码:
https://github.com/zdkswd/MLcode/tree/master/scikit-learn-code/sklearn-%E9%80%BB%E8%BE%91%E5%9B%9E%E5%BD%92
总结
1、Logistic回归的优缺点
优点:
实现简单,易于理解和实现;计算代价不高,速度很快,存储资源低。
缺点:
容易欠拟合,分类精度可能不高。
2、其他
Logistic回归的目的是寻找一个非线性函数Sigmoid的最佳拟合参数,求解过程可以由最优化算法完成。
改进的一些最优化算法,比如sag。它可以在新数据到来时就完成参数更新,而不需要重新读取整个数据集来进行批量处理。
机器学习的一个重要问题就是如何处理缺失数据。这个问题没有标准答案,取决于实际应用中的需求。现有一些解决方案,每种方案都各有优缺点。
我们需要根据数据的情况,这是Sklearn的参数,以期达到更好的分类效果。