如何评估 scikit learn LogisticRegression 的成本函数?

Posted

技术标签:

【中文标题】如何评估 scikit learn LogisticRegression 的成本函数?【英文标题】:How to evaluate cost function for scikit learn LogisticRegression? 【发布时间】:2016-06-27 16:23:28 【问题描述】:

使用sklearn.linear_model.LogisticRegression拟合一个训练数据集后,我想得到训练数据集和交叉验证数据集的代价函数值。

是否可以让sklearn 简单地给我它最小化的函数的值(在合适的最小值)?

该函数在http://scikit-learn.org/stable/modules/linear_model.html#logistic-regression 的文档中进行了说明(取决于选择的正则化)。但是我找不到如何让sklearn 给我这个函数的值。

我原以为这是 LogisticRegression.score 所做的,但这只是返回准确性(其预测正确分类的数据点的分数)。

我找到了sklearn.metrics.log_loss,但这当然不是被最小化的实际功能。

【问题讨论】:

【参考方案1】:

我有以下建议。 您可以将逻辑回归的损失函数的代码编写为函数。 获得预测的数据标签后,您可以撤销定义的函数来计算成本值。

【讨论】:

似乎更像是一条评论 这是可行的,但如果 scikit 改变了它使用的成本函数,你创建的函数将被废弃并给出错误的值。我的目标是获得最小化过程中使用的实际值。【参考方案2】:

我使用下面的代码来计算成本值。

import numpy as np

cost = np.sum((reg.predict(x) - y) ** 2)

reg 是你学习到的LogisticRegression

【讨论】:

这看起来像平方误差,实际上并不是最小化过程中使用的成本函数。 Scikit 具有获取此类指标的工具。我的问题是关于获取实际成本以便更好地理解最小化过程。【参考方案3】:

不幸的是,没有“好”的方法可以这样做,但是https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/linear_model/logistic.py中有一个私有函数 _logistic_loss(w, X, y, alpha, sample_weight=None),因此您可以手动调用它

from sklearn.linear_model.logistic import _logistic_loss
print _logistic_loss(clf.coef_, X, y, 1 / clf.C)

clf 是你学习到的LogisticRegression

【讨论】:

哇,我很震惊,这太难了!甚至这个函数(严格来说)也只能由“newton-cg”求解器使用。在研究过拟合与欠拟合或进行网格搜索以寻找最佳拟合设置(如clf.C)时,使用实际成本函数不是典型做法吗? 不,您在大多数设置中不考虑成本函数。在极少数情况下您会对它感兴趣(afaik 仅在您测试优化过程时)。对于过度拟合等的分析,您通常使用典型的指标,如 logloss 或accuracy,而不是内部成本。特别是 - 大多数学习方法不关心成本函数 - 它们仅依赖于它的梯度 有趣!我会认为成本是最能提供信息的指标,这正是人们将其最小化的原因。感谢您的信息。 不,成本是测试集上实际指标的替代指标。这就是为什么你通常有某种正则化。因此,您对这个实际指标感兴趣,而不是只是替代的成本(这是必需的,因为您在训练期间无权访问测试集,但在评估期间您确实可以访问)。 @Corey 我相信获得成本是有用的。因为成本函数是您的实际指标的替代品,所以当您的成本最小化时,查看您的实际指标是否变得更好是很有用的。这可以让您直观地了解您是否应该选择一个成本函数(模型)而不是另一个,或者您是否应该更改您的优化算法。

以上是关于如何评估 scikit learn LogisticRegression 的成本函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用scikit-learn中的持久性模型计算评估指标

根据 Pairs 评估 Scikit-learn 中的聚类

scikit-learn 中常用的评估模型

Scikit-learn:用于集群评估的 ARI 分数

Scikit-learn 微调:在评估前对预测标签进行后处理

评估 scikit-learn GridSearchCV 中交叉验证分数的平均值、标准差