回归算法的损失函数
创建预测序列和目标序列作为张量,预测序列是-1和1之间的等差数列。
x_vals = tf.linspace(-1.0, 1.0, 500)
target = tf.constant(0.0)
1、L2正则损失函数(欧拉损失函数)。L2损失函数是预测值和目标值差值的平方和。L2正则损失函数是非常有用的损失函数,因为它在目标值附近有更好的曲度,机器学习算法利用这点收敛,并且离目标越近收敛越慢。
l2_y_vals = tf.square(target - x_vals)
l2_y_out = sess.run(l2_y_vals)
2、L1正则损失函数(即绝对值损失函数)。与L2正则损失函数对差值求平方和不同的是L1正则损失函数对差值求绝对值。L1正则目标值附近不平滑,这会导致算法不能很好地收敛。
l1_y_vals = tf.abs(target - x_vals)
l1_y_out = sess.run(l1_y_vals)
3、Pseudo_Huber损失函数是Huber损失函数的连续、平滑估计,试图利用L1和L2正则削减极值处的陡峭,使得目标值附近连续。它的表达式依赖参数delta。
delta1 = tf.constant(0.25)
phuber1_y_vals = tf.multiply(tf.square(delta1), tf.sqrt(1.0 + tf.square((target - x_vals)/delta1)) - 1.0)
phuber1_y_out = sess.run(phuber1_y_vals)
delta2 = tf.constant(5.0)
phuber2_y_vals = tf.multiply(tf.square(delta2), tf.sqrt(1.0 + tf.square((target - x_vals)/delta2)) - 1.0)
phuber2_y_out = sess.run(phuber2_y_vals)
评估预测分类结果的分类损失函数
重新给x_val和target赋值,计算两个目标类(-1,1)之间的损失。所以预测值越离1越近,损失函数越小。
x_vals_2 = tf.linspace(-3.0, 5.0, 500)
target_2 = tf.constant(1.0)
targets_2 = tf.fill([500,], 1.0)
4、Hinge损失函数主要用来评估支持向量机算法,但是有时也会用来评估神经网络算法。
hinge_y_vals = tf.maximum(0.0, 1.0 - tf.multiply(target_2, x_vals_2))
hinge_y_out = sess.run(hinge_y_vals)
5、交叉熵函数(Cross-entropy loss)又是也作为逻辑损失函数。度量预测值和真实值之间的距离。
xentropy_y_vals = - tf.multiply(target_2, tf.log(x_vals_2)) - tf.multiply((1.0 - target_2), tf.log(1.0 - x_vals_2))
xentropy_y_out = sess.run(xentropy_y_vals)
6、Sigmoid交叉熵损失函数(Sigmoid cross entropy loss)与交叉熵函数非常像,有一点不同的是,它把x_vals通过sigmoid函数转换,在计算交叉熵函数。
xentropy_sigmoid_y_vals = tf.nn.sigmoid_cross_entropy_with_logits(logits=x_vals_2, labels=targets_2)
xentropy_sigmoid_y_out = sess.run(xentropy_sigmoid_y_vals)
7、加权交叉熵损失函数(Weighted cross entropy)是Sigmoid交叉熵函数的加权,对正目标加权。
weight = tf.constant(0.5)
xentropy_weighted_y_vals = tf.nn.weighted_cross_entropy_with_logits(logits=x_vals_2, targets=targets_2, pos_weight=weight)
xentropy_weighted_y_out = sess.run(xentropy_weighted_y_vals)
8、Softmax交叉熵损失函数是作用于非归一化的输出结果,只针对单个目标分类的计算损失。通过softmax函数将输出结果转化成概率分布,然后计算真值概率分布的损失。
unscaled_logits = tf.constant([[1.0, -3.0, 10.0]])
target_dist = tf.constant([[0.1, 0.02, 0.88]])
softmax_xentropy = tf.nn.softmax_cross_entropy_with_logits_v2(logits=unscaled_logits, labels=target_dist)
print(sess.run(softmax_xentropy))
#[1.1601256]
9、稀疏Softmax交叉熵损失函数(Sparse softmax cross-entropy loss)和上一个损失函数类似,它是把目标分类为true的转化成index,而Softmax交叉熵损失函数将目标转成概率分布。
sparse_target_dist = tf.constant([2])
sparse_xentropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=unscaled_logits, labels=sparse_target_dist)
print(sess.run(sparse_xentropy))
#[0.00012564]
完整代码如下:(注意labels和logits参数)
#-*- coding:utf-8 -*-
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
sess = tf.Session()
#==============================================================
x_vals = tf.linspace(-1.0, 1.0, 500)
target = tf.constant(0.0)
#L2
l2_y_vals = tf.square(target - x_vals)
l2_y_out = sess.run(l2_y_vals)
#L1
l1_y_vals = tf.abs(target - x_vals)
l1_y_out = sess.run(l1_y_vals)
#PH
delta1 = tf.constant(0.25)
phuber1_y_vals = tf.multiply(tf.square(delta1), tf.sqrt(1.0 + tf.square((target - x_vals)/delta1)) - 1.0)
phuber1_y_out = sess.run(phuber1_y_vals)
delta2 = tf.constant(5.0)
phuber2_y_vals = tf.multiply(tf.square(delta2), tf.sqrt(1.0 + tf.square((target - x_vals)/delta2)) - 1.0)
phuber2_y_out = sess.run(phuber2_y_vals)
#==============================================================
x_vals_2 = tf.linspace(-3.0, 5.0, 500)
target_2 = tf.constant(1.0)
targets_2 = tf.fill([500,], 1.0)
#hinge
hinge_y_vals = tf.maximum(0.0, 1.0 - tf.multiply(target_2, x_vals_2))
hinge_y_out = sess.run(hinge_y_vals)
#ce
xentropy_y_vals = - tf.multiply(target_2, tf.log(x_vals_2)) - tf.multiply((1.0 - target_2), tf.log(1.0 - x_vals_2))
xentropy_y_out = sess.run(xentropy_y_vals)
#sigmoid
xentropy_sigmoid_y_vals = tf.nn.sigmoid_cross_entropy_with_logits(logits=x_vals_2, labels=targets_2)
xentropy_sigmoid_y_out = sess.run(xentropy_sigmoid_y_vals)
#wce
weight = tf.constant(0.5)
xentropy_weighted_y_vals = tf.nn.weighted_cross_entropy_with_logits(logits=x_vals_2, targets=targets_2, pos_weight=weight)
xentropy_weighted_y_out = sess.run(xentropy_weighted_y_vals)
#sce
unscaled_logits = tf.constant([[1.0, -3.0, 10.0]])
target_dist = tf.constant([[0.1, 0.02, 0.88]])
softmax_xentropy = tf.nn.softmax_cross_entropy_with_logits_v2(logits=unscaled_logits, labels=target_dist)
print(sess.run(softmax_xentropy))
#ssce
sparse_target_dist = tf.constant([2])
sparse_xentropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=unscaled_logits, labels=sparse_target_dist)
print(sess.run(sparse_xentropy))
#display
x_array = sess.run(x_vals)
plt.plot(x_array, l2_y_out, 'b-', label='L2 Loss')
plt.plot(x_array, l1_y_out, 'r--', label='L1 Loss')
plt.plot(x_array, phuber1_y_out, 'k--', label='P-Huber Loss (0.25)')
plt.plot(x_array, phuber2_y_out, 'g:', label='P-Huber Loss (5.0)')
plt.ylim(-0.2, 0.4)
plt.legend(loc='lower right', prop={'size':11})
plt.show()
x_array_2 = sess.run(x_vals_2)
plt.plot(x_array_2, hinge_y_out, 'b-', label='Hinge Loss')
plt.plot(x_array_2, xentropy_y_out, 'r--', label='Cross Entropy Loss')
plt.plot(x_array_2, xentropy_sigmoid_y_out, 'k--', label='Cross Entropy Sigmoid Loss')
plt.plot(x_array_2, xentropy_weighted_y_out, 'g:', label="Weighted Cross Enropy Loss (x0.5)")
plt.ylim(-1.5, 3)
plt.legend(loc='lower right', prop={'size':11})
plt.show()
结果图:
=========================================================================
一些其他指标来评价机器学习模型
模型指标 | 描述 |
R平方值 | 对简单的线性模型来讲,用于度量因变量的变异中可由自变量解释部分所占的比例 |
RMSE(平方差) | 对连续模型来讲,平方差是度量预测的值和观察到的值之差的样本标准差 |
混淆矩阵(Confusion matrix) | 对分类模型来讲,以矩阵形式将数据集中的记录按照真实的记录按照真实的类别与分类模型预测的分类判断两个标准进行分析汇总,其每一列代表预测值,每一行代表的是实际的类别。理想情况下,混淆矩阵是对角矩阵 |
召回率(Recall) | 对于分类模型来讲,召回率是正类预测为正类数与所有预测正类数的比值 |
精准度(Precision) | 对于分类模型来讲,精准度是正类预测为正类数与所有实际正类值的比值 |
F-值(F-score) | 对于分类模型来讲,F值是召回率和精准度的调和平均数 |