|
|
|
|
移动端

红桃k游戏忘记密码:Python机器学习中七种损失函数的科学指南

本文来源:http://www.2233122.com/digi_hsw_cn/

太阳城娱乐网最快登入,  库克10月份再一次强调增强现实的发展机会比虚拟现实更大一些,他说:技术与人之间的接触性互动是无可替代的,因此你肯定希望技术能够促进这种接触性互动。(图:家长通教育资讯)  可以看到之前的家长通更多是作为一起作业产品体系中,查看孩子作业报告的工具。更重要的是,中兴认识到新技术的普及并不是一家厂商能够做到的,去年中兴还联合Nuance、Audience、高德、百度、中国科学院自动化所等成立了“智慧语音联盟”,以生态化的方式,寻求语音交互上的突破。  来源:《2016信中利胡润百富榜校友会特别报告》  记者看到,在这份《校友会特别报告》中,浙大以38人排名第一,北大以26人排名第二,清华以22人排名第三,南京大学则以15人位居第六。

只有拥有核心技术的企业才有可能做大做强,比如谷歌和微软,从这个角度上来说,核心技术要比商业模式更重要。可十年前绝不是这样。  包括魅蓝Note5现货首发在内,1208京东超级品牌日·魅族盛典开通了诸多优惠活动回馈给喜爱魅族的新老用户,魅利全开,族够惊喜。”李斌说。

  对于路透社的报道,中国网财经记者联系了新东方前途出国,对方负责外宣的工作人员只给了一份12月3日在其官方微博发布的一份声明,对于记者提出的疑问以“相关负责人在国外开会”为由,没有给予回应。”张光强说,“ivvi手机也将通过打造良好的生态,为用户提供满意的内容和服务。同时支持省墨打印,节省耗材更低成本。其次,联想在全球拥有上万家专卖店,可以为产品提供线下销售渠道。

损失函数实际上是我们经常使用的这些技术的核心,本文介绍了多种损失函数,他们的工作位置以及如何在Python中进行编码。

作者:CDA数据分析师来源:今日头条|2019-11-11 16:44

损失函数实际上是我们经常使用的这些技术的核心,本文介绍了多种损失函数,他们的工作位置以及如何在Python中进行编码。

前言

首先想象一下一个场景–你已经在给定的数据集上训练了一个机器学习模型,并且已经准备将其放在客户面前。但是,这个时候你应该如何确定该模型会给出很好的结果呢?是否有一种度量标准或技术可以帮助你快速评估数据集中的模型?

当然有了—简单的说,这就是损失函数在机器学习中发挥作用的地方。

损失函数是我们喜欢使用的机器学习算法的核心。但是可以看到大多数初学者和爱好者对如何使用损失函数们以及在哪里使用损失函数感到非常困惑。

损失函数并不是那么的难以理解,并且如果掌握了它将无限地增强你对机器学习算法的理解。那么,损失函数是什么,我们应该如何把握损失函数的意义呢?

在本文中,我们将讨论机器学习中使用的7种常见的损失函数,并说明每个函数中在什么地方使用。 我们将在本文中介绍很多内容,所以让我们现在开始吧!

什么是损失函数?

假设你现在在山顶上,这个时候需要往下走。你应该怎么决定你往哪个方向走?

假如是我的话,我会这么做:

  • 首先,环顾四周,看看所有有可能的道路。
  • 然后,拒绝那些向上的路。这是因为这些路径实际上会消耗我更多的精力,并使我的任务更加困难。
  • 最后,选择我认为最容易下坡的那条路。

我刚刚只是凭借我的直接来判断我的决定的么?当然不是,这些决定正是损失函数所提供的。

损失函数将决策映射到相关的成本上。

决策认为上坡会浪费我们的精力和时间。决定认为向下对我们来说更有利。因此,它具有负成本。

在有监督的机器学习算法中,我们希望在学习过程中将每个训练样本的误差最小化。这可以通过一些优化策略(例如梯度下降)来完成。这个误差就来自损失函数。

损失函数和成本函数有什么区别?

首先需要在这里强调一下,尽管成本函数和损失函数是同义词,可以互换使用,但是它们是不同的。

损失函数仅用于单个训练样本。有时也称为错误函数。另一方面,成本函数是整个训练数据集的平均损失。优化策略的目标是最小化成本函数。

回归损失函数

此时,你应该非常熟悉线性回归了。它涉及对因变量 Y和几个自变量 X_i 之间的线性关系建模。因此,我们实际上在这些变量上在空间上拟合了一条空间线。

我们将使用给定的数据点来找到系数a0,a1,...,an。

Python机器学习中七种损失函数的科学指南

我们将使用著名的波士顿住房数据集来理解这一概念。为了简单起见,我们将只使用一个特征- 每个住宅的平均房间数(X),来预测因变量,以1000美元为单位的房屋的中位数价值(Y)。

Python机器学习中七种损失函数的科学指南

我们将使用“ 梯度下降”作为一个优化策略来找到回归线。我不会详细介绍有关“梯度下降”的复杂细节,但是这里有一个关于权重更新规则的提示”:

在这里,theta_j是要更新的权重,alpha是学习率,J是成本函数。成本函数由theta参数化。我们的目标是找到产生最小总成本的theta值。

我已经定义了以下每个损失函数要遵循的步骤:

  1. 为我们的预测函数f(X)编写表达式,并确定我们需要查找的参数
  2. 确定每个训练样本要使用的损失函数
  3. 查找成本函数的表达式–所有样本的平均损失
  4. 查找成本函数相对于每个未知参数的梯度
  5. 确定学习率并对固定次数的迭代运行权重更新规则

1.平方误差损失

每个训练样本的平方误差损失(也称为L2损失)是实际值与预测值之差的平方:

相应的成本函数是这些平方误差(MSE)的均值

我觉得在你参考下面的这些代码之前,先自己尝试找到梯度下降的梯度。

def update_weights_MSE(m, b, X, Y, learning_rate): m_deriv = 0 b_deriv = 0 N = len(X) for i in range(N): # Calculate partial derivatives # -2x(y - (mx + b)) m_deriv += -2*X[i] * (Y[i] - (m*X[i] + b)) # -2(y - (mx + b)) b_deriv += -2*(Y[i] - (m*X[i] + b)) # We subtract because the derivatives point in direction of steepest ascent m -= (m_deriv / float(N)) * learning_rate b -= (b_deriv / float(N)) * learning_rate return m, b

我在波士顿数据上使用了这段代码,以获取500次迭代中不同的学习率值:

Python机器学习中七种损失函数的科学指南

接下来你可以尝试以0.1的学习率再次运行该代码500次迭代。

让我们再多谈一下MSE损失函数。它是一个二次函数,其中a> 0),还记得它的是什么样子么?

Python机器学习中七种损失函数的科学指南

二次函数仅具有全局最小值。由于没有局部最小值,因此我们永远不会陷入局部最小值的困境。因此,它始终可以确保“梯度下降”收敛(如果它完全收敛)到全局最小值。

MSE损失函数通过对错误进行平方来惩罚模型,以免产生大的错误。平方大会使它更大,对吗?但是在这里有一个警告。此属性使MSE成本函数对异常值的鲁棒性(Robust)降低。因此,如果我们的数据容易出现异常值,则不应使用此方法。

2.绝对误差损失

每个训练样本的绝对误差是预测值与实际值之间的距离,而与符号无关。绝对误差也称为L1损失:

正如我之前提到的,代价是这些绝对误差(MAE)的均值。

与MSE相比,MAE成本对于异常值更为稳健。但是,在处理数学方程中的绝对或模运算并不容易。我相信你们中的很多人都会同意这一点!我们可以认为这是MAE的一个缺点。

这是带有MAE成本的update_weight函数的代码:

def update_weights_MAE(m, b, X, Y, learning_rate): m_deriv = 0 b_deriv = 0 N = len(X) for i in range(N): # Calculate partial derivatives # -x(y - (mx + b)) / |mx + b| m_deriv += - X[i] * (Y[i] - (m*X[i] + b)) / abs(Y[i] - (m*X[i] + b)) # -(y - (mx + b)) / |mx + b| b_deriv += -(Y[i] - (m*X[i] + b)) / abs(Y[i] - (m*X[i] + b)) # We subtract because the derivatives point in direction of steepest ascent m -= (m_deriv / float(N)) * learning_rate b -= (b_deriv / float(N)) * learning_rate return m, b

在以不同的学习率运行代码500次的迭代后,我们得到以下图表:


3.Huber Loss

Huber损失综合了MSE和MAE的优质性能。对于较小的误差,它是平方的;对于其他误差,它是线性的(对于梯度,也是类似)。由其delta参数进行标识:

上方是针对较小的误差是平方的,下方是针对其他误差为线性的。

def update_weights_Huber(m, b, X, Y, delta, learning_rate): m_deriv = 0 b_deriv = 0 N = len(X) for i in range(N): # derivative of quadratic for small values and of linear for large values if abs(Y[i] - m*X[i] - b) <= delta: m_deriv += -X[i] * (Y[i] - (m*X[i] + b)) b_deriv += - (Y[i] - (m*X[i] + b)) else: m_deriv += delta * X[i] * ((m*X[i] + b) - Y[i]) / abs((m*X[i] + b) - Y[i]) b_deriv += delta * ((m*X[i] + b) - Y[i]) / abs((m*X[i] + b) - Y[i]) # We subtract because the derivatives point in direction of steepest ascent m -= (m_deriv / float(N)) * learning_rate b -= (b_deriv / float(N)) * learning_rate return m, b

对于delta参数的不同值,我们以 0.0001的学习率获得了500次权重更新的迭代,获得了如下图表:[

Python机器学习中七种损失函数的科学指南

与MSE相比,Huber损失对异常值的鲁棒性更高。它被使用与稳健回归,M-估计和叠加模型。在分类中也使用了Huber Loss的一种变体。

二分类损失函数

从看到这个名字就应该不言自明了。二分类是指将一个对象分配给两个类别中的一个。这种分类基于应用于输入特征向量的规则。例如,根据电子邮件的主题,将电子邮件分为垃圾邮件或非垃圾邮件,这是一种二进制分类。

我将在乳腺癌数据集上说明这些二分类损失函数。

我们希望根据平均半径,面积,周长等特征将肿瘤分类为“恶性”或“良性”。为简化起见,我们将仅使用两个输入特征(X1和X2),即“最差面积”和“平均对称”进行分类。目标值Y可以为0(恶性)或1(良性)。

这是我们数据的散点图:


1.二元交叉熵损失

让我们首先了解“熵”一词。 通常,我们使用熵来表示混乱或不确定性。对于具有概率分布p(X)的随机变量X进行测量:

负号是用于使总量为正的。

概率分布的熵值越大,表示分布的不确定性越大。同样,较小的值表示更确定的分布。

这使得二元交叉熵适合作为损失函数– 使其值最小化。我们将二进制交叉熵损失用于分类模型,该模型输出一个概率p。

元素属于1类(或正类)的概率= p 然后,元素属于0类(或负类)的概率= 1-p

然后,输出标签y(可以取值0和1)和预测概率p的交叉熵损失定义为:

这也称为对数丢失。要计算概率p,我们可以使用Sigmoid函数。在此,z是我们输入特性的函数:

Sigmoid函数的范围是[0,1],使其适合于计算概率。

Python机器学习中七种损失函数的科学指南

尝试自己输入一下代码,然再后查看下面的update_weight函数的代码。

def update_weights_BCE(m1, m2, b, X1, X2, Y, learning_rate): m1_deriv = 0 m2_deriv = 0 b_deriv = 0 N = len(X1) for i in range(N): s = 1 / (1 / (1 + math.exp(-m1*X1[i] - m2*X2[i] - b))) # Calculate partial derivatives m1_deriv += -X1[i] * (s - Y[i]) m2_deriv += -X2[i] * (s - Y[i]) b_deriv += -(s - Y[i]) # We subtract because the derivatives point in direction of steepest ascent m1 -= (m1_deriv / float(N)) * learning_rate m2 -= (m2_deriv / float(N)) * learning_rate b -= (b_deriv / float(N)) * learning_rate return m1, m2, b

关于使用权重更新规则进行1000次迭代(具有不同的alpha值),我得到以下图表:

Python机器学习中七种损失函数的科学指南

2.铰链损失(Hinge Loss)

铰链损失主要用于支持标签为-1和1的支持向量机(SVM)分类器。因此,请确保将数据集中“Malignant”类的标签从0更改为-1。

铰链损失不仅会惩罚错误的预测,还会惩罚不确定的正确预测。

输入输出对(x,y)的铰链损失为:

def update_weights_Hinge(m1, m2, b, X1, X2, Y, learning_rate): m1_deriv = 0 m2_deriv = 0 b_deriv = 0 N = len(X1) for i in range(N): # Calculate partial derivatives if Y[i]*(m1*X1[i] + m2*X2[i] + b) <= 1: m1_deriv += -X1[i] * Y[i] m2_deriv += -X2[i] * Y[i] b_deriv += -Y[i] # else derivatives are zero # We subtract because the derivatives point in direction of steepest ascent m1 -= (m1_deriv / float(N)) * learning_rate m2 -= (m2_deriv / float(N)) * learning_rate b -= (b_deriv / float(N)) * learning_rate return m1, m2, b

在使用三个不同的alpha值对2000次迭代运行update函数之后,我们获得了以下图:

Python机器学习中七种损失函数的科学指南

铰链损失简化了SVM的数学运算,同时使损失最大化(与对数损失相比)。当我们要做出实时决策而并不是高度关注准确性时,就可以使用它。

多类分类损失函数

现在电子邮件不只是被归类为垃圾邮件或非垃圾邮件(现在已经不是90年代了!)。它们可以被分为其他各种类别-工作,家庭,社交,晋升等。在现在邮件分类是一个多类别分类用例。

我们将使用鸢尾花数据集来了解其余两个损失函数。我们将使用2个特征X1(萼片长度)和特征X2(花瓣宽度)来预测鸢尾花(Setosa,Versicolor或Virginica)的类别(Y)

我们的任务是使用神经网络模型和Keras中内置的Adam优化器来实现分类。这是因为随着参数数量的增加,数学以及代码将变得难以理解。

这是我们数据的散点图:


1.多分类交叉熵损失

多分类交叉熵损失是二分类交叉熵损失的概括。输入向量Xi和相应的单编码目标向量Yi的损耗为:

我们使用softmax函数来找到概率p_ij:

“ Softmax是通过在输出层之前的神经网络层实现的。Softmax层必须具有与输出层相同数量的节点。”

Python机器学习中七种损失函数的科学指南

最后,我们的输出是给定输入具有较大概率的类别。

我们使用一个输入层和一个输出层来进行构建模型,并以不同的学习率对其进行编译。在model.compile()语句中将损失参数指定为“ categorical_crossentropy”:

# importing requirements from keras.layers import Dense from keras.models import Sequential from keras.optimizers import adam # alpha = 0.001 as given in the lr parameter in adam() optimizer # build the model model_alpha1 = Sequential() model_alpha1.add(Dense(50, input_dim=2, activation='relu')) model_alpha1.add(Dense(3, activation='softmax')) # compile the model opt_alpha1 = adam(lr=0.001) model_alpha1.compile(loss='categorical_crossentropy', optimizer=opt_alpha1, metrics=['accuracy']) # fit the model # dummy_Y is the one-hot encoded # history_alpha1 is used to score the validation and accuracy scores for plotting history_alpha1 = model_alpha1.fit(dataX, dummy_Y, validation_data=(dataX, dummy_Y), epochs=200, verbose=0)

这是经过200个时期训练后的成本和准确率图:

Python机器学习中七种损失函数的科学指南
Python机器学习中七种损失函数的科学指南

2. KL散度(KL-Divergence)

KL散度是度量一个概率分布与另一个分布之间的差异的指标。KL散度为零表示分布相同。

请注意,散度函数不是对称的。

这就是为什么KL散度不能用作距离度量的原因。

我将介绍使用KL-散度作为损失函数而不涉及其数学的基本方法。我们想要得到目标变量关于输入特征的真实概率分布P的近似值,给出一个近似分布q。由于kl散度不是对称的,我们可以用两种方法来实现:

第一种方法用于监督学习中,第二种方法用于强化学习中。KL-散度在功能上类似于多分类交叉熵,并且也称为P相对于Q的相对熵:

我们像以前对多类交叉熵损失所做的那样,在compile()函数中将'kullbackleiblerdivergence'指定为损失参数的值。

# importing requirements from keras.layers import Dense from keras.models import Sequential from keras.optimizers import adam # alpha = 0.001 as given in the lr parameter in adam() optimizer # build the model model_alpha1 = Sequential() model_alpha1.add(Dense(50, input_dim=2, activation='relu')) model_alpha1.add(Dense(3, activation='softmax')) # compile the model opt_alpha1 = adam(lr=0.001) model_alpha1.compile(loss='kullback_leibler_divergence', optimizer=opt_alpha1, metrics=['accuracy']) # fit the model # dummy_Y is the one-hot encoded # history_alpha1 is used to score the validation and accuracy scores for plotting history_alpha1 = model_alpha1.fit(dataX, dummy_Y, validation_data=(dataX, dummy_Y), epochs=200, verbose=0)

Python机器学习中七种损失函数的科学指南
Python机器学习中七种损失函数的科学指南

与多类分类相比,KL-散度更常用于近似复杂函数。我们在使用深度自动生成模型(如变分自动编码器(VAE))时经常遇到KL-散度。

结语

哇!到这里为止我们已经讲了很多了。一直看到最后的你,给你自己一点鼓励吧。这篇文章中是我们通常在机器学习中使用的损失函数的详细列表。

在这里呢建议你在继续进行机器学习的过程中,多读几遍。因为这不是一次努力就可以全部理解的。需要一些阅读时间和经验才能了解这些损失函数的工作方式和位置。

【编辑推荐】

  1. 10月份Github上热门的Python项目
  2. 特别推荐!优化​Python开发环境的几个技巧,实现自动化让你远离烦恼
  3. Python 取代了 Excel 在银行业务中的地位?
  4. Python循环12种超强写法,又快又省内存
  5. 如何利用Python上班划水?
【责任编辑:华轩 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

订阅专栏+更多

骨干网与数据中心建设案例

骨干网与数据中心建设案例

高级网工必会
共20章 | 捷哥CCIE

372人订阅学习

中间件安全防护攻略

中间件安全防护攻略

4类安全防护
共4章 | hack_man

135人订阅学习

CentOS 8 全新学习术

CentOS 8 全新学习术

CentOS 8 正式发布
共16章 | UbuntuServer

282人订阅学习

读 书 +更多

Visual C++编程从基础到实践

Visual C++ 6.0是Microsoft公司的Visual Studio开发组件中最强大的编程工具,利用它可以开发出高性能的应用程序。本书由浅入深,从基础到实...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊

51CTO服务号

51CTO官微

太阳城提款申请登入 申博游戏登录 申博会员登录 申博娱乐现金网直营 菲律宾太阳娱乐官网登入 申博亚洲官网登入
申博线路检测中心 www.811msc.com 沙龙游戏怎么登入 太阳城赌场太阳城直营网 申博代理开户登入 www.666msa.com
申博游戏安卓系统下载 菲律宾申博娱乐管理网 菲律宾太阳网娱乐登入 申博太阳城登入 www.123tyc.com 菲律宾申博娱乐直营网