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

  统计/机器学习 监督式学习 损失函数    浏览次数:28308        分享
16

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

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

 

杨业勇   2017-04-10 11:39



   5个回答 
47

$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面试题库 DS面经

木子周   2017-12-06 13:07

厉害厉害 - 莱莱0915   2020-04-25 17:20
哈哈哈,清楚了 - Harper   2020-05-20 08:43
18

先搞清楚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面试题库 DS面经

batmanX   2017-04-13 09:26

4

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

感觉0.2到1之间吧


SofaSofa数据科学社区DS面试题库 DS面经

Beck   2017-12-03 13:32

3

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面试题库 DS面经

Zealing   2018-09-28 08:02

2

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

SofaSofa数据科学社区DS面试题库 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


  相关讨论

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

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

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

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

python求logloss

focal loss是什么?

hinge loss的公式是什么?

向量梯度下降优化的最佳步长?

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

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

  随便看看

推荐开放数据库

点击率的95%置信区间该怎么算?

医学统计里的c-index或者c-statistic是什么意思?

pandas报错: 'DataFrame' object has no attribute 'unique'

python里怎么计算曼哈顿距离?