如何评估 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 的成本函数?的主要内容,如果未能解决你的问题,请参考以下文章