scikit-learn中的逻辑回归函数
我正在学习来自sklearn的逻辑回归,遇到了一些问题:http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html#sklearn.linear_model.LogisticRegression
我已经实现了一个程序,可以显示训练和测试的准确率。但是,我对这个过程是怎么实现的感到很困惑。我的问题是:什么是最大似然估计?这个是怎么计算的?误差度量是什么?使用的优化算法是什么?
我理论上知道这些内容,但不太清楚scikit-learn在什么地方、什么时候以及如何计算这些,或者这是否是我需要在某个时候自己实现的。我得到了83%的准确率,这是我想要的,但我对scikit-learn是如何实现这一点感到非常困惑。
有没有人能给我指个方向?
3 个回答
我建议你去看看GitHub上的以下内容:
这个链接是关于sklearn库中逻辑回归的实现。里面包含了一些优化算法,比如牛顿共轭梯度法(newton-cg)和BFGS算法(Broyden-Fletcher-Goldfarb-Shanno算法)。这些算法都需要计算损失函数的海森矩阵(_logistic_loss)。而_logistic_loss就是你的似然函数。
可以看看安德鲁·吴教授的机器学习笔记,里面有关于逻辑回归的内容(从第16页开始):http://cs229.stanford.edu/notes/cs229-notes1.pdf
在逻辑回归中,我们的目标是最小化交叉熵(这实际上是为了最大化在给定输入x的情况下,输出y的可能性)。为了实现这个目标,我们会计算交叉熵(成本)函数的梯度,然后用这个梯度来更新算法中每个输入对应的权重。简单来说,逻辑回归就是通过调整一些参数,找到一条最能区分你两个类别的线,这样交叉熵就会不断降低。提到的83%的准确率(我不太确定这个准确率具体指什么;你应该把数据分成训练集、验证集和测试集)意味着逻辑回归用来分类的那条线,能够正确区分类别的概率是83%。
我最近开始自己学习逻辑回归(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)
这是这个教程的公式7。这个函数还计算了似然的梯度,然后将其传递给最小化函数(见下文)。有一点很重要,就是截距是教程中公式的w0
。但这只有在fit_intercept
为真时才有效。
什么是误差度量?
抱歉,我不太确定。
使用的优化算法是什么?
请查看代码中的以下行: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广播规则。(这就是为什么你看不到迭代的原因)
这是我理解代码的尝试。我慢慢变得有点疯狂,甚至拆解了scikit-learn的代码(这只适用于二分类情况)。这也给我提供了灵感。
希望这对你有帮助。