逻辑回归(Logistic regression)

问题描述

问题1:数据拟合    

        对于这样的n个样本点\mathbf{(x_1,y_1),(x_2,y_2),\dots(x_n,y_n)}.我们想要建立一个合适的模型来拟合它们,并且能够对于一个新给出的\mathbf{x_k},我们能预测出一个合理的\mathbf{y_k}。例如我们有近十年的GDP数据,我们想通过这个数据来预测明年的GDP。为了达到这个目的,我们需要一个合适的模型\mathbf{f(x)}来拟合近十年的GDP数据,再把明年的特征项\mathbf{x}输入到这个模型中去,这样得到的值就是我们想要的明年的GDP的数据。

        这样问题就变为了我们如何去找到一个这样的模型去拟合这些数据点。一个非常简单并且经典的想法就是线性模型(linear model).在线性回归(linear regression)中,我们总是做出这样的假设:

        我们总是认为\mathbf{x}\mathbf{y}之间存在一个线性关系,即:\mathbf{y=\beta_1+\beta_2x}。但是在几何上,我们想让这么多个点都在同一条直线上是比较困难的,如果我们观测到的样本点都在同一条直线上,并且样本点的数量够多的话,我们有理由认为这些样本点就是从这条直线上取的。但是实际上,这样的情况很少,所以我们允许实际的关系与线性关系有一些偏差\epsilon,并且每个样本点的偏差都不一样。这样我们就可以得到一个新的模型:

\mathbf{y_i=\beta_1+\beta_2x_i+\epsilon_i }

        问题便转化为了得到数据点之后,我们该如何求得函数的参数值\beta1,\beta2

问题2:拟合逻辑值(0,1)

        如果y值都只能是0或者1呢?即\mathbf{y_k=0 \ or \ 1,for \ k=1,2,\dots n}。当我们需要输出的函数值只能取0,1呢。这个时候线性模型是否还能够起作用呢?对于这样的数据点(-4,0),(-3,0),(-2,0),(-1,0),(1,0),(2,0),(3,0),(4,0)。我们将其画在图上:

        接下来对这些样本点做线性回归:

        可以看出来,线性回归的拟合效果很差,并且我们会输出小于0的数,这样的结果是不能被我们所接受的。出现这样的问题也是显而易见的,因为在这些数据点很明显并不呈现线性的分布,并且取值只能是0或者1。但是在线性模型\mathbf{y_i=\beta_1+\beta_2x_i+\epsilon_i }中,很明显\mathbf{y_i}的取值范围是\mathbb{R},所以我们做线性模型的假设并不合理。其实,在线性模型中为了得到一个好的拟合效果,我们总是假设\mathbf{y_i|x_i}服从正态分布(Guass distribution),\mathbf{E[\epsilon _i|x_i]=0},并且使用普通最小二乘法(OLS)对参数进行估计。但是对于只能取到0或者1的\mathbf{y_i}。这样的假设显然不合理。我们需要新的模型与方法。

寻找新模型(Logistics regression model)

        这个新方法便是logistics regression(逻辑回归,又称对数几率回归,下面统一使用逻辑回归)进行描述。我们的模型的输出的值需要为0,1(逻辑值),所以称为逻辑回归。那么怎么让我们的模型的输出值为0,1呢?直接思考这个问题很困难,但是我们可以换个角度。在线性回归中,我们假设\mathbf{y_i|x_i}服从正态分布。那么在这里,\mathbf{y_i|x_i} 只能取到0或者1,我们是否可以假设其服从一个简单的分布------两点分布?这当然是可以的,给定样本点,我们总是可以算出\mathbf{y_i=1}的频率和\mathbf{y_i=0}的频率,并且算出其经验分布。经验分布总是能在样本量足够大的时候趋向于真实的分布。

        通过上述分析我们就有了一个新的想法,如果给了我们一个\mathbf{x_k},要是我们能估计出\mathbf{y_k|x_k=1}的概率和\mathbf{y_k|x_k=0}的概率。因为这两个概率相加总是等于1,要是\mathbf{y_k|x_k=1}的概率大一些,我们就认为\mathbf{y_i=1},要是\mathbf{y_k|x_k=0}的概率大一些,我们就认为\mathbf{y_i=0}。这样我们的模型就建立好了一半了。剩下的一半便是如何估计这些概率了。

        那么如何输出这些概率呢?首先我们先写出这样一个表达式:

 \mathbf{Y_i|X_i}=\begin{cases}1,&\text{with probability} \ P_i\\0,&\text{with probability}\1-P_i \end{cases}

        或者以下的表达更加方便:

\begin{cases} \mathbf{P(Y_i=1|X_i)}=P_i\\ \mathbf{P(Y_i=0|X_i)}=1-P_i\end{cases}

         从这两个式子的推导就可以得到P是由\mathbf{X_i}所决定的。那我们该如何写出合适的\mathbf{f(X_i)=P_i}呢?这样我们就要用到我们的老朋友线性模型了。但是线性模型的问题到目前为止还并没有解决,线性模型的输出值还是在\mathbb{R}中的。但是我们的目标值\mathbf{P_i}却是在0到1之间。如何解决这个问题呢?首先我们把(0,1)扩展到\mathbb{R^+}上。容易得到这样的一个式子是在\mathbb{R^+}上取值的:\frac{\mathbf{P}}{\mathbf{1-P}}。再把\mathbb{R^+}扩展到\mathbb{R}上,对其取一个自然对数就好了:\mathbf{ln}\frac{\mathbf{P}}{\mathbf{1-P}}。这样我们就把(0,1)扩展到了\mathbb{R}上。

 为了接下来的讨论方便起见,我们令:

\boldmath{X = \begin{pmatrix} x_{11}&x_{12}&\dots&x_{1m} \\ x_{21}&x_{22}&\dots&x_{2m}\\ \vdots && \ddots &\vdots \\ x_{n1}& & &x_{nm} \end{bmatrix}}            \boldmath{\beta =\begin{pmatrix} \beta_{1}\\ \vdots\\ \vdots\\ \beta_{m} \end{bmatrix}}                X_i=\begin{pmatrix} X_{i1}\\X_{i2}\\ \vdots \\X_{im} \end{pmatrix}^T.

        若要用线性模型去拟合上面推导出的式子(这也是为什么逻辑回归实际上也是线性回归的一种),我们就得到了:

\mathbf{\mathbf{ln}\frac{p}{1-p}=X_i\beta}

         经过推导,我们得到了:

\mathbf{P= \frac{1}{1+e^{-X_i\beta}}}

        上述式子就是logistics regression中重要的sigmoid function:

\boldmath{\mathbf{f(x) = \frac{1}{1+e^{-x}}}}

        这样我们就可以写出这样的函数来计算需要的\mathbf{P_i}:

\mathbf{P(Y_i|X_i\beta) =\begin{cases}1-\mathsf{f(X_i\beta)},&\text{for}\ Y_i = 0;\\\mathsf{f(X_i\beta)},&\text{for}\ Y_i=1.\end{cases}}

        或者我们也可以将其写为

\mathbf{ P(X_i\beta ) = f(X_i\beta)^{Y_i}(1-f(X_i\beta))^{1-Y_i}}

        实际上,sigmoid function具有十分良好的性质,它能够很快的收敛到1或者0:

         可以看到,如果特征值足够的有"特点"的话,也就是\mathbf{X_k}距离0点有一些距离,甚至这个距离都不需要特别远。我们估计出的\mathbf{P_k}值就会十分靠近1或者0。换句话说,我们就能很容易的直接做出合理的预测,若是\mathbf{X_k}距离0点向右偏的足够多,使得\mathbf{P_k}足够靠近1,那么我们就认为\mathbf{Y_i|X_i=1}。反之,我们就认为 \mathbf{Y_i|X_i=0}。那么距离1有多远才算是靠近?这就涉及到了决策边界的问题。我们不妨假设一个阈值\alpha ,\ (0\leq \alpha \leq 1),如果\mathbf{P_k}>\alpha,我们就认为它靠近1,我们便认为\mathbf{Y_i|X_i=1}。反之,我们就认为\mathbf{Y_i|X_i=0}

模型评估

        线性回归中(这里的线性模型专指用于预测),我们常常会使用\mathbf{R^2}\mathbf{\bar{R^2}}\mathbf{SER}来评估模型的好坏。而在逻辑回归中,我们不再直接使用预测值与实际值的距离来评判模型的好坏。我们用模型是否能够成功对每个样本点进行分类来评判。因为逻辑回归实际上是一种分类算法(分类为0或者1)。为了方便表达,我们假设1为阳性,0为阴性。建立以下的表格:

 \begin{tabular}{|c|c|c|c|} \hline \multicolumn{2}{|c|}{ } & \multicolumn{2}{|c|} {\text{actual value}}\\ \cline{3-4} \multicolumn{2}{|c|} { } & \text{Positive} &\text{Negative}\\ \hline \ \text{predicted} & \text{Positive} &\text{TP}&\text{FP}\\ \cline{2-4} \text{value}&\text{Negative} &\text{FN} &\text{TN}\\ \hline \end{tabular}

         TP为"真阳性"(True positive)的数量。即实际上为阳性,预测结果为阳性。

        FP为"假阳性"(False positive)的数量。即实际上为阴性,预测结果为阳性。

         FN为"假阴性"(False negative)的数量,即实际上为阳性,预测结果为阴性。

        TN为"真阴性"(True negative)的数量,即实际上为阴性,预测结果为阴性。

        第一个评判标准是准确率(accuracy):

\mathbf{accuracy = \frac{TP+TN}{TP+FP+FN+TN}}

        这个很容易理解,我们当然希望我们预测的值与实际值一样,实际为阳性,我们预测也为阳性,实际为阴性,我们预测也为阴性。于是我们定义准确率为我们成功预测的占比。但是我们只以准确率作为评判标准是不够的。它很容易受到极端值的影响。让我们来考虑下面这样的一个表:

\begin{tabular}{|c|c|c|c|} \hline \multicolumn{2}{|c|}{ } & \multicolumn{2}{|c|} {\text{actual value}}\\ \cline{3-4} \multicolumn{2}{|c|} { } & \text{Positive} &\text{Negative}\\ \hline \ \text{predicted} & \text{Positive} &\text{0}&\text{0}\\ \cline{2-4} \text{value}&\text{Negative} &\text{500} &\text{9500}\\ \hline \end{tabular}

        实际上我们设立的阈值\alpha非常高,或者模型总是输出一个小于\alpha的概率,导致P_k>\alpha的数量很少,甚至为0,更加极端一点,像上表一样,我们预测的Positive的数量为0。它的准确率很高,达到了95%。但是它却无法准确预测出任何一个实际上为Positive的样本点。这样的模型很明显是不好的。

        第二个评判标准是查准率(precision):

\mathbf{\mathbf{precision}=\frac{TP}{TP+FP}}

        查准率考察的是模型预测出来的阳性(Positive)有多少是正确的。查准率衡量模型对于阴性的区分能力。查准率越高,模型对阴性的区分能力就越强。

        第三个评判标准是召回率(recall):

\mathbf{recall = \frac{TP}{TP+FN}}

        召回率考察的是模型预测出的阳性(Positive)在真实的阳性中的占比。召回率衡量模型对于阳性的识别能力。召回率越高,模型对阳性的识别能力就越强。我们认为上述极端例子中的召回率为0。即无法识别出阳性。

        第四个评判标准是f1-score:

\mathbf{f1-score=\frac{2\times precision\times recall}{precision+recall}}

        f1-score是查准率和召回率的综合,它可以用来评判模型的稳健性,f1-score越高,模型就越稳健。

ROC和AUC:

        为了介绍ROC和AUC,我们首先来考察下面两个量:

(1) TPR(真阳性率,True Positive Rate):

\mathbf{TPR=\frac{TP}{TP+FN}}

实际为阳性,检测出来也为阳性的概率。

(2) FPR(假阳性率,False Positive Rate):

\mathbf{FPR=\frac{FP}{FP+TN}}

实际为阴性,检测出来为阳性的概率。

        对于我们的预测模型,我们当然希望,真阳性率越高越好,假阳性率越低越好。让我们考虑下面这样的一个图像:

         我们不妨假设这8个点中蓝色的点实际为Positive,红色的点实际为Negative。我们首先考虑当\alpha=0.5

         在这条虚线以上的我们预测其结果为Positive,反之,预测其为Negative。并且记录在下表中:

\begin{tabular}{|c|c|c|c|} \hline \multicolumn{2}{|c|}{ } & \multicolumn{2}{|c|} {\text{actual value}}\\ \cline{3-4} \multicolumn{2}{|c|} { } & \text{Positive} &\text{Negative}\\ \hline \ \text{predicted} & \text{Positive} &\text{3}&\text{1}\\ \cline{2-4} \text{value}&\text{Negative} &\text{1} &\text{3}\\ \hline \end{tabular}

        这样我们计算出来的TPR为0.75,计算出来的FPR为0.25。看上去效果还可以。接下来让我们换一个阈值0.95:

         同样,我们能得到TPR为0.75,计算出来的FPR为0。

        \begin{tabular}{|c|c|c|c|} \hline \multicolumn{2}{|c|}{ } & \multicolumn{2}{|c|} {\text{actual value}}\\ \cline{3-4} \multicolumn{2}{|c|} { } & \text{Positive} &\text{Negative}\\ \hline \ \text{predicted} & \text{Positive} &\text{3}&\text{0}\\ \cline{2-4} \text{value}&\text{Negative} &\text{1} &\text{4}\\ \hline \end{tabular}

        继续换一个阈值0.05:

         我们能得到TPR为1,计算出来的FPR为0.25。

\begin{tabular}{|c|c|c|c|} \hline \multicolumn{2}{|c|}{ } & \multicolumn{2}{|c|} {\text{actual value}}\\ \cline{3-4} \multicolumn{2}{|c|} { } & \text{Positive} &\text{Negative}\\ \hline \ \text{predicted} & \text{Positive} &\text{4}&\text{1}\\ \cline{2-4} \text{value}&\text{Negative} &\text{0} &\text{3}\\ \hline \end{tabular}

        可以看到,对于不同的阈值,我们总能算出对应的TPRFPR,更一般的,我们能得到下表

\begin{tabular}{|c|c|c|c|c|c|} \hline $\alpha$ & 0.000001 & 0.05 & 0.5 & 0.95 & 0.999999\\ \hline \text{TPR} &1 & 1&0.75 & 0.75&0\\ \hline \text{FPR} & 1&0.25 &0.25 &0&0\\ \hline \end{tabular}

        更加一般的,如果我们尽可能的遍历0,1中所有的数字,我们就能得到一组这样的值\mathbf{(FPR,TPR)}。我们以FPR为横坐标,TPR为纵坐标刻画出来的曲线,就是ROC曲线(受试者特征曲线,Receiver Operating Characteristic Curve)。

        

         如果我们能得到一个模型的ROC曲线,那么我们所取到的阈值\alpha(决策边界),其所对应在ROC曲线上的点应该越靠近左上角越好。这样我们的真阳性率(TPR)就越会靠近1,假阳性率(FPR)就越会靠近0。如此一来,阈值的选择也就完成了。

        那么什么是AUC呢?ROC除了可以用于阈值的选择,实际上还可以用于不同模型的比较。AUC(area under the curve)就是用来做这件事情的。AUCROC曲线下半部分的面积,这里AUC为0.9375。AUC的取值总是小于1。如果AUC越大,就说明它越靠近1,ROC曲线就能尽可能的越靠近左上角。一般来说,我们所选择的模型就会越好。

 计算参数值

        如何获得具体的,能够使用的\mathbf{P(Y_i|X_i\beta)}呢?将问题换一个说法:我们如何通过已有的样本点估计出所需要的\beta呢?

        (1)统计推导

        注意到\mathbf{P(Y_i|X_i\beta)}其实是一个分布的pmf。那么问题就变成了估计一个分布的参数值了。这里我们用统计中常用的方法------极大似然估计。这是一个具有很多良好性质的估计方法。使用这个方法需要用到连乘号\prod,我们做一个经典的处理,在连乘号外加一个\mathbf{ln},得到下面的式子:

\mathbf{\mathbf{L(\beta)}=\sum\limits_{i=0}^nY_i\mathbf{lnf}(X_i\beta)+(1-Y_i)\mathbf{ln}(\mathbf {1-f(X_i\beta)})}

         我们估计的\hat\beta就是为了让上面这个函数取值变得尽可能的大。

         为了讨论方便和形式统一,我们定义:

\mathbf{\mathbf{J}(\beta)=-\frac{1}{n}\sum\limits_{i=0}^n\mathbf{ln}\mathbf{P}(Y_i|X_i\beta)=-\frac{1}{n}\sum\limits_{i=0}^nY_i\mathbf{ln} \mathsf{f(X_i\beta)}+(1-Y_i)\mathbf{ln}(1-\mathsf{f(X_i\beta))}}

         我们只是在\mathbf{L(\beta)}的左边乘上了\mathbf{-\frac{1}{n}}。这样优化问题就变成了我们要求取\hat\beta使得\mathbf{J(\beta)}尽可能的小了。

         (2)惩罚函数

        所谓的惩罚函数也就是损失函数,我们在线性回归中定义的损失函数为:

\mathbf{\mathbf{loss(\beta)}=\sum\limits_{i=0}^n(Y_i-f(X_i))^2}

        这里我们同样定义一个惩罚函数,我们先对每个数据点设立一个惩罚项:

\mathbf{-lnP(Y_i|X_i\beta)=-[Y_ilnf(X_i\beta)+(1-Y_i)ln(1-f(X_i\beta))]}

        再其求取平均,得到惩罚函数为:

\mathbf{\mathbf{J}(\beta)=-\frac{1}{n}\sum\limits_{i=0}^n\mathbf{ln}\mathbf{P}(Y_i|X_i\beta)=-\frac{1}{n}\sum\limits_{i=0}^nY_i\mathbf{ln} \mathsf{f(X_i\beta)}+(1-Y_i)\mathbf{ln}(1-\mathsf{f(X_i\beta))}}

         在对惩罚函数的形式进行解释之前,首先介绍香农熵的概念:

(1)信息量:

         如果一个事件\mathbf{A}的发生概率为\mathbf{P\{A\}}。那么我们就定义这个事件发生给我们带来的额外信息量\mathbf{I(A)=-ln(P\{A\})}

         如果一个事件发生的概率为1,那么就算它发生了,我们也不会感到惊讶,因为它本来就应该发生。这样的事件发生给我们带来的额外信息量就是0。但是如果一个事件发生的概率为0.001,从图中我们可以看出,这件事发生给我们带来的额外信息量非常大。这也很好理解,对于这样一件发生的概率为0.001的事件,如果它发生了,这会让我们非常惊讶,因为它发生的机会很少,所以由此带来的额外信息量也就非常大。

(2)熵:

        熵是用来度量一个分布的不确定性。例如:\mathbf{P(X=1)=P,P(X=0)=1-P},对于这样一个两点分布,在事件没有发生前,我们该如何度量\mathbf{X}的不确定性呢?首先我们要理解不确定性是指什么,如果P=0.99。那么这件事的不确定性应该是很小的,我们有很大的把握确定X的结果就是1。怎么来确定这个X的不确定性?我们通过求期望的方式。对所有可能的事件所带来的额外的信息量求均值。就是X的不确定性。

        对于一个离散分布,我们定义它的熵为:

H(p)=E[I]=-\sum p(x)lnp(x)

        对于一个连续分布,我们定义它的熵为:

H(p)=E[I]=-\int f(x)lnf(x)\mathrm{d}x

        为了保证其连续性,我们约定P(x)\rightarrow 0,P(x)lnP(x)\rightarrow 0。熵的单位随着log的底数的变化而变化。当底数为2时,单位为“比特”(bit),底数为e时,单位为“奈特”。

(3)相对熵:

        相对熵(又称KL散度(Kullback-Leibler divergence))用来衡量两个随机分布间的距离。记为D_{KL}(p||q)。它用来度量当真实的分布为p时,假设分布q的无效性。(p分布到q分布的KL散度)

D_{KL}(p||q)=E_p[ln\frac{p(x)}{q(x)}]=\sum p(x)ln\frac{p(x)}{q(x)}=\sum p(x)lnp(x)-\sum p(x)lnq(x)

        同样为了保证连续性,我们约定0ln\frac{0}{0}=0,0ln\frac{0}{q}=0,pln\frac{p}{0}= \infty。当p,q同分布时,D_{KL}(p||q)=0。 

(4)交叉熵:

        H(p,q)=-\sum p(x)lnq(x)=D_{KL}(p||q)+H(p)

        交叉熵也用于描述两个概率分布之间的距离,其值越小说明这两个分布越相近。假设两个概率分布p,q,若p为真实分布,q为假设分布。则:KL散度=交叉熵-真实分布的熵。

        交叉熵常常用于构造惩罚函数。在逻辑回归中,基于交叉熵构造的惩罚函数为:

\begin{align} \nonumber H(p,q) & = -\sum p(y) lnq(y)\\ \nonumber &=-[p(y=1)lnq(y=1)+p(y=0)lnq(y=0)]\\ \nonumber &=-[ylnf(x_i\beta)+(1-y)ln(1-f(x_i\beta))] \end{align}

        这里解释一下第三个等式。这里y取1或者0。这是某个样本点的取值,因为每个y_i都是服从真实分布p。而一旦确定了y_i=1,那么p(y_i=1|x_i)=1。那么p(y_i=0|x_i)=0。所以可以直接转变为y_i1-y_i。这里,对数符号里面的函数是指假设的分布q,也就是我们定义的模型。而在我们定义的模型中,y_i=1y_i=0的概率是与x_i\beta相关的。所以如果实际上对于某个样本点,y_i=1,则p(y_i=1|x_i)=1,​​​​​​​p(y_i=0|x_i)=0那么后面那一项就为0。同样,在我们的假设模型中,如果y=1的概率为lnq(y),那么,y=0的概率就为1-lnq(y)

        下面两图能加深对于上述式子的理解:

         这里,若y=1,即真实值=1。f(x_i\beta)输出的是假设分布下y=1的概率。可见,如果f(x_i\beta)输出的是1,我们的惩罚就是0,因为这就是我们所期待的。如果 f(x_i\beta)输出的是0,这个式子马上就会趋向于无穷大。惩罚就会无穷大。

         倘若y=0,我们的惩罚函数就变为了-ln(1-f(x_i\beta))f(x_i\beta)输出的是假设分布下y=1的概率。 如果f(x_i\beta)输出的是0,我们的惩罚就是0。如果f(x_i\beta)输出的是1,我们的惩罚就是无穷大。

        对所有训练样本的惩罚函数取到均值就可以得到:

\mathbf{\mathbf{J}(\beta)=-\frac{1}{n}\sum\limits_{i=0}^n\mathbf{ln}\mathbf{P}(Y_i|X_i\beta)=-\frac{1}{n}\sum\limits_{i=0}^nY_i\mathbf{ln} \mathsf{f(X_i\beta)}+(1-Y_i)\mathbf{ln}(1-\mathsf{f(X_i\beta))}}

         这与极大似然估计得到的惩罚函数的式子是一样的!

梯度下降法和随机梯度下降法

          我们如何求取\hat\beta使得\mathbf{J(\beta)}尽可能的小呢?这里我们必须提前说明这个惩罚函数是一个凸函数。原因就不再深入讨论了。如果感兴趣可以参考这里。下面的讨论需要用到J(\beta)的一阶导,这里我们附上公式。

\frac{\mathrm{d} \mathsf{f(x)} }{\mathrm{d} x} = \frac{\mathrm{d}\frac{1}{1+e^{-x}}}{\mathrm{d}x} =\frac{-e^{-x}}{(1+e^{-x})^2} =\frac{1}{1+e^{-x}}(1-\frac{1}{1+e^{-x}})=\mathsf{f(x)}(1-\mathsf{f(x)})

\frac{\partial \mathsf{f(X_i\beta)}}{\partial \beta_j}= \mathsf{f(X_i\beta)}(1- \mathsf{f(X_i\beta)})x_{ij}

首先有\frac{\mathrm{d} \mathsf{f(x)} }{\mathrm{d} x} = \mathsf{f(x)}(1-\mathsf{f(x)}),又由于是对\beta_j求导,注意到X_i\beta\beta_j\times x_{ij},所以由求导的链式法则得到\frac{\partial\mathbf{f(X_i\beta)}}{\partial \beta_j}=\frac{\partial\mathbf{f(X_i\beta)}}{\partial\mathbf{X_i\beta}}\frac{\partial\mathbf{X_i\beta}}{\partial \mathbf{x_{ij}}\beta_j}\frac{\partial\mathbf{x_{ij}}\beta_j}{\partial \beta_j}。其中\mathbf{X_i}\beta = \sum\limits_{j=0}^m\mathbf{x_{ij}}\beta_j

得到J(\beta)的一阶导为:

\boldmath{\begin{align} \nonumber\frac{\partial\mathbf{J(\beta)} }{\partial \beta_j} &=-\frac{1}{n}\sum\limits_{i=0}^nY_i\frac{1}{\mathsf{f(X_i\beta)}}\frac{\partial \mathsf{f(X_i\beta)} }{\partial \beta_j}-(1-Y_i)\frac{1}{1-\mathsf{f(X_i\beta)}}\frac{\partial \mathsf{f(X_i\beta)}}{\partial \beta_j}\\ \nonumber&=-\frac{1}{n}\sum\limits_{i=0}^n[Y_i\frac{1}{\mathsf{f(X_i\beta)}}-(1-Y_i)\frac{1}{1-\mathsf{f(X_i\beta)}}]\frac{\partial \mathsf{f(X_i\beta)}}{\partial \beta_j}\\ \nonumber&=-\frac{1}{n}\sum\limits_{i=0}^n[Y_i-\mathsf{f(X_i\beta)}]x_{ij} \end{align}}

梯度下降法(GD)

        对于一个凸函数,我们要求它的最小值点,只需要它的一阶导等于0就可以了。(虽然可能存在很多驻点,但是我们只需要比较这些驻点的函数值就能得到最小值以及最小值点了)但是这并不是一个简单函数。\mathbf{J(\beta)}并不像一个简单的二次函数一样(ax^2+bx+c),对其求一阶导就能直接得到解析解。这里我们采用梯度下降法和随机梯度下降法求得它的数值解(有偏差,但是能够接受)。首先解释梯度下降法。其中公式中\alpha为学习率。或者称为步长。步长过大或者过小都会使得我们收敛到最小值所需要的步数增加。

\beta^{t+1}=\beta^{t}-\alpha\frac{\partial J(\beta)}{\partial \beta}|_{\beta = \beta^{t}}

        它的思路就是算出某个点的函数的梯度,然后朝着梯度相反的方向前进。我总是朝着最陡的坡向下走,这样我总能最快速的走到比较低的位置。

        对于函数f(x)=(x-3)^2+2,如果我们取初始值\beta_1=6,这里如果我们取步长为0.3。就能利用公式得到上图,不断的算出\beta_2,\beta_3\dots.\beta_n\dots。最后我们可以证明它会收敛到我们的最小值点3。(实际上,如果取步长为0.5,我们可以算出\beta_2=3,立马就能得到最小值点。由此可见,步长的选取也是很重要的。)

        但是梯度下降法有两个十分明显的缺点:

        (1)如果数据集十分巨大,由 J(\beta)的一阶导的形式可以看到,每次为了前进一步,我们都必须把所有的数据拿到公式里面进行运算。所消耗的时间是非常大的。

        (2)梯度下降法一旦被某个局部最小值点所捕获,则无法再离开(此时\frac{\partial J(\beta)}{\partial \beta}|_{\beta^t}=0,\beta^{t+1}=\beta^t,算法不再前进。)。但是我们需要的是全局最小值点。

随机梯度下降法(SGD)

        随机梯度下降法能够很好地解决上面两个问题。这个方法的思想是,我们每次前进,都随机在的数据集中抽取K个数据点,然后把这些数据点的惩罚项加和求平均。作为新的J^{t+1}(\beta)。然后用下面这个式子前进。

\beta^{t+1}=\beta^{t}-\alpha\frac{\partial J^{t+1}(\beta)}{\partial \beta}|_{\beta = \beta^{t}}J^{t+1}(\beta)=\frac{1}{|X_{t+1}|}\sum\limits_{x_i\in X_{t+1}}J_i(\beta)

其中J_i(\beta)是第i个数据点的惩罚项,|X_{t+1}|=K为我们每次抽取的样本数。

        如此一来我们就能很好地解决数据集十分巨大带来的问题,以及被局部最小值点吸收的问题。

        它与梯度下降法的差别就在于,梯度下降法每次都使用全部的数据计算目前的位置的梯度,然后走1步。但是随机梯度下降法每次都只用一部分数据计算梯度(一般方向不会与用全部数据计算得到的梯度一样),然后走1步。在运用上,随机梯度下降法走的步数要比梯度下降法走的多的多,但是随机梯度下降法走的一般也要比梯度下降法快得多。而且由于抽取数据点的随机性,随机梯度下降法能够从局部最优点逃离。

附上多类逻辑回归的相关公式(不再做推导)

        此时y可取到m类不同的点(不一定为数字,也可能是某个文字标签),若x有k个特征(feature)。则我们的参数矩阵\beta为:

\beta=\begin{pmatrix} \beta_{11} &\beta_{12} & \dots&\beta_{1m}\\ \beta_{21}&\beta_{22}&\dots &\beta_{2m}\\ &&\ddots &\vdots \\ \beta _{k1} & &\dots &\beta_{km} \end{pmatrix}

        softmax function:

        f(x)=\frac{e^{x_i}}{\sum_{i=1}^{n}e^{x_i}}

        思路很简单,就是把它们正则化,再取其为相应的概率值。把每一行x与\beta相乘,可以得到1\times m矩阵。将其代入到softmax function中,同样可以得到1\times m矩阵。就是对应m种y类的概率。最后取概率中较大那个为预测值。公式附上:

\begin{pmatrix} \frac{e^{x_i\beta_1}}{\sum_{j=1}^me^{x_i\beta_j}},\frac{e^{x_i\beta_2}}{\sum_{j=1}^me^{x_i\beta_j}},\dots,\frac{e^{x_i\beta_m}}{\sum_{j=1}^me^{x_i\beta_j}}\end{pmatrix}

       这是x的第i行的预测概率值,即第i个数据点的预测i值,我们在这其中取最大的那个,然后把它对应的y作为我们的预测值。(注:y有m个取值,这m个取值如果对应1,2,....m,我们开始时可以随便排序,但是一旦排序好之后就不会再变了。我们最开始排序仅仅影响我计算得出的参数矩阵\beta)。

        惩罚函数:

        同样利用交叉熵构造

J_i(\beta)=\begin{pmatrix} -ln(1-\frac{e^{x_i\beta_1}}{\sum_{j=1}^me^{x_i\beta_j}}),-ln(1-\frac{e^{x_i\beta_2}}{\sum_{j=1}^me^{x_i\beta_j}})\dots ,-ln(\frac{e^{x_i\beta_j}}{\sum_{j=1}^me^{x_i\beta_j}})\dots -ln(1-\frac{e^{x_i\beta_m}}{\sum_{j=1}^me^{x_i\beta_j}})\end{pmatrix}

        其中只有当y_i=\hat{y}_j时为-ln(\frac{e^{x_i\beta_j}}{\sum_{j=1}^me^{x_i\beta_j}}),否则就为-ln(1-\frac{e^{x_i\beta_j}}{\sum_{j=1}^me^{x_i\beta_j}})。同样可以用交叉熵去思考,如果我预测准确值的概率越高,我的惩罚就越小,如过预测其它项的概率越高,我的惩罚就越大。

J(\beta)=\frac{1}{n}J_i(\beta)

我们的目标就是使得上述矩阵m个元素都尽可能的小(使得我们的惩罚尽可能的小)。

        GD和SGD:

        思路差不多,这里直接附上GD公式,SGD形式一样,可自推。

\beta^{t+1}_{kj}=\beta^{t}_{kj}- \alpha \begin{cases} \frac{1}{n}\sum\limits_{i=1}^{n}(\frac{e^{x_i\beta_j}}{\sum_{j=1}^{m}e^{x_i\beta_j}}-1)x_{ik} & if \ y_i = \hat{y}_j \\ \frac{1}{n}\sum\limits_{i=1}^{n} \frac{e^{x_i\beta_j}}{\sum_{j=1}^{m}e^{x_i\beta_j}}x_{ik} & if \ y_i\neq \hat{y}_j \end{cases}

(1 \leqslant i \leqslant n,1 \leqslant j \leqslant m)

        这里x_{ik}为x的第i行第k列数据,\beta_{kj}\beta的第k行第j列数据(如果x有k个feature,则x有k列,则\beta有k行),x_i为x的第i行数据,即第i个数据点。\beta_j\beta的第j列数据。\hat{y}_j为序号j对应的y的取值。(x_i\beta_j对应的是第i个数据点,取到序号j对应的y的取值概率,具体可以看到上述公式。)

参考链接:

Logistic regression

ROC和AUC

交叉熵

GD和SGD

        第一次写博客,文章主要用作于学习笔记,具体讲述了Logistic Regression的基本原理和数学方法。菜鸟入门,写博客也只是为了打发时间。如果博客对您能有所帮助,我将十分荣幸。如果您能对内容谬误进行指正,我也将十分感激。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值