一、损失函数
回归问题中常用的损失函数,在线性回归中,可以通过极大似然估计(MLE)推导。计算的是预测值与真实值之间距离的平方和。实际更常用的是均方误差(Mean Squared Error-MSE):
MAE是目标值和预测值之差的绝对值之和,可以用来衡量预测值和真实值的距离。但是它不能给出,模型的预测值是比真实值小还是大。
直观上可以这样理解:如果我们最小化MSE来对所有的样本点只给出一个预测值,那么这个值一定是所有目标值的平均值。但如果是最小化MAE,那么这个值,则会是所有样本点目标值的中位数。众所周知,对异常值而言,中位数比均值更加鲁棒,因此MAE对于异常值也比MSE更稳定。
Huber损失是绝对误差,只是在误差很小时,就变为平方误差。
使用MAE训练神经网络最大的一个问题就是不变的大梯度,这可能导致在使用梯度下降快要结束时,错过了最小点。而对于MSE,梯度会随着损失的减小而减小,使结果更加精确。在这种情况下,Huber损失就非常有用。它会由于梯度的减小而落在最小值附近。比起MSE,它对异常点更加鲁棒。因此,Huber损失结合了MSE和MAE的优点。但是,Huber损失的问题是我们可能需要不断调整超参数delta。
下图是Huber跟随的变化曲线。当很大时,等价为MSE曲线,当很小时,等价为MAE曲线。
二分类任务中常用的损失函数,在LR中,通过对似然函数取对数得到。也就是交叉熵损失函数。
在AdaBoost中用到的损失函数。它是前向分步加法算法的特例,是一个加和模型。在Adaboost中,经过m此迭代之后,可以得到:
Adaboost每次迭代时的目的是为了找到最小化下列式子时的参数α 和G:
而指数损失函数(exp-loss)的标准形式如下
可以看出,Adaboost的目标式子就是指数损失,在给定n个样本的情况下,Adaboost的损失函数为:
如何评估机器学习算法模型是任何项目中一个非常重要的环节。分类问题一般会选择准确率(Accuracy)或者AUC作为metric,回归问题使用MSE,但这些指标并不足以评判一个模型的好坏,接下来的内容我将尽可能包括各个评价指标。因为损失函数大部分可以直接作为评价指标,所以损失函数中出现过的简单介绍。
4. MAPE:平均绝对百分比误差(Mean Absolute Percentage Error)
注意点:当真实值有数据等于0时,存在分母0除问题,该公式不可用!
5. SMAPE:对称平均绝对百分比误差(Symmetric Mean Absolute Percentage Error)
注意点:真实值、预测值均等于0时,存在分母为0,该公式不可用!
6. R Squared:
如果我们使用同一个算法模型,解决不同的问题,由于不同的数据集的量纲不同,MSE、RMSE等指标不能体现此模型针对不同问题所表现的优劣,也就无法判断模型更适合预测哪个问题。得到的性能度量都在[0, 1]之间,可以判断此模型更适合预测哪个问题。
公式的理解:
7. 代码实现:
# coding=utf-8
import numpy as np
from sklearn import metrics
from sklearn.metrics import r2_score
# MAPE和SMAPE需要自己实现
def mape(y_true, y_pred):
return np.mean(np.abs((y_pred - y_true) / y_true)) * 100
def smape(y_true, y_pred):
return 2.0 * np.mean(np.abs(y_pred - y_true) / (np.abs(y_pred) + np.abs(y_true))) * 100
y_true = np.array([1.0, 5.0, 4.0, 3.0, 2.0, 5.0, -3.0])
y_pred = np.array([1.0, 4.5, 3.5, 5.0, 8.0, 4.5, 1.0])
# MSE
print(metrics.mean_squared_error(y_true, y_pred)) # 8.107142857142858
# RMSE
print(np.sqrt(metrics.mean_squared_error(y_true, y_pred))) # 2.847304489713536
# MAE
print(metrics.mean_absolute_error(y_true, y_pred)) # 1.9285714285714286
# MAPE
print(mape(y_true, y_pred)) # 76.07142857142858
# SMAPE
print(smape(y_true, y_pred)) # 57.76942355889724
# R Squared
print(r2_score(y_true, y_pred))
混淆矩阵一般不直接作为模型的评价指标,但是他是后续多个指标的基础。以下为二分类的混淆矩阵,多分类的混淆矩阵和这个类似。
预测正例 | 预测反例 | |
---|---|---|
真实正例 | TP(真正例) | FN(假反例) |
真实反例 | FP(假正例) | TN(真反例) |
我们训练模型的目的是为了降低FP和FN。很难说什么时候降低FP,什么时候降低FN。基于我们不同的需求,来决定降低FP还是FN。
准确率也就是在所有样本中,有多少样本被预测正确。
当样本类别均衡时,Accuracy是一个很好的指标。
但在样本不平衡的情况下,产生效果较差。假设我们的训练数据中只有2%的正样本,98%的负样本,那么如果模型全部预测为负样本,准确率便是98%,。分类的准确率指标很高,会给我们一种模型很好的假象。
含义:预测为正例的样本中有多少实际为正;
含义:实际为正例的样本有多少被预测为正;
通过选择不同的阈值,得到Recall和Precision,以Recall为横坐标,Precision为纵坐标得到的曲线图。
PR曲线性质:
Area Under Curve(AUC) 是二分类问题中使用非常广泛的一个评价指标。AUC的本质是,任取一个正样本和负样本,模型输出正样本的值大于负样本值的概率。构成AUC的两个基本指标是假正例率和真正例率。
TPR和FPR的范围均是[0,1],通过选择不同的阈值得到TPR和FPR,然后绘制ROC曲线。
曲线性质:
AUC: ROC曲线下的面积为AUC值。
from sklearn.metrics import accuracy_score,precision_score,recall_score,f1_score,fbeta_score
y_test = [1,1,1,1,0,0,1,1,1,0,0]
y_pred = [1,1,1,0,1,1,0,1,1,1,0]
print("准确率为:{0:%}".format(accuracy_score(y_test, y_pred)))
print("精确率为:{0:%}".format(precision_score(y_test, y_pred)))
print("召回率为:{0:%}".format(recall_score(y_test, y_pred)))
print("F1分数为:{0:%}".format(f1_score(y_test, y_pred)))
print("Fbeta为:{0:%}".format(fbeta_score(y_test, y_pred,beta =1.2)))
[1]分类问题性能评价指标详述:
https://blog.csdn.net/foneone/article/details/88920256 [2]AUC,ROC我看到的最透彻的讲解:
https://blog.csdn.net/u013385925/article/details/80385873 [3]机器学习大牛最常用的5个回归损失函数,你知道几个?:
https://www.jiqizhixin.com/articles/2018-06-21-3 [4]机器学习-损失函数:
https://www.csuldw.com/2016/03/26/2016-03-26-loss-function/ [5]损失函数jupyter notebook:
https://nbviewer.jupyter.org/github/groverpr/Machine-Learning/blob/master/notebooks/05_Loss_Functions.ipynb [6]L1 vs. L2 Loss function:
http://rishy.github.io/ml/2015/07/28/l1-vs-l2-loss/ [7]P-R曲线深入理解:
https://blog.csdn.net/b876144622/article/details/80009867
原文链接:
https://zhuanlan.zhihu.com/p/91511706
本文分享自 机器学习算法与Python学习 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!