logloss的取值范围是多少?一般好的分类器能达到多少?

  统计/机器学习 监督式学习 损失函数    浏览次数: 4234
14

我在做一个二元分类器,我现在的logloss是1.1左右。

logloss是可以大于1的吗?它的正常范围应该是多少?一般多小的logloss算是好的分类器?

 

杨业勇   2017-04-10 11:39



   5个回答 
33

$logloss$可以大于1,但是对于二元分类来说,大于1说明这个模型是比较糟糕。

回顾一下$logloss$的公式

$$logloss=−\sum_{i=1}^n\left(\frac{y_i}{n}\text{log}(p_i)+\frac{1−y_i}{n}\text{log}(1−p_i)\right)$$

其中$n$是测试样本的个数,$p_i$为预测第$i$个样本为阳性的概率,$y_i$表示第$i$个预测样本的真实标签(1代表阳性,-1代表阴性)。


我一开始就说了大于1的logloss是很差的。我在Gakki下面留言说0.8依然很差。我凭什么这么说?

假如我们现在有个训练集,100万个数据点,其中10万个为阳性,那么总体上每个样本为1的概率可近似认为是0.1。通常来说,测试集的分布是非常接近于训练集的,那么测试集中大概有10%的样本为阳性。如果我们预测测试集中每个样本为1的概率都为0.1,那么logloss会是多少呢?

$$logloss=−\left(0.1\text{log}(0.1)+0.9\text{log}(1−0.1)\right)\approx 0.325$$

假如总体分布是每个样本以$p$的概率为阳性,我们预测每个样本为阳性的概率都为$p$,也就是$p_i=p$,那么$logloss$是多少呢?

很显然

$$logloss=-p\log (p) - (1-p) \log(1-p)$$

若$p=0.1$,$logloss = 0.325$

若$p=0.2$,$logloss = 0.500$

若$p=0.3$,$logloss = 0.611$

若$p=0.4$,$logloss = 0.673$

若$p=0.5$,$logloss = 0.693$

若$p=0.6$,$logloss = 0.673$

若$p=0.7$,$logloss = 0.611$

若$p=0.8$,$logloss = 0.500$

若$p=0.9$,$logloss = 0.325$

所以最差的情况就是,样本正好是一半阳性一半阴性,此时你按照上面方面预测(乱猜)出的logloss是0.693。

换句话说,只要loglss是在0.693以上,就基本说明了模型是失败的。


SofaSofa数据科学社区 DS面经 问答 实战

木子周   2017-12-06 13:07

这个才应该是最佳答案! - sasa   2017-12-07 13:02
哈哈,谢谢 - 木子周   2017-12-07 20:57
送你上最佳! - 剪叔   2017-12-09 16:28
你最后一个公式是算的$H(p)$,也就是真实输出分布的entropy,或者是分类预测是完美的情况($KL(p_{true}||p_{est})=0$)下的cross entropy。所以0.693只是描述二元分类数据本身entropy(混乱程度)的上限,和分类结果无关。 - Zealing   2018-09-28 05:17
12

先搞清楚logloss的定义

$$\text{logloss}=-\frac{1}{n}\sum_{i=1}^n y_i\log(p_i)+(1-y_i)\log(1-p_i),$$

其中$n$是测试数据的个数,$y_i$是第$i$条记录的真实值(0或者1),$p_i$是你预测的第$i$条记录是1的概率。

很明显$\text{logloss}$的取值范围是$[0,+\infty)$。试想一下,有个记录的真实是1,但是你预测它是1的概率为0,$-\log 0$就是正无穷,你的$\text{logloss}$就是正无穷大。

所以你得到1.1是可能发生的。

LogLoss是越小越好,至于多小是好,并没有统一标准。这个要根据实际问题来看。我参加过两个用LogLoss做标准的比赛,一个比赛的第一名是0.01左右,另外一个是0.4左右。用其他数据的LogLoss作为自己模型的标准,参考意义不大。

SofaSofa数据科学社区 DS面经 问答 实战

batmanX   2017-04-13 09:26

4

可以参考这个(机器读中文2:“辨古识今”-排行榜)咯

感觉0.2到1之间吧


SofaSofa数据科学社区 DS面经 问答 实战

Beck   2017-12-03 13:32

2

我之前有过0.8的loglss,仅供参考

SofaSofa数据科学社区 DS面经 问答 实战

Gakki   2017-04-14 07:44

对于二元分类来说,0.8的logloss算是失败了吧 - 曾经是科比   2017-12-05 12:41
我同意,0.8的确算是非常差的。 - 木子周   2017-12-06 12:43
这么一看的确是的,0.8应该挺糟糕的 - Gakki   2018-01-02 11:17
1

cross entropy 的定义

$$H(p,q)=-\sum_{y=(0,1)}p(y)\log q(\hat{y}=y)$$

$$=H(p)+D_{KL}(p||q)$$

$$=-\sum_{y=(0,1)}p(y)\log p(y)+D_{KL}(p||q)$$

其中$y$是真实输出标签,$\hat{y}$是预测输出标签,$p(y)$是$y$的概率密度函数(pdf),$q(\hat{y})$是预测的$\hat{y}$的pdf。cross entropy分两部分:

1. $H(p)$是真实标签$y$的熵,表示其$y$的分散程度,对于训练数据是一个常数,只和数据有关,和预测模型无关。

2.$D_{KL}(p||q)$是 Kullback–Leibler divergence 表示真实和预测的pdf之间的匹配程度。这才能衡量预测模型是否好。$D_{KL}(p||q)=0$表示$p$和$q$完全匹配。


需要注意$H(p_i,q_i)$只是第i个数据点的cross entropy。我们求的是所有训练数据点cross entropy的和。

$$J(w)=\frac{1}{N}\sum_{i=1}^{N}H(p_i,q_i)$$

$$=-\frac{1}{N}\sum_{i=1}^{N}(y_i\log (\hat{y_i})+(1-y_i)\log (1-\hat{y_i})))$$

如果是logistic regression, $\hat{y_i}=g(w^Tx_i)=1/(1+e^{-w^Tx_i})$。

相似我们可以得到所有训练数据的entropy和

$$H(y)=-\frac{1}{N}\sum_{i=1}^{N}(y_i\log (y_i)+(1-y_i)\log (1-y_i)))$$

而$D_{KL}(w)=J(w)-H(y)$才是表示预测模型好坏的指标。比如平衡过的数据,$y_i=0.5$,则$H(y)=-\frac{1}{N}*N*2*0.5\log 0.5=-log 0.5=0.693$,我们得到的logloss需要$-0.693$。

结论:

1.如果数据相同,可以直接比logloss。

2.如果数据不同,需要减去$H(y)$才能比较$D_{KL}(w)$。

3.或者比较normalized cross entropy$\dfrac{J(w)}{H(y)}$




SofaSofa数据科学社区 DS面经 问答 实战

Zealing   2018-09-28 08:02



  相关主题

cross entropy是什么意思?   1回答

怎么理解surrogate loss function代理损失函数?   2回答

如何理解GBDT里面“损失函数的负梯度在当前模型的值,可以作为残差的估计”?   1回答

关于损失函数h(x), J(x), cost的概念问题   1回答

二元分类为什么不能用MSE做为损失函数?   6回答

Hamming Loss汉明损失的计算公式是什么?   1回答

python求logloss   1回答

focal loss是什么?   0回答

hinge loss的公式是什么?   1回答

Gini指数、Gini系数、Gini不纯是一回事吗?   2回答

用SGD计算逻辑回归时的迭代公式是什么?   2回答

LR中若标签为+1和-1,损失函数如何推导,求大佬解答   3回答



回答问题时需要注意什么?

我们谢绝在回答前讲“生动”的故事。

我们谢绝“这么简单,你自己想”、“书上有的,你认真看”这类的回答;如果你认为对方的提问方式或者内容不妥,你可以直接忽略该问题,不用进行任何作答,甚至可以对该问题投反对票。

我们谢绝答非所问。

我们谢绝自己不会、硬要回答。

我们感激每一个用户在编写答案时的努力与付出!