sklearn上的逻辑回归函数

Posted

技术标签:

【中文标题】sklearn上的逻辑回归函数【英文标题】:Logistic Regression function on sklearn 【发布时间】:2014-09-16 02:37:04 【问题描述】:

我正在从 sklearn 学习逻辑回归并遇到了这个问题:http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html#sklearn.linear_model.LogisticRegression

我创建了一个实现,它显示了训练和测试的准确度分数。然而,目前还不清楚这是如何实现的。我的问题是:什么是最大似然估计?这是如何计算的?什么是误差度量?使用的优化算法是什么?

我在理论上知道以上所有内容,但是我不确定 scikit.learn 在何时何地以及如何计算它,或者我是否需要在某个时候实现它。我的准确率是 83%,这是我的目标,但我对 scikit learn 是如何实现这一点感到非常困惑。

谁能指出我正确的方向?

【问题讨论】:

【参考方案1】:

我最近开始自己研究 LR,我仍然没有得到很多推导的步骤,但我想我知道使用了哪些公式。

首先让我们假设您使用的是最新版本的 scikit-learn,并且正在使用的求解器是 solver='lbfgs'(我相信这是默认值)。

代码在这里:https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/linear_model/logistic.py

什么是最大似然估计?这是如何计算的?

计算似然估计的函数是这个https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/linear_model/logistic.py#L57

有趣的是:

# Logistic loss is the negative of the log of the logistic function.
out = -np.sum(sample_weight * log_logistic(yz)) + .5 * alpha * np.dot(w, w)

这是formula 7 of this tutorial。该函数还计算似然梯度,然后将其传递给最小化函数(见下文)。一件重要的事情是截距是教程中公式的w0。但这只是有效的fit_intercept 是 True。

什么是误差度量?

对不起,我不确定。

使用的优化算法是什么?

查看代码中的以下几行:https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/linear_model/logistic.py#L389

就是这个函数http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.fmin_l_bfgs_b.html

一个非常重要的事情是类是 +1 或 -1! (对于二进制的情况,文献中0和1是常见的,但是不行)

还要注意numpy broadcasting 规则用于所有公式。 (这就是你看不到迭代的原因)

This was my attempt at understanding the code. 我慢慢地发疯了,直到撕掉 appart scikit-learn 代码(仅适用于二进制情况)。这也是inspiration too

希望对你有帮助。

【讨论】:

谢谢,很有帮助【参考方案2】:

查看 Andrew Ng 教授关于逻辑回归的机器学习笔记(从第 16 页开始):http://cs229.stanford.edu/notes/cs229-notes1.pdf

在逻辑回归中,您可以最小化交叉熵(这反过来又会最大化 y 给定 x 的可能性)。为了做到这一点,正在计算交叉熵(成本)函数的梯度,并用于更新分配给每个输入的算法的权重。简单来说,逻辑回归提出了一条线,通过改变其参数以使交叉熵不断下降,从而最好地区分您的两个二元类。 83% 的准确度(我不确定那是什么准确度;您应该将数据投入到训练/验证/测试中)意味着 Logistic 回归用于分类的线可以在 83% 的时间内正确区分类别。

【讨论】:

这个答案部分正确。是的,LR 最大化了交叉熵,但是 scikit-learn 实现使用coordinate descent,而不是梯度下降。【参考方案3】:

我会在 github 上查看以下内容:

https://github.com/scikit-learn/scikit-learn/blob/965b109bf2ac3a61dcbd02bc29dd8c9598c2b54c/sklearn/linear_model/logistic.py

链接是 sklearn 逻辑回归的实现。它包含使用的优化算法,包括牛顿共轭梯度 (newton-cg) 和 bfgs (broyden fletcher goldfarb shanno 算法),所有这些都需要计算损失函数 (_logistic_loss) 的 hessian。 _logistic_loss 是您的似然函数。

【讨论】:

最好贴出更多实质性的答案,而不是仅仅一个链接,请展开。 OP 不太可能运行此代码,因为 CG 和 L-BFGS(不是 BFGS!)代码仅在上周才合并到代码库中。

以上是关于sklearn上的逻辑回归函数的主要内容,如果未能解决你的问题,请参考以下文章

解释 sklearn 中的逻辑回归特征系数值

缩短 sklearn 逻辑回归的运行时间

Python 中的逻辑回归和交叉验证(使用 sklearn)

numpy+sklearn 手动实现逻辑回归Python

有没有办法适当调整这个 sklearn 逻辑回归函数来解释多个自变量和固定效应?

在 sklearn 中使用交叉验证和 AUC-ROC 进行逻辑回归模型