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

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

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

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

 

杨业勇   2017-04-10 11:39



   5个回答 
32

$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以上,就基本说明了模型是失败的。


木子周   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作为自己模型的标准,参考意义不大。

batmanX   2017-04-13 09:26

4

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

感觉0.2到1之间吧


Beck   2017-12-03 13:32

2

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

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)}$




Zealing   2018-09-28 08:02



  相关主题

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

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

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

cross entropy是什么意思?   1回答

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

python求logloss   1回答

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

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

逻辑回归的损失函数是怎么来的   2回答

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

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

如何计算加权最小二乘法的样本权重?   2回答



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

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

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

我们谢绝答非所问。

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

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