本文主要包含以下内容: 回归分析 逻辑回归介绍 Sigmoid函数 LR为什么使用Sigmoid函数 LR的算法原理
mllib中的LRWithLBFGS ml中的二分类LR ml中的多分类LR
逻辑回归(Logistic Regression,LR)是较早应用在推荐排序上的,其属于线性模型,模型简单,可以引入海量离散特征,好处是模型可以考虑更加细节或者说针对具体个体的因素。如果想要引入非线性因素需要做特征交叉,这样很容易产生百亿特征,在很早之前ctr就主要靠堆人力搞特征工程工作来持续优化效果。 虽然目前在工业界单纯使用LR做排序的场景或业务并不多,但是对于初学者,一些中小企业在资源和人力不那么充足的情况下,LR扔不失为一个不错的选择。这样可以遵循先上线再迭代的策略完善排序模型。 在学习LR之前先了解一下什么是回归分析和其分类。 回归分析回归分析算法(Regression Analysis Algorithm)是机器学习算法中最常见的一类机器学习算法。 什么是回归分析回归分析就是利用样本(已知数据),产生拟合方程,从而(对未知数据)进行预测。例如有一组随机变量 和另外一组随机变量 ,那么研究变量 与 之间关系的统计学方法就叫作回归分析。因为这里 和 是单一对应的,所以这里是一元线性回归。 回归分析算法分类回归分析算法分为线性回归算法和非线性回归算法。 1、线性回归线性回归可以分为一元线性回归和多元线性回归。当然线性回归中自变量的指数都是 1,这里的线性并非真的是指用一条线将数据连起来,也可以用一个二维平面、三维曲面等。 一元线性回归:只有一个自变量的回归。例如房子面积(Area)和房子总价(Money)的关系,随着面积(Area)的增大,房屋价格也是不断增加。这里的自变量只有面积,所以是一元线性回归。 多元线性回归:自变量大于或等于两个的回归。例如房子面积(Area)、楼层(floor)和房屋价格(Money)的关系,这里自变量有两个,所以是二元线性回归。 典型的线性回归方法如下: 在统计意义上,如果一个回归等式是线性的,那么它相对于参数就必须是线性的。如果相对于参数是线性的,那么即使相对于样本变量的特征是二次方或多次方的,这个回归模型也是线性的。例如下面的式子: 甚至可以使用对数或者指数取形式化特征,如下: 有一类模型,其回归参数不是线性的,也不能通过转换的方法将其变为线性的参数,这类模型称为非线性回归模型。非线性回归可以分为一元回归和多元回归。非线性回归中至少有一个自变量的指数不为 1。回归分析中,当研究的因果关系只涉及因变量和一个自变量时,叫作一元回归分析;当研究的因果关系涉及因变量和两个或两个以上自变量时,叫作多元回归分析。 例如下面的两个回归方程: 与线性回归模型不一样的是,这些非线性回归模型的特征因子对应的参数不止一个。 3、广义线性回归有些非线性回归也可以用线性回归的方法来进行分析,这样的非线性回归叫作广义线性回归。典型的代表是 Logistic Regression。 这里不做过多介绍,下文会详细介绍。 逻辑回归介绍逻辑回归与线性回归本质上是一样的,都是通过误差函数求解最优系数,在形式上只不过是在线性回归上增加了一个逻辑函数。与线性回归相比,逻辑回归(Logistic Regression,LR)更适用于因变量为二分变量的模型,Logistic 回归系数可用于估计模型中每个自变量的权重比。 Sigmoid函数Sigmoid函数(海维赛德阶跃函数)在二分类的情况下输出的值为0和1,其数学表达式如下: 可以通过以下代码来展示 Sigmoid 函数的图像。 import math import matplotlib.pyplot as plt def sigmoid(x): return 1 / (1 + math.exp(-x))
# python2 中 range 生成的是一个数组,python3 中生成的是一个迭代器,可以使用 list 进行转换 X = list(range(-10, 10)) Y = list(map(sigmoid, X)) fig = plt.figure(figsize=(4, 4)) ax = fig.add_subplot(111)
# 隐藏上边和右边 ax.spines['top'].set_color('none') ax.spines['right'].set_color('none')
# 移动另外两个轴 ax.yaxis.set_ticks_position('left') ax.spines['left'].set_position(('data', 0)) ax.xaxis.set_ticks_position('bottom') ax.spines['bottom'].set_position(('data', 0.5)) ax.plot(X, Y) plt.show()
Sigmoid 函数展示图可以看出,Sigmoid 函数连续、光滑、严格单调,以(0,0.5)为中心对称,是一个非常良好的阈值函数。当 趋近负无穷时, 趋近于 0;当 趋近于正无穷时, 趋近于 1; 时,。当然,在 超出[-6,6]的范围后,函数值基本上没有变化,值非常接近,在应用中一般不考虑。 Sigmoid 函数的值域限制在(0,1)之间,[0,1]与概率值的范围是相对应的,这样 Sigmoid 函数就能与一个概率分布联系起来了。 Sigmoid 函数的导数是其本身的函数,即݂,计算过程非常方便,也非常节省时间。其推导过程如下: <section role="presentation" data-formula="\begin{aligned}
f" (x)="" &="(-1)" (1+e^{-x})^{-2}(0+(-1)e^{-x})="" \="" *="" \frac{e^{-x}}{(1+e^{-x})}="" \end{aligned}="" '="" data-formula-type="block-equation">LR为什么使用Sigmoid函数这里只讨论二分类的情况。首先LR的假设只有一个,就是两个类别的特征服从均值不等、方差相等的高斯分布,也就是: 为什么假设它们服从高斯分布?一方面是因为高斯分布比较容易理解;另一方面从信息论的角度看,当均值和方差已知时(尽管并不知道确切的均值和方差,但是根据概率论,当样本量足够大时,样本均值和方差以概率 1 趋向于均值和方差),高斯分布是熵最大的分布。为什么要熵最大?因为熵最大的分布可以平摊风险。想想二分查找中,为什么每次都选取中间点作为查找点?就是为了平摊风险。假设方差相等是为了后面处理起来方便,若不相等则无法消去项。 首先定义“风险”为: 式中,是把样本预测为 0 时的风险,是把样本预测为 1 时的风险,是样本为实际标签 却把它预测为 时所带来的风险。 在 LR 算法中,认为预测正确不会带来风险,因此 和 都为 0,此外,认为标签为 0 而预测为 1 和标签为 1 而预测为 0,两者所带来的风险是一样的,因此 和 相等。方便起见,记为 。 所以上面定义的“风险”可以化简为: 现在问题来了,对于某个样本,应该把它预测为 0 还是预测为 1 好?按照风险最小化的原则,应该选择风险最小的,也就是,当 时,预测为 0 的风险要小于预测为 1 的风险,即 ܲ 时,应该把样本预测为 0。即:比较两个条件概率,并把样本分配到概率最大的那个类中。 式中两边同时除以 可得: 对不等式左边的部分取对数(为什么取对数?因为之前提过,两个类别的特征服从均值不等、方差相等的高斯分布,取对数方便处理高斯分布里的指数),再利用贝叶斯公式进行展开,归一化常数忽略掉,将得到: 方便起见,假设 是一维的(当然也很容易推广到多维的情况),套入高斯分布公式,此外,由于 和 都是常数,第二项简记为常数 继续展开,将得到: 取: 两边取指数,并利用这个概率公式化简,可得到: 其推算过程为: 综上可以知道为什么 LR 算法要用 Sigmoid 函数了。 LR的算法原理1、算法原理机器学习模型实际上把决策函数限定在某一组条件下,这组限定条件就决定了模型的假设 空间。当然,还希望这组限定条件简单而合理。 逻辑回归模型所做的假设是: 这里的 就是 Sigmoid 函数,相应的决策函数为: 0.5
' data-formula-type='block-equation'>选择 0.5 作为阈值是一般的做法,实际应用时,特定的情况下可以选择不同的阈值。如果对正例的判别准确性要求高,可以使阈值大一些;如果对正例的召回要求高,则可以使阈值小一些。 在函数的数学形式确定之后,就要求解模型中的参数了。统计学中常用的一种数学方法是最大似然估计,即找到一组参数,使得在这组参数条件下数据的似然度(概率)更大。在逻辑回归算法中,似然函数可以表示为: 取对数,可以得到对数形式的似然函数: 同样这里也使用损失函数来衡量模型预测结果准确的程度,这里采用 损失函数,其在单条数据上的定义为: 如果取整个数据集上的平均 损失,可以得到: 在逻辑回归模型中,最大化似然函数和最小化 lg 损失函数实际上是等价的。对于该优化问题,存在多种求解方法,这里以梯度下降的情况为例说明。基本步骤如下: 其中损失函数的梯度计算方法为: <section role="presentation" data-formula="\frac{\partial J}{\partial \theta} = -\frac{1}{n} \sum_{i=1} (y_i - y_i" )x_i="" +="" \lambda\theta="" '="" data-formula-type="block-equation"> |