常见回归和分类损失函数比较

简介: 代码损失函数的一般表示为\(L(y,f(x))\),用以衡量真实值\(y\)和预测值\(f(x)\)之间不一致的程度,一般越小越好。为了便于不同损失函数的比较,常将其表示为单变量的函数,在回归问题中这个变量为\(y-f(x)\),在分类问题中则为\(yf(x)\)。


代码



损失函数的一般表示为\(L(y,f(x))\),用以衡量真实值\(y\)和预测值\(f(x)\)之间不一致的程度,一般越小越好。为了便于不同损失函数的比较,常将其表示为单变量的函数,在回归问题中这个变量为\(y-f(x)\),在分类问题中则为\(yf(x)\)。下面分别进行讨论。



回归问题的损失函数

回归问题中\(y\)\(f(x)\)皆为实数\(\in R\),因此用残差 \(y-f(x)\)来度量二者的不一致程度。残差 (的绝对值) 越大,则损失函数越大,学习出来的模型效果就越差(这里不考虑正则化问题)。


常见的回归损失函数有

  • 平方损失 (squared loss)\((y-f(x))^2\)
  • 绝对值 (absolute loss) : \(|y-f(x)|\)
  • Huber损失 (huber loss) : \(\left\{\begin{matrix}\frac12[y-f(x)]^2 & \qquad |y-f(x)| \leq \delta \\ \delta|y-f(x)| - \frac12\delta^2 & \qquad |y-f(x)| > \delta\end{matrix}\right.\)



其中最常用的是平方损失,然而其缺点是对于异常点会施以较大的惩罚,因而不够robust。如果有较多异常点,则绝对值损失表现较好,但绝对值损失的缺点是在\(y-f(x)=0\)处不连续可导,因而不容易优化。


Huber损失是对二者的综合,当\(|y-f(x)|\)小于一个事先指定的值\(\delta\)时,变为平方损失,大于\(\delta\)时,则变成类似于绝对值损失,因此也是比较robust的损失函数。三者的图形比较如下:
img_2e94ded461c72b53e51e661513d4359e.png




分类问题的损失函数

对于二分类问题,\(y\in \left\{-1,+1 \right\}\),损失函数常表示为关于\(yf(x)\)的单调递减形式。如下图:

img_9b4ccc9d7a1b7f396c05c88d3aa02bdf.png

\(yf(x)\)被称为margin,其作用类似于回归问题中的残差 \(y-f(x)\)


二分类问题中的分类规则通常为 \(sign(f(x)) = \left\{\begin{matrix} +1 \qquad if\;\;f(x) \geq 0 \\ -1 \qquad if\;\;f(x) < 0\end{matrix}\right.\)

可以看到如果\(yf(x) > 0\),则样本分类正确,\(yf(x) < 0\) 则分类错误,而相应的分类决策边界即为\(f(x) = 0\)。所以最小化损失函数也可以看作是最大化margin的过程,任何合格的分类损失函数都应该对margin<0的样本施以较大的惩罚。



1、 0-1损失 (zero-one loss)

\[L(y,f(x)) = \left\{\begin{matrix} 0 \qquad if \;\; yf(x)\geq0 \\ 1 \qquad if \;\; yf(x) < 0\end{matrix}\right.\]

0-1损失对每个错分类点都施以相同的惩罚,这样那些“错的离谱“ (即 \(margin \rightarrow -\infty\))的点并不会收到大的关注,这在直觉上不是很合适。另外0-1损失不连续、非凸,优化困难,因而常使用其他的代理损失函数进行优化。



2、Logistic loss

\[L(y,f(x)) = log(1+e^{-yf(x)})\]


logistic Loss为Logistic Regression中使用的损失函数,下面做一下简单证明:


Logistic Regression中使用了Sigmoid函数表示预测概率:\[g(f(x)) = P(y=1|x) = \frac{1}{1+e^{-f(x)}}\]

\[P(y=-1|x) = 1-P(y=1|x) = 1-\frac{1}{1+e^{-f(x)}} = \frac{1}{1+e^{f(x)}} = g(-f(x))\]

因此利用\(y\in\left\{-1,+1\right\}\),可写为\(P(y|x) = \frac{1}{1+e^{-yf(x)}}\),此为一个概率模型,利用极大似然的思想:

\[max(\prod P(y|x)) = max(\prod \frac{1}{1+e^{-yf(x)}})\]


两边取对数,又因为是求损失函数,则将极大转为极小:

\[max(\sum logP(y|x)) = -min(\sum log(\frac{1}{1+e^{-yf(x)}})) = min(\sum log(1+e^{-yf(x)}) \]

这样就得到了logistic loss。



如果定义\(t = \frac{y+1}2 \in \left\{0,1\right\}\),则极大似然法可写为:

\[\prod (P(y=1|x))^{t}((1-P(y=1|x))^{1-t}\]

取对数并转为极小得:

\[\sum [-t\log P(y=1|x) - (1-t)\log (1-P(y=1|x))]\]

上式被称为交叉熵损失 (cross entropy loss),可以看到在二分类问题中logistic loss和交叉熵损失是等价的,二者区别只是标签y的定义不同。



3、Hinge loss

\[L(y,f(x)) = max(0,1-yf(x))\]


hinge loss为svm中使用的损失函数,hinge loss使得\(yf(x)>1\)的样本损失皆为0,由此带来了稀疏解,使得svm仅通过少量的支持向量就能确定最终超平面。



4、指数损失(Exponential loss)

\[L(y,f(x)) = e^{-yf(x)}\]


exponential loss为AdaBoost中使用的损失函数,使用exponential loss能比较方便地利用加法模型推导出AdaBoost算法 (具体推导过程)。然而其和squared loss一样,对异常点敏感,不够robust。



5、modified Huber loss

\[L(y,f(x)) = \left \{\begin{matrix} max(0,1-yf(x))^2 \qquad if \;\;yf(x)\geq-1 \\ \qquad-4yf(x) \qquad\qquad\;\; if\;\; yf(x)<-1\end{matrix}\right.\qquad\]


modified huber loss结合了hinge loss和logistic loss的优点,既能在\(yf(x) > 1\)时产生稀疏解提高训练效率,又能进行概率估计。另外其对于\((yf(x) < -1)\) 样本的惩罚以线性增加,这意味着受异常点的干扰较少,比较robust。scikit-learn中的SGDClassifier同样实现了modified huber loss。



最后来张全家福:

img_976529ef68ce8c583ec5e6d6521bdb41.png

从上图可以看出上面介绍的这些损失函数都可以看作是0-1损失的单调连续近似函数,而因为这些损失函数通常是凸的连续函数,因此常用来代替0-1损失进行优化。它们的相同点是都随着\(margin \rightarrow -\infty\)而加大惩罚;不同点在于,logistic loss和hinge loss都是线性增长,而exponential loss是以指数增长。

值得注意的是上图中modified huber loss的走向和exponential loss差不多,并不能看出其robust的属性。其实这和算法时间复杂度一样,成倍放大了之后才能体现出巨大差异:

img_6da60576f4ba5f90b13b7d1379169608.png





/

相关文章
|
Java 数据库
Springboot 根据数据库表自动生成实体类和Mapper,只需三步
Springboot 根据数据库表自动生成实体类和Mapper,只需三步
7601 2
Springboot 根据数据库表自动生成实体类和Mapper,只需三步
|
Android开发
UniApp Android 页面拖动,去掉半圆形阴影
UniApp Android 页面拖动,去掉半圆形阴影
202 0
|
安全 Java API
【性能与安全的双重飞跃】JDK 22外部函数与内存API:JNI的继任者,引领Java新潮流!
【9月更文挑战第7天】JDK 22外部函数与内存API的发布,标志着Java在性能与安全性方面实现了双重飞跃。作为JNI的继任者,这一新特性不仅简化了Java与本地代码的交互过程,还提升了程序的性能和安全性。我们有理由相信,在外部函数与内存API的引领下,Java将开启一个全新的编程时代,为开发者们带来更加高效、更加安全的编程体验。让我们共同期待Java在未来的辉煌成就!
249 11
|
算法 Java 程序员
三阶魔方公式解析与优化技巧
三阶魔方公式解析与优化技巧
|
监控 NoSQL Redis
Asynchronous AOF fsync is taking too long (disk is busy?). Writing the AOF buffer without waiting for fsync to complete, this may slow down Redis.
Asynchronous AOF fsync is taking too long (disk is busy?). Writing the AOF buffer without waiting for fsync to complete, this may slow down Redis.
|
存储 缓存 监控
快速掌握Redis优化要点,告别性能瓶颈!
# Redis优化指南 了解如何提升Redis性能,从读写方式(整体与部分)、KV size、Key数量、读写峰值、命中率、过期策略、平均穿透加载时间、可运维性、安全性等方面着手。选择合适的读写策略,如只整体读写或部分读写变更,优化KV size避免过大或差异过大,合理管理Key数量,应对不同读写峰值,监控命中率并持续优化,设置智能过期策略,减少平均穿透加载时间,确保高可运维性并强化安全性。一起探索Redis的性能潜力!
2688 5
|
数据挖掘
SPSS协方差分析
SPSS协方差分析
399 0
|
SQL 监控 Kubernetes
软件测试|简单易学的性能监控体系prometheus+grafana搭建教程
软件测试|简单易学的性能监控体系prometheus+grafana搭建教程
软件测试|简单易学的性能监控体系prometheus+grafana搭建教程
|
机器学习/深度学习 弹性计算 编解码
阿里云服务器CPU内存带宽系统盘配置选择全流程
阿里云服务器ECS实例规格、轻量应用服务器选择,CPU内存配置选择、公网带宽以及系统盘选择攻略
593 0
阿里云服务器CPU内存带宽系统盘配置选择全流程
|
缓存 监控 负载均衡
【微服务架构】为故障设计微服务架构
【微服务架构】为故障设计微服务架构