分类(Classification)与回归都属于监督学习,两者的唯一区别在于,前者要预测的输出变量\(y\)只能取离散值,而后者的输出变量是连续的。这些离散的输出变量在分类问题中通常称之为标签(Label)。
线性回归的策略同样也适用于分类吗?答案是否定的。下面结合例子简要说明理由。假设我们现在的任务是根据肿瘤大小判断是否为良性肿瘤,答案当然只有yes或no。我们用\(y=1\)表示良性肿瘤,用\(y=0\)表示恶性肿瘤。当然,如果你想用其他两个不同的值分别对应这两类肿瘤也是可以的。在下图所示的例子中,我们都使用线性回归的方式进行分类。在左图中,如果样本对应的输出值小于\(0.5\),我们视其为恶性肿瘤,否则为良性肿瘤,分类效果还不错;在右图中,良性肿瘤的大小范围变广了一些,线性模型要发生偏转,如果仍然用\(0.5\)作为分类的阈值(Threshold),误分类的样本所占比例就不少了。另外一方面,该分类问题中\(y\)只能取0或1两种值,而线性模型预测的值去可以远大于1或远小于0,极大地偏离输出变量的值。因此,我们认为用线性回归解决分类问题是不明智的。
接下来,我们以二分类为基础展开讨论。样本标签\(y\in\{0,1\}\),标签为1的样本称为正样本(Positive Samples),标签为0的样本称为负样本(Negative Samples)。我们希望假设函数\(h_\theta(x)\in[0,1]\),选用logistic函数。下图为logistic函数曲线图,定义域为\((-\infty,+\infty)\),在整个定义域上都连续可导,其一阶偏导如下:
\begin{align}g'(z)&=\frac{d}{dz}\frac{1}{1+e^{-z}}\\&=-\frac{1}{(1+e^{-z})^2}\cdot \frac{d(1+e^{-z})}{dz}\\&=\frac{e^{-z}}{(1+e^{-z})^2}\\&=\frac{1}{1+e^{-z}}\cdot\left(1-\frac{1}{1+e^{-z}}\right)\\&=g(z)(1-g(z))\end{align}
我们的假设函数形式如下:
\begin{equation}h_\theta(x)=g(\theta^Tx)=\frac{1}{1+\exp(-\theta^Tx)}\end{equation}
假设分类问题中的后验概率(posterior probability)形式如下:
\begin{equation}P(y=1|x;\theta)=h_\theta(x)\end{equation}
\begin{equation}P(y=0|x;\theta)=1-h_\theta(x)\end{equation}
综合公式(7)和公式(8),用更紧凑的形式表述:
\begin{equation}P(y|x;\theta)=h_\theta(x)^y(1-h_\theta(x))^{1-y}\end{equation}
假设所有样本相互独立,则似然函数为:\begin{align}L(\theta)&=P(\vec{y}|X;\theta)\\&=\prod_{i=1}^mP(y^{(i)}|x^{(i)};\theta)\\&=\prod_{i=1}^m(h_\theta(x^{(i)})^{y^{(i)}}(1-h_\theta(x^{(i)}))^{1-y^{(i)}}\end{align}
将公式(13)转换为对数似然函数的形式:
\begin{equation}\ell(\theta)=\log L(\theta)=\sum_{i=1}^m y^{(i)}\log h_\theta(x^{(i)})+(1-y^{(i)})\log(1-h_\theta(x^{(i)}))\end{equation}
对数似然函数\(\ell(\theta)\)对参数\(\theta\)求导:
\begin{equation}
\begin{array}{ll}
&\quad\frac{\partial\ell(\theta)}{\partial \theta_i}\\
&=\sum_{j=1}^m\left(y^{(j)}\frac{1}{g(\theta^Tx^{(j)})}-(1-y^{(j)})\frac{1}{1-g(\theta^Tx^{(j)})}\right)\\
&\quad\cdot\frac{\partial}{\partial\theta_i}g(\theta^Tx^{(j)})\\
&=\sum_{j=1}^m\left(y^{(j)}\frac{1}{g(\theta^Tx^{(j)})}-(1-y^{(j)})\frac{1}{1-g(\theta^Tx^{(j)})}\right)\\
&\quad\cdot g(\theta^Tx^{(j)})(1-g(\theta^Tx^{(j)}))\frac{\partial}{\partial\theta_i}\theta^Tx^{(j)}\\
&=\sum_{j=1}^m\left(y^{(j)}(1-g(\theta^Tx^{(j)})-(1-y^{(j)})g(\theta^Tx^{(j)})\right)x_i^{(j)}\\ &=\sum_{j=1}^m(y^{(j)}-h_\theta(x^{(j)}))x_i^{(j)}
\end{array}
\end{equation}
最后,我们可以采用梯度上升(Gradient Ascend)的策略迭代更新参数\(\theta\),以使对数似然函数收敛到最大值,更新规则如下:
\begin{equation}\theta_i=\theta_i+\alpha\sum_{j=1}^m(y^{(j)}-h_\theta(x^{(j)}))x_i^{(j)}\end{equation}
我在数据集 ionosphere 上做了实验, 实验代码在这里下载 。该数据集一共有351个样本,每个样本有35个属性,其中第35个属性为'b'或'g'(表示bad或good),是一个二分类问题。我将整个数据集抽取7成作为训练集,剩下的作为测试集,最终得到的正确率为\(91.509\%\)。代码中有两点要说明:1)代码中实际上还考虑了对参数\(\theta\)正则化处理,避免某些参数过大,我们将LGClassifier.m中的lambda设置为0即可屏蔽正则项,在lambda=0.1时,正确率是会有提升的;2)本文中的目标函数是求使似然函数最大的参数,但是我们利用的LBFGS工具包只针对使目标函数最小的优化,我们只需要在文中的目标函数前面添加负号即可将最大化问题等价转化为最小化问题;最后,在针对参数\(\theta\)求倒数的时候,也需要在前面添加负号。