源地址 https://blog.csdn.net/u012762419/article/details/52963241
版权声明: https://blog.csdn.net/u012762419/article/details/52963241
"纸上得来终觉浅,绝知此事要躬行"。最近在工作中用到逻辑回归(LR)做分类,使用的是sklearn中现成的算法包。在这个过程中遇到一些问题,激发了我对sklearn源码的解读,由此对逻辑回归有了更进一步的理解,对之前留下的一些坑也有了重新的认识。
该博文先从线性回归讲起,让后过渡到LR,最后对sklearn中实现LR的源代码做一些说明。这里需要说明两点:
第一:很多资料都讲到LR本质上是线性回归,但是也只是仅仅这样叙述而已,并没有深入讲解。
第二:LR从形式上看是非线性的,怎么理解LR是一个线性分类器,这也是本文要讲的。
第三:一般情况下,考虑到工程实现的可行性,实际应用中的算法包和理论是有出入的,这里重点讲解一下sklearn中二分类LR的实现方法。
1 . 线性归回
线性回归应该是机器学习(ML)中比较简单的一种算法,我们重点掌握的是其背后朴素的数学思想和直观解释,数学推导次之。线性回归通俗点说就是:在二维平面上有一对点,我们可以找到一条线去拟合(度量)这些点,如果找到的线是直线,那么就成这个过程为线性回归,这个概念可以拓展到高维空间。我们举一个预测房屋价格的例子,一个房子的价格会受很多因素的影响,比如面积、地段、朝向、房间的数量等,这些因素称之为independent variable,或者predictor,在ML中,一般成为特征(feature);房子的价格成为dependent variable,或者response,在ML中一般称为标签(label)。这里房子的价格是一个连续值,也就是说房子的价格可以在之间变化,取值连续,这个和LR是不同的。因此,预测房子的价格可以看成是一个线性回归的过程,怎么样进行,起背后的朴素思想是:房子的价格受多个因素的影响,并且每个因素对房子的价格影响不同,那么房子的价格应该是这些个因素(fearture)的加权和。 这个就是线性回归背后的朴素思想,这个思想对LR也是使用的,只是LR的label做了很多变换而已。可以用数学公式表达如下:
其中y是房子的价格(label);x1,x2等是房子的feature,比如面积、地段等;w1,w2等是每个feature的权重,w0是调节参数。接下来如果知道了w0,w1,w2等参数的具体值,那么对一个即将出售的房子,就可预测它的价格了,问题就变成了如何求这些参数的值。这个就需要一些数学知识了。
房子的feature一般一个向量来表示
其中X(1)表示一个样本,就是需要预测价格的房子,{x1_1 , x1_2 ,...}就是这个样本对应的feature,比如面积、地段等。房子的价格用一个标量来表示
Y(1)表示样本X(1)对应的价格。对参数的估计需要借助过去房屋的销售记录,来对这些数据进行拟合。为表述方便,假设房子的feature只有一个,房子的面积x1,对应的权重为w1。下表是若干个房子销售价格记录表
可以看到,随着房子面积的变化,价格也在变化。在二维平面上描绘出这些点,如下
线性回归就是找到一条直线,来拟合这写点。找到的这条直线,就是以房子面的权重w1为参数的直线,即
图中红色直线的方程为
参数w1的具体值怎么算呢?再从一直直观的角度解释。根据房子销售记录中的数据,拟合一条直线,其实是说找一条直线,是得所有的点都在这条直线上,当预测一个房子的价格时,只需要找到房子面积在直线上对应的纵坐标就可以了,这个时候直线的参数也容易求解(计算一个斜率,再找一个点就可以解决了)。 但是,这个在实际中是非常困难的,因为房子的价格具有波动性,并不会严格的坐落在一条直线上,而是在直线附近分布,如上图。此时,需要降低对待求解直线的要求:不需要所以的点都在直线上,只要所有的点都尽可能的接近直线就可以。
比如上图中,红色的直线要比黑色的直线拟合效果好,因为数据点尽可能地在红色线的上下波动。这个想法用数学语言来表示就是:找一条直线,使得所以数据点到这条直线的距离之和最小。从上图也可以看到绿色的数据点到红色直线的距离之和要明显小于黑色直线,所以在拟合程度上,红色直线要好一些。进一步把这个想法有数学语言转化为数学公式,如下:
其中,f(xi)=w0+w1*x1。这里使用了一个替换,即将
替换的主要目的是因为绝对值号在计算中比较难处理,替换为平方号之后,寻找直线时就从寻找距离之和最小变成寻找距离平方之和最小,由于距离是正值,所以二者在表达直线拟合数据点的重合程度上是一直的。
如何求解上述公式,涉及到求导、梯度下降等优化算法,这里不做赘述,详细可以参见相关博客[1]。
2.逻辑回归
逻辑回归与线性回归,从表面上看,区别在于:逻辑回归的label是离散的实数(比如0,1),而线性回归的label是连续的实数。这个不同直接导致了二者在公式形式上的差别,但是它们背后的思想是一致的:都是使用feature的加权和来预测label的值,而逻辑回归做了很多变形,使得直接预测的label以及公式的形式与线性回归大不相同。之所以这样,是因为数学上的一些计算需要,但是依然可以找到起背后的直观解释。接下来分三部分来解释逻辑回归。
1.线性回归label随feature变化而变化的情况
线性回归的公式
y=w0+w1*x1+w2*x2
上式中,在系数w0,w1,w2固定的情况下,当x1,x2连续变化时,y的值也是连续变化的。
2.逻辑回归的训练集是如何得到的
现在考察这样一个问题:用来训练逻辑回归模型的的样本是如何得到的?假设训练样本集是D={(x1,y1=1),(x2,y2=1),(x3,y3=0),(x4,y4=1),(x5,y5=0)...},可以看到label都是离散的,非0即1。这个训练集D是我们已知的数据,可以说是后验得到的。假如现在有一个分类器,输入数据xi,得到yi,yi可能是0或者1,当输入x1,x2,x3,x4,x5后,得到的label是1,1,0,1,0,有时候是1,有时候是0,无法预知,带有一定的随机性,这可以理解为:分类器每次输出输出结果可能为1,也可能为0,带有概率性。训练集就是在无法预知输出结果的情况下,抓来一群数据,输入到分类的得到的分类结果集合。根据这个结果集合,对分类器的输出结果进行建模。
由于分类器每次的分类结果带有一定的概率行,所以,在对分类进行建模是,每一次的输出结果可以从概率的角度来解释:分类器的输出实际上是个连续的概率值p,这个值在[0,1]之间变化,而每次我们看到的离散值0和1,其实是对这个p做了的一次判断得到的,比如若p>0.5,则判断这个输入数据为1,否则为0。这样,分类器的输出就是我们看到的0和1了。
更近一步讲,设"我们看到输出结果为1"为事件A,则我们可以将分类器输出的连续概率值p看做是事件A的概率,如果这个概率p>0.5,则事件A发生,否则事件A的对立事件发生,即我们看到的输出为0。
3.逻辑回归如何实现从离散值到连续值的转变
如果直接对我们看到的label建模,使用类似线性回归的形式,则等式左边是离散的,而等式的右边是变化的,根本不可能相等,这个方法是行不通的。
接下来,可以看考虑对我们看不见的那个输出,即分类输出的连续概率值进行建模,即
p = w0 + w1*x1 + w2*x2 + ...
这种情况下,虽然等式两边都是连续的,但是变化范围不同,p从0到1变化,而右边的式子可以从正无穷变化到负无穷,并且,这个概率值我们根本看不到,也不能解析的写出它的表达式,所以这个方法也不可行。
4.逻辑回归的数学推到