cs229 斯坦福机器学习笔记(一)-- 入门与LR模型
前言
说到机器学习领域时,斯坦福大学Andrew Ng教授开设的CS229课程被视为经典的入门教材。该课程提供了高质量的教学视频(http://v.163.com/special/opencourse/machinelearning.html)以及配套教材(http://cs229.stanford.edu/materials.html)。然而,“好”的教材并不一定意味着“容易入门”的教材。“机器学习”系列课程(https://www.coursera.org/course/ml)则更适合初学者使用。该课程提供了丰富的学习资源:教学视频、复习问题集以及编程练习题库。虽然视频中缺乏中文字幕(如果当初课堂上有这样的便利性...),但通过仔细阅读讲义仍能较好地理解课程内容。“编程练习题库”是该课程的核心部分:只有深入理解相关概念才能完成高质量的练习题(简单操作题型无法满足需求)。需要注意的是,“Coursera”系列课程对一些较为复杂的内容进行了屏蔽处理(如果觉得学习体验还不够丰富...),这时候不妨再回来看看CS229的经典教材。这篇笔记主要参考了CS229的教学内容,并穿插了一些Coursera上的精华知识点
接触完机器学习后会发现有两门课程非常重要。其中一门是概率统计学,另一门则是线性代数学。因为机器学习所使用的数据可以视为概率统计学中的样本,而当进行机器学习建模后,则会发现剩下的问题属于线性代数求解范畴。
关于学习资料方面而言,在周志华最新出版的《机器学习》西瓜书中可以获得系统全面的知识!过去的时候我推荐《机器学习实战》,它能够帮助你解决如何在实际中应用机器学习的问题!李航的《统计学习方法》则更适合作为参考资料快速浏览!对于cs229课程来说,在课程笔记之外还有会面手稿(堪称雪中送炭般的贴心资源),还有课后练习题集(夏天送风扇般的实用资料),这些都是非常值得深入研究的好材料!
线性回归 linear regression
在现实生活中选取具体案例有助于理解线性回归模型。例如某天一位平日里不起眼的同事提到他买了一套房大家普遍关注的因素包括房子的位置、所处的小区以及单价等信息这些都是对于机器学习模型来说具有重要价值的关键数据(在机器学习领域被称作'feature')。假如你是房地产中介 tasked with estimating house prices那么当你没有任何关于房价背景知识的人来说(例如刚到非洲的一位买家)你需要依靠同区域其他房屋的价格作为参考依据如果找不到相关数据可以考虑查询邻近区域的价格如果仍然找不到则可以参考所在区的平均房价最后如果没有其他参考信息则只能依赖所在城市整体市场价格水平作为估价依据因为不同城市的房价差异较大(比如北京和杭州的一套房价格差距明显)。此外在估价过程中尽可能提供详细的信息是有必要的因为这将直接影响估价结果比如知道房屋朝向了解装修状况以及位置特征(靠近马路还是社区中心区)都会对最终价格产生显著影响
其实我们人脑在估算的过程,就类似一个“机器学习”的过程。
首先我们需要"训练样本"(即相关的人家房价数据),当然数量太少是不行的"——我们需要尽可能地收集各种类型的样本数据才能进行有效的学习与预测建模。通过这些样本数据"人脑能够学习出"一个大致反映市场行情的大致情况:同一区域内的同一户型住宅其价格通常会保持在一个相对稳定范围内(因为它们拥有的特征属性非常相似;而其目标值——房价同样也会呈现出相似的变化范围)。我们知道房地产价格通常是以平方米为单位来计算的"——而这种计算方式与房价之间的关系大致呈现线性关系:也就是说,在其他条件相同的情况下"每增加一平方米的价格大约会增加固定金额的价值"这一现象可以通过统计模型来准确描述并加以验证。
而"训练数据"中包含哪些信息?仅凭一张房子照片是不够的。必须要有具体的小区位置、房屋面积等关键属性作为支撑数据来源。
c) 通常,在进行人肉估算时会较为随意自由, 大致估计一个大致范围, 并不涉及过多的小数位数; 而正式的估算则会基于现有数据, 以确保估算结果与"训练数据"的高度一致(后续我们将探讨如何通过最小化损失函数来优化模型)。 计算机系统擅长精确的数值运算, 因此可以通过数学方法将房价预测问题建模解决(即将这一过程进行数学抽象)。 这里的人肉估算是一个具体实例, 我们将其提升至数学层面即为"线性回归"技术的基础概念。
1.我们定义线性回归函数(linear regression)为:

然后用h(x) 来预测y
最简单的一个实例,在一维空间中考虑一个特征维度y代表Price(即价格),将训练数据绘制在图表中(如图所示)。为了便于理解问题的本质,在一维空间中表现为一条直线;而当特征存在于多维空间时,则表现为一个超平面。

面临一个问题:当真实模型并非线性时该如何应对?因此,在应用线性回归时必须预先判断其适用场景与限制条件。无需过分纠结于这个问题,在后续内容中将介绍如何通过数据预处理来解决非线性问题。
我们的目标在于找到一条直线尽可能地接近这些数据点,并通过数学表达式的形式最小化cost函数

为什么选择平方和作为损失函数?尽管直接取绝对值虽然可行但在实际应用中存在局限性。例如在回归问题中我们通常采用平方误差的原因在于它能够通过数学优化的方法找到全局最优解而不仅仅是局部最优解。另外一种思考方式是从概率论的角度出发假设预测值服从正态分布那么使用均方误差损失函数可以使得模型具有良好的统计性质从而便于参数估计。然而需要注意的是均方误差与绝对误差在某些情况下表现有所不同特别是当数据分布呈现长尾特征时两者可能会导致不同的模型拟合效果在这种情况下平方误差由于其平滑性和可微性的特点通常会被优先选择因为它能够提供更为稳定可靠的优化过程同时也能更好地反映数据的整体分布情况
3 接下来是如何解答的问题呢?假设h(x)等于y时,则类似于初中的多元一次方程组问题。不过目前并非如此情况,则需要采取更高级的办法来解决这个问题。
之前在教科书中也简要介绍了如何求解回归方程的方法,并且通常都是通过计算的方式来实现这一过程。
因此我认为自己在这方面并没有留下太多的印象痕迹,
或许是因为这段时间过于专注于其他问题的缘故吧。
不过回想起来似乎并没有发生什么大的变化,
可能是自己记性不太好吧。
notes 1里面介绍3种方法
1.gradient descent (梯度下降)
a.batch gradient descent
b.stochastic gradient descent (上面的变形)
2.the normal equations
3.Newton method(Fisher scoring)
1.gradient descent algorithm

α is called the learning rate.
只有一个训练数据的例子:


从直观上来看这个式子也比较容易理解,在数学推导中我们假设xj为正值的情况:即当输出值y大于预测值h(x)时,则需要增大θ以减少损失函数J的值;因此,在这种情况下α前面的符号为正号(类似地),如果xj为负值时,则相反的情况成立)
举例说明只是一个辅助手段以便于理解;在实际情况中通常会存在多组数据;能够感受到矩阵带来的便利。
上面的式子在具体更新的时候有小的不同
方法 a.batch gradient descent
特别注意,在同步调整过程中,请确保每一步骤都准确无误地执行:在调整θ(j+1)的时候,请使用当前计算出的hθ(x),而这里的hθ(x)依然基于初始值到当前值的所有参数进行计算。


从直观上来看,在二维空间中绘制出不同cost value对应的曲线即为等高线;横轴和纵轴分别对应θ₁和θ₂这两个参数;而梯度下降的过程就是每次沿垂直于等高线方向移动一小步朝向更低数值的位置(位于图中心)。显然在选择步长时需要格外小心,在某些情况下如果步伐过大可能会导致错误的结果(例如跨越一步后反而到达更高数值的位置)。
方法 b.stochastic gradient descent (also incremental gradient descent)

这两种方法看公式可能不好理解,看后面的代码实现就容易区分。
2.the normal equations。
初学者可以先跳过推导过程(不是鼓励不看。),直接先记住结论

。(在线性代数的复习课件cs229-linalg会说明,这个式子其实是把y投影到X)
3.牛顿法
Another algorithm for maximizing ℓ(θ)
In the context of logistic regression, where g(z) represents the sigmoid function, we will delve into an alternative approach aimed at minimizing −ℓ(θ).
牛顿法求函数0点,即 f (Θ) = 0


这样迭代就行,f′(θ)是斜率,从图上看,就是“用三角形去拟合曲线,找0点”
因为我们是要求导数等于0,把上面的式子替换一下f(θ) = ℓ′(θ)

θ是多维的,有

where

By applying Newton’s method to optimize the logistic regression log likelihood function ℓ(θ), the resulting technique is also referred to as Fisher scoring.
Coursera的课程材料包含其他方法,大概初学者没有深入研究的时间和精力,满足需求的话就不错了。

逻辑回归logistic regression
现在如果有一个0和1的2分类问题的,套进去线性回归去解,如下图

离群点会对结果产生显著影响,在图中(例如,在h(x) > 0.5时我们将其预测为y=1)可以看到这一现象:一个异常值导致拟合直线发生显著变化,并将许多原本应正确分类的数据点错误归类。值得注意的是,在在线课程中仅提到了这一原因(尽管还有更多因素需要考虑),还有一个问题是:从直观上看h(x)取值超出[0,1]区间是没有实际意义的——因为已知y只能取到{0,1}中的值。(那h(x)在[0,1]区间内又代表什么呢?确实值得深思啊)

换成这个曲线就好多了,这个函数是sigmoid function

g(z) 值域 (0,1)
把线性回归套进去g(z)就是

为何采用sigmoid函数?是否可以考虑其他具有类似形状的函数?值得注意的是,在该模型中,输出值表示“y等于1的概率”。回顾之前设定,在二分类任务中,y通常用1和0表示类别标签(在SVM中则采用+1和-1表示)。从直观上来看,在sigmoid函数的作用下,“当输入值越大时”,输出越接近于“1”,而当输入值越小时,则输出越接近于“0”。此外,在计算似然函数时(likelihood),该形式也有助于简化计算过程。
建模效果不错的话,请问是否还需要补充一个成本函数?请问这个成本函数是否基于均方误差的方法?

实际情况下,在引入sigmoid函数后,这个损失函数不再是凸函数形式 anymore, 因此无法直接应用传统的优化算法来进行求解。然而, 实际上h(x)与y之间的差值计算结果是一个概率值, 将多个训练样本的概率值直接相加是没有实际意义的, 而应当将它们相乘以反映联合概率关系。因此, 概率模型中我们通常采用p(y|x) = p(x) * p(y|x)的形式来表示条件概率关系。
先讲一个useful property

推导公式时可以用, 习题也会用到的
把两个概率公式合到一起

=>

likelihood of the parameters:

log likelihood:

一个训练数据的时候(代入前面的结论

)

注意,前面linear regression,我们求cost function的最小值,所以是减号

在logistic回归中, 我们希望最大化似然函数的最大值(如附录所述, 这与线性回归模型相同), 因此采用加法运算符以保持一致性. 其迭代公式与线性回归模型相同, 这纯属巧合吗?不禁怀疑其中是否存在某种联系.

machine learning in practice
我总是觉得计算机科学重视动手实践的重要性,在纸上谈兵并不能真正掌握知识。Coursera平台上有编程练习题并建议用户尽快完成这些题目以巩固学习成果。Octave运行起来非常顺畅让人感到很愉快。这里记录了一些关键知识点以便以后复习参考
1.coursera的cost function多除了一个m
本质上实现了数据归一化处理的效果,并使得迭代步长α不受训练样本数量的影响(例如取α=α’/m)

2.batch gradient descent和stochastic gradient descent的差别
batch gradient descent
for iter = 1:num_iters
A = ( X * theta - y )';
theta = theta - 1/m * alpha * ( A * X )';
end
stochastic gradient descent
for iter = 1:num_iters
A = ( X * theta - y )';
for j = 1:m
theta = theta - alpha * ( A(1, j) * X(j, :) )';
end
end
基于ex1_multi.m进行调整后,绘制了两个成本下降曲线图.可以看出,随机梯度下降算法在性能上表现出显著的优势.


3.feature scaling的作用是啥?
在coursera中所提及的作用体现在加快收敛速度上。这会对最终的结果产生什么影响呢?从直观上看,在计算成本函数时确实会占据优势地位——将某一特定特征放大十倍后,在优化过程中可能会导致权重向该特征方向倾斜的现象较为明显
对这种问题来说吧,数学家会有进行理论分析的方法,在工程领域里人们通常会通过实证研究来验证他们的假设。而我呢,则是先进行初步分析得出大致结论后再通过实际操作来检验自己的想法是否正确。
(下面都是粗略的想法)设想每个样本的feature j放大10倍,则计算得到的θj再除以10后的结果与原始值相同;我认为这样做并不会改变最终的结果。观察我们迭代过程中的公式变化就可以看出这一现象。

xj值增大时会带动h(x)也随之上升,在特征缩放的过程中通常需要将粗略估计的迭代步长放大十倍(这有助于抑制θ的变化)。然而最终我们希望θ能够降至十分之一水平即为目标状态但目前这种策略并不足以实现这一目标因为按照这种策略经过九十九次迭代后我们依然停留在初始值的一处而要想让最终结果精确降至零点一就需要对学习率α进行相应调整。
尝试对ex1.m进行修改,并执行实验操作。经过测试发现,在对某个特征进行缩放时会出现收敛问题。仅当将该系数乘以2时就会导致代码输出NaN的结果。将alpha值平方处理为α²。


观察到等高线变得愈发密集, 椭圆形呈现出显著的扁平趋势, 因此步长不宜过大, 收敛过程较为棘手, 模型呈现的是在近似直线方向上来回摆动并渐趋缓慢的状态。关于结果是否会发生变化, 我们可以采用正规方程法进行验证, 因为梯度下降方法在此情形下面临诸多挑战。建议对ex1_muliti.m进行相应调整。
X2 = X;
X2(:,2) = X2(:, 2)* 2;
theta2 = pinv(X2' * X2) * X2' * y;
theta2
theta
theta2(2)就是神奇地变1/2了。。
theta2 =
9598e+004
9605e+001
-8.7380e+003
theta =
9598e+004
3921e+002
-8.7380e+003
前面是linear regression,对logistic regression可以改ex2.m也验证下
X2(:,2)= X2(:,2)*2;
[theta2, cost] = fminunc(@(t)(costFunction(t, X2, y)), initial_theta, options);
theta2
theta:
-25.161272
0.206233
0.201470
theta2 =
-25.16127
0.10312
0.20147
附录
cost function的概率解释
我们知道h(x)和真实的y是有偏差的,设偏差是ε

我们假定误差项ε遵循独立同分布(independent and identically distributed, iid),服从高斯分布(通常这一假设有其合理性)。考虑到高斯分布在数学上的表达式中包含平方项的存在并非令人费解。

得到

likelihood function:


解决方法:将问题转化为ℓ(θ)(这是一个非常基础的技巧,在后续内容中会频繁使用到):


To summarize: Under the previous probabilistic assumptions on the data,
The least-squares regression is equivalent to determining the maximum likelihood estimate of θ.
接下来阅读 cs229 课程的斯坦福机器学习笔记(第二部分),重点了解逻辑回归回顾以及支持向量机算法的基本思想
