5.6 采用逻辑回归
与它的名字相反,逻辑回归是一种分类方法。当它处理基于文本的分类任务时,功能非常强大。在处理任务时它首先会用一个逻辑函数来进行回归,这也是这个名字的由来。
5.6.1 一点数学和一个小例子
为了对逻辑回归的工作方式有一个初步的理解,让我们先看看下面这个例子。我们在x 轴上画出了一组人工构造的特征值 ,以及它们对应的类别(0或1)。正如我们所看到的,数据中有很多噪声,使得在1到6的特征值 区间上,类别有很多重叠。因此,不直接对离散类别建模,而是得到特征值属于类别1的概率P (X ),会更好一些。一旦有了这样一个模型,我们就可以进行预测,当P (X )>0.5的时候样本属于类别1,在其他情况下属于类别0。
从数学上来说,对一个有有限区间的事物建模总是有些困难,就像本例里面我们的离散标签0和1。然而,我们可以对概率进行一点调整,使得它们总是在0到1之间。为此,我们需要使用让步比(odds ratio),以及它的对数。
我们假设一下,一个特征有0.9的概率属于类别1,也就是,P (y =1)=0.9,那么让步比就是P (y =1)⁄(P (y =0)=0.9⁄0.1=9。也就是说,这个特征映射到类别1的机会是9:1。如果P (y =0.5),那么这个样本属于类别1的机会将是1:1。让步比以0为下界,但没有上限,可以达到无限大(下图中的左图)。如果对它取对数,我们就可以把所有0到1之间的概率映射到负无穷到正无穷的整个区间上(下图中的右图)。这种方式最好的一点就是,我们仍然保持着这样一个关系:更高的概率对应于更高的让步比对数——这不再限于0或1了。
这意味着我们现在可以把特征的线性组合(是的,我们现在只有一个特征和一个常量,但马上就会有更多)拟合成log(odds)。让我们考虑一下第1章中的线性等式,如下所示:
它可以用如下等式替换(用p 来替换y ):
我们可以从等式中求解Pi ,如下式所示:
我们可以找到适当的系数,使得上述式子在所有数据对(xi ,pi )中能给出最低的误差。这个可以用scikit-learn实现。
将数据拟合到类别标签之后,这个公式对每一个新数据点x 都可以给出x 属于类别1的概率。参考如下代码:
>>> from sklearn.linear_model import LogisticRegression >>> clf = LogisticRegression() >>> print(clf) LogisticRegression(C=1.0, class_weight=None, dual=False, fit_ intercept=True, intercept_scaling=1, penalty=l2, tol=0.0001) >>> clf.fit(X, y) >>> print(np.exp(clf.intercept_), np.exp(clf.coef_.ravel())) [ 0.09437188] [ 1.80094112] >>> def lr_model(clf, X): return 1 / (1 + np.exp(-(clf.intercept_ + clf.coef_*X))) >>> print("P(x=-1)=%.2f\tP(x=7)=%.2f"%(lr_model(clf, -1), lr_ model(clf, 7))) P(x=-1)=0.05 P(x=7)=0.85
你可能已经注意到,scikit-learn可以通过特殊字段intercept_ 把第一个系数暴露出来。
如果把拟合的模型画出来,我们就可以看到它对于给定数据是非常有意义的:
5.6.2 在帖子分类问题上应用逻辑回归
诚然,前一节的例子显示出了逻辑回归的美妙之处。那么用它来处理极其嘈杂的数据,效果又如何呢?
将最邻近分类器(k =90)作为一个基线,我们可以看到,它的效果稍微好一点,但并没有使情况改变很多:
方法 | 均值(分数) | 标准方差 |
LogReg C=0.1 | 0.631 0 | 0.027 91 |
LogReg C=100.00 | 0.630 0 | 0.031 70 |
LogReg C=10.00 | 0.630 0 | 0.031 70 |
LogReg C=0.01 | 0.629 5 | 0.027 52 |
LogReg C=1.00 | 0.629 0 | 0.032 70 |
90NN | 0.628 0 | 0.027 77 |
我们已经看到采用不同正则化参数C 所得到的正确率。通过它,我们可以控制模型的复杂度。这个类似于最邻近方法的参数k。较小的C 值会带来较大的惩罚,这是说,它会使模型更为复杂。
让我们快速浏览一下最佳候选方案(C =0.1)的偏差-方差图。图中显示出,我们的模型具有高偏差——测试和训练误差很接近,但都处于难以接受的较高数值上。这意味着逻辑回归在目前的特征空间中是欠拟合的,无法学到一个能够正确拟合数据的模型。
那现在怎么办呢?我们改变了模型,并且在目前所知的范围内把它尽可能调到了最好。但是我们仍然没有得到令人满意的分类器。
似乎,要么是对于我们的任务来说,数据过于嘈杂了,要么是对于区分不同类别来说,我们的特征集合还不是很适合。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论