Data Science + Machine Learning Note 1: Classification with Linear Regression and Logistic Regression

这学期开了数据科学课,很开心。我校信管还是有点跟上时代,不至于跟着整个老旧专业的没落而没落,而是有转型打算的嘛。听c老师说甚至学院开会打算把整个专业改名,安上「大数据」,但后来发现如此的话教学内容也要大改而师资不够。说白了就是学院里边很多老师还是太软了,技术不大行,教不了硬的。

这课两周内把前四章基础的东西讲完了,数据导入和简单数据预处理之类的,比我想象中快,我还比较期待后面能学到新东西。

第五章开了个头,讲的是「选择和评价模型」,大抵是介绍机器学习中的常用模型,分清遇到不同数据分析需求时适用的模型。令我失望的是,真的真的只是讲了一下模型的种类,告诉你模型可以用来做什么,连一点点原理都没有涉及。我希望今天把课程所学温习,把上学期的实践课学到的机器学习原理整合进知识框架里,顺道把之前的笔记好好整理一下。如果合适的话,再发个公众号文章也不错(心心念念的广告费)。

不同于ml角度,把机器学习模型分为监督学习和无监督学习;ds是从业务问题的角度出发,把模型分为分类、打分、概率、排名、聚类等。我显然更喜欢前者的分类,相比较之下后者的分法互相交叉,令人迷惑。

但我今天还是按照ds的分类来整理一下把。

分类问题 Classification

分类问题决定如何为对象分配(已知的)标签 。分类问题属于监督学习,即训练模型时需要数据已经被分类好了。监督(Supervised)本质上说的就是正确答案已知(right answer given),比如训练模型去学习猫狗图片分类时,每张图片已经事先被打上了「猫猫」或者「狗狗」的标签。模型拿到一张图片,给出自己的判断,再查看标准答案,得知自己答对了没有;然后不断修正自己,直到达到令人满意的准确率。这种数据标签都是人工打的,说起来L老师还提起过这甚至催生了一个新兴职业来着,叫「数据标注员」,还挺赚钱?

分类问题的常用算法,ds课上介绍了朴素贝叶斯、决策树、逻辑斯谛回归和支持向量机。我很遗憾的是这里介绍的几种算法都比较基础,并且不知道为什么似乎甚至不打算提及神经网络的样子……朴素贝叶斯、决策树和逻辑回归都是比较简易的模型,支持向量机虽然很深,但l老师说它是上个世纪的经典,现在已经逐渐过时,被很多算法给取代了……不过从应用角度来说,我们本科生处理处理小规模数据,用简单算法可能比神经网络效果好多了,学这些先入个门也挺合适把。

(都是适合比较简单的任务,高级的还是神经网络给力)

  1. 朴素贝叶斯很简单,所以适合处理比较多的变量;尤其在应用中发现它很适合文本分类。但是现在深度学习领域的自然语言处理不是靠谱多了……另一方面,朴素贝叶斯成立有一个必须的假设:各输入变量是相互独立的——这很限制它的靠谱性。
  2. 决策树就比较适合输入变量之间有相关性的情况,它的分类逻辑是一层一层的。
  3. 逻辑回归是可以输出概率值的。
  4. 支持向量机是上世纪的经典,能解决比较复杂的问题;但是巧了,神经网络也很适合解决这类问题,而且效果更好……

好了现在把脑子切换到ml频道,我想整理一下逻辑回归的算法原理。

然而线性回归是逻辑回归的基础,所以我需要先整理一下线性回归的原理orz。

线性回归Linear Regression

线性回归很好理解,输入的是对象的一系列特征值x1、x2、x3……,输出则是需要预测的变量y。比如经典的房价预测问题,输入某地的一些特征值(比如犯罪率啊、住宅数啊、人均收入啊等等),输出预测的该地房价\(h_θ(x)\)。公式表示起来是这样:

\[h_θ(x)=θ_0+θ_1x_1+θ_2x_2+...\]

刚开始非常迷惑我的是已知量未知量的问题。在训练的时候,输入值\(x_1\$、\)x_2$和输出值y都是已知量,而参数\(θ_0\$、\)θ_1$、$θ_2$……才是未知量,机器的根本任务就是拟合出合适的θ值;而在模型投入使用的时候,θ的值已经敲定了,我们拿输入的一堆x来预测未知的y。

接下来精彩的来了:模型怎样才能有方向地优化它的参数θ呢?这里所发生的事情实在很巧妙。

要实现模型优化,需要依次解决两个问题:

  1. 建模误差:反映模型所预测的值与训练集中实际值之间的差距
  2. 自动优化:自动找出让误差更小的参数取值

1. 用代价函数来建模误差Cost Function

这个其实很容易想到。预测值和真实值之间的差即为误差,那所有的这些差的平均值就能表示整个模型的误差水平了。

假如图中黑色直线就是我们拟合出来的线,直线上的每一个点,意味着在x取相应值时,y即为预测值;而同一横坐标的红色叉叉对应的y表示真实值。那么每一条蓝色线段即为一次预测的误差,所有蓝色线段长度加起来再除以总数就可以表示整个线的误差程度了。

当然,预测值与真实值的差可正可负,要全部加起来需要取绝对值;为了方便后续的计算,这里在定义代价函数的时候取了平方。代价函数的定义出来了:

\[J \left( \theta_0, \theta_1 \right) = \frac{1}{2m}\sum\limits_{i=1}^m \left( h_{\theta}(x^{(i)})-y^{(i)} \right)^{2}\]

(呃……本来除以训练个数m就够了,前面这个2是哪冒出来的?现在只好说是未卜先知,这个2是为了方便下一步的计算。)

好!有了代价函数来表示误差水平,那么模型接下来要做的事情就可以量化了:选取合适的参数θ,使代价函数值最小。

2. 用梯度下降算法来优化参数Gradient Descent

怎么说呢,在我对机器学习肤浅的掌握中,我认为最精妙在于神经网络;其次就在于这里的梯度下降算法了。谁能想到一个不怎么起眼的数学原理,可以应用于这么巧妙的地方,促进回归乃至神经网络的实现,奠定如今一整个蓬勃发展的ml领域的基础。(……我可能太扯了)

说回我们的目标,要取代价函数的最小值。函数的最值问题,这很容易让人联想到——导数。

假如代价函数是如图所示的抛物线形状(事实上单变量线性回归的代价函数确实总会是这样的形状),横坐标代表不同的θ取值,纵坐标是代价函数J(θ)。曲线的底部正是J(θ)的最小值,在这一点导数为0。

一个容易被忽视的现象来了:在最低点右边,导数值总为正(导数的几何意义就是切线斜率);在最低点左边,导数值总为负。而且更仔细想一想,越接近低谷,曲线越平缓,斜率的绝对值越小,导数值也越小;反之越远则导数值越大。

那么,如果对θ进行迭代,总是让当前的θ值减去它对应点的导数值,会发生什么?答案是θ值会越来越接近最优值!在最低点右边的θ会减去一个正数,从而向左移动;在左边的θ会减去一个负数,从而向右移动。离得远的点会减去一个更大的数,从而蹭蹭靠近;离得近的点会减去一个很小的数,从而缓缓趋近。如下图:

那么梯度下降的迭代公式即是:

\[{\theta_{j}}:={\theta_{j}}-\alpha \frac{\partial }{\partial {\theta_{j}}}J\left( \theta \right)\]

其中的\(\frac{\partial }{\partial {\theta_{j}}}J\left( \theta \right)\)即为代价函数对\(\theta_j\)的偏导数,α则是学习率,用来调节每次下降的步伐。

至此,我们已经搞明白了线性回归时,参数自动优化的原理。真正实现线性回归,只需要利用梯度下降算法,不断优化参数θ。具体一点来讲,只需要将代价函数的偏导数求解出来,代入梯度下降公式,所得即是最终的算法。如下:

\[ \begin{align} &Repeat\{\\ &{\theta_{0} }:={\theta_{0} }-a\frac{1}{m}\sum\limits_{i=1}^{m}{\left({h_{\theta} }({ {x}^{(i)} })-{ {y}^{(i)} }\right)}\\ &{\theta_{1} }:={\theta_{1} }-a\frac{1}{m}\sum\limits_{i=1}^{m}{\left(\left({h_{\theta } }({ {x}^{(i)} })-{ {y}^{(i)} }\right)\cdot { {x}^{(i)} }\right)}\\ &......\\ &\} \end{align} \]

逻辑回归Logistic Regression

逻辑回归跟线性回归的输入是一样的,即对象的一系列特征值;而输出的是0或1,代表将对象分为两种类型。比如经典的垃圾邮件分类问题,可以将垃圾邮件的特征值(比如文本长短啊、发件邮箱地址啊之类的,我也不知道具体是啥)输入,模型就会给出预测,1代表是垃圾邮件,0代表不是。

逻辑回归看起来比线性回归简单,只能预测出0、1两个分类,而后者能预测出一整个连续型数值,很厉害的样子。然而事实上,逻辑回归只是在线性回归的结果上加了一个sigmoid函数,暴力让结果泾渭分明。sigmoid函数是这个:

\[g\left( z \right)=\frac{1}{1+{ {e}^{-z} } }\]

它长这样:

其中自变量z是线性回归的输出结果,值的大小表明对象跟某类的相似程度。比如说,想预测一封邮件是否垃圾邮件,z=999,就是说:这也太太太太太像一封垃圾邮件了;反之z=-999,就是说:这一点点点点也不像垃圾邮件。这么说的话,sigmoid函数的作用仿佛就显现了:它就是把取值范围很跳脱的z值,转换成一个(0,1)间的值,正好可以表示概率。极小的z值对应的概率趋于0,极大的z值对应的概率趋于1。

那么,逻辑回归的公式可以这么表示:

\[h_θ(x)=\frac{1}{1+e^{-θ^Tx}}=P\{y=1|x;θ\}\]

其中前一个式子中,e的指数$​​θ^Tx​​$即是线性回归的输出,也就是上面说的自变量z。后一个式子是指在参数为θ,输入为x时,y=1的概率。

这样的话输出的值仍然是一些诸如0.2、0.4、0.8这样的概率,为了让结果更明确,这里只需要再进行一个简单的判决,大于0.5的判为1,小于0.5的判为0。(这里我理解了很久为什么如此粗暴且似乎没有必要,后来想明白经手sigmoid函数的值往往不是很趋近0就是很趋近1,直接判定为0、1是可以比较笃定的。)

……天哪,写这个也太繁琐了。我其实真正想整理的是神经网络部分的笔记,不知道还有没有足够的意愿了。