一、概述
机器学习主要面对两类问题:回归和分类。不过一个问题属于分类还是回归的界定却并不清晰。比如点击率预估输入样本的Label是0-曝光和1-点击,输出的是用户点击的概率,是一个连续值,你说点击率是回归问题还是分类问题?从目标来看输出一个率值而非类别应该算回归,但从输入来看是标签离散的,应该算是分类。
本质上这两类问题是一体两面的,分类模型可将回归模型的输出离散化,回归模型也可将分类模型的输出连续化,主要看任务目标是什么。分类和回归最大的不同可能在于对于损失函数的选择上。主要区别在于:
损失函数的一般表示为 L(y,f(x)),用以衡量真实值 y和预测值 f(x)之间不一致的程度,一般越小越好。为了便于不同损失函数的比较,常将其表示为单变量的函数,在回归问题中这个变量为 [y-f(x)] :残差表示,在分类问题中则为 yf(x) : 趋势一致。
二、处理回归问题
(1) tf.losses.mean_squared_error:均方根误差(MSE) —— 回归问题中最常用的损失函数
- 优点: 便于梯度下降,误差大时下降快,误差小时下降慢,有利于函数收敛。
- 缺点: 受明显偏离正常范围的离群样本的影响较大
# Tensorflow中集成的函数
mse = tf.losses.mean_squared_error(y_true, y_pred)
# 利用Tensorflow基础函数手工实现
mse = tf.reduce_mean(tf.square(y_true - y_pred))
(2)tf.losses.absolute_difference:平均绝对误差(MAE) —— 想格外增强对离群样本的健壮性时使用
- 优点:克服了 MSE 的缺点,受偏离正常范围的离群样本影响较小。
- 缺点:收敛速度比 MSE 慢,因为当误差大或小时其都保持同等速度下降,而且在某一点处还不可导,计算机求导比较困难。
maes = tf.losses.absolute_difference(y_true, y_pred)
maes_loss = tf.reduce_sum(maes)
(3)tf.losses.huber_loss:Huber loss —— 集合 MSE 和 MAE 的优点,但是需要手动调超参数
核心思想是,检测真实值(y_true)和预测值(y_pred)之差的绝对值在超参数 δ 内时,使用 MSE 来计算 loss, 在 δ 外时使用类 MAE 计算 loss。sklearn 关于 huber 回归的文档中建议将 δ=1.35 以达到 95% 的有效性。
hubers = tf