设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 创业者 数据 手机
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

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

发布时间:2019-11-11 19:08 所属栏目:21 来源:CDA数据分析师
导读: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

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次的迭代后,我们得到以下图表:

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

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(良性)。

这是我们数据的散点图:

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

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优化器来实现分类。这是因为随着参数数量的增加,数学以及代码将变得难以理解。

这是我们数据的散点图:

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

1.多分类交叉熵损失

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

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

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读