模型纠偏之保序回归

Posted luchi007

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模型纠偏之保序回归相关的知识,希望对你有一定的参考价值。

模型纠偏背景

广告系统和推荐系统有个显著的不同,广告模型要求预估值绝对的准确,而推荐模型大部分只要求序一致就行,主要是因为广告的模型设计到计费逻辑,所以需要保证预估绝对值的准确性,模型层面上,可以尽量保证特征、数据样本要做到准确,尽管如此,仍然模型可能存在预估的偏差,那么在模型层面之外,就需要一个更加强有力的纠偏策略,这也是本文介绍的点
reference

本文主要参考

[1]Predicting Good Probabilities With Supervised Learning
[2]ACTIVE SET ALGORITHMS FOR ISOTONIC REGRESSION; A UNIFYING FRAMEWORK
[3]1.15. Isotonic regression

两种纠偏方法

Platt Calibration

对于某个模型输出值f(x),platt calibration的方法是将f(x)当做输入,再去训练交叉熵模型

f为原始模型预估值,A和B为训练参数

相当于再套了一层模型来做参数调整

保序回归 Isotonic Regression

保序回归问题定义:
这里用sklearn的定义:

上式 w i w_i wi 为样本i的权重, y i y_i yi 为样本真实值(实际一般是后验), y i ^ \\haty_i yi^ 为要求解的值, x i x_i xi为样本i的模型预估值,需要保证的是对于任意的 x i ≤ x j x_i \\le x_j xixj都有 y i ^ ≤ y j ^ \\haty_i \\leq \\haty_j yi^yj^ 这也就是保序的由来
保序的场景:在广告系统中,模型预估值会作用到后面的ranking排序,对于一个pv有n条候选,会预估出n个预估值 x i x_i xi ,同时会有对应的n个历史统计后验值 y i y_i yi(一般是离线统计存在redis或者其他的存储介质里),保序回归需要在不能影响模型预估的序的情况下,做到纠偏值 y i ^ \\haty_i yi^ 尽量接近后验 y i y_i yi
求解方法
求解上述问题的方法又多种,这里介绍常见的一种,称之为PAVA的算法(reference[2]),PAV求解步骤如下

翻译成人话,举个例子
5个样本,模型 x i x_i xi 预估值分别是 0.1 0.2 0.3 0.4 0.5,假设样本 w i w_i wi 权重都是1,真实后验 y i y_i yi 值是 0.3 0.4 0.2 0.0 0.6,求解步骤如下:

  • 对元组 ( x i , y i ) (x_i,y_i) (xi,yi)先按照 x i x_i xi从小到大排序(以增序为例)
  • x 0 x_0 x0 对应的 y 0 y_0 y0开始,观察其后面的后验值是否大于前面,观察到0.3<0.4是递增序,那么 y i ^ \\haty_i yi^=0.3记为第一个 b l o c k 0 block_0 block0 ,同时将索引移动到 x 1 x_1 x1
  • 发现0.2<0.4, 则将 y 1 y_1 y1 y 2 y_2 y2 都记为 b l o c k 1 block_1 block1,计算 b l o c k 1 block1 block1的平均值为0.3(如果权重不是1的话,那么计算加权平均值),再往后面观察,发现0.1仍然小于0.3,那么将0.1 也加到 b l o c k 1 block1 block1中,同时重新计算平均值为0.2,继续观察0.2<0.6,则 b l o c k 1 block1 block1停止拓展,其预估值为0.2
  • 继续移动索引,到0.6,因为是最后一个元素且是新的 b l o c k block block,则 b l o c k 3 block3 block3为0.6
  • 现在有3个 b l o c k block block,每个 b l o c k block block对应的值为0.3 0.2 0.6,显然仍然需要继续计算,重复上面计算过程最终会得到2个 b l o c k block block,第一个 b l o c k block block包含前4个元素,值为0.225,第二个 b l o c k block block包含一个元素,值为0.6

代码验证一下:

from sklearn.isotonic import IsotonicRegression
from matplotlib.collections import LineCollection
x = [0.1,0.2,0.3,0.4,0.5]
y = [0.3,0.4,0.2,0.0,0.6]
ir = IsotonicRegression()
y_ = ir.fit_transform(x, y)
y_
array([0.225, 0.225, 0.225, 0.225, 0.6 ])
其纠偏图如下

最后补充一个比较生动展示纠偏过程的动图,作为总结(图片来自Isotonic Regression,非营利性目的使用,若有侵权,请联系该账号简介中的邮箱,速删 ):

以上是关于模型纠偏之保序回归的主要内容,如果未能解决你的问题,请参考以下文章

模型纠偏之保序回归

模型纠偏之保序回归

机器学习:保序回归(IsotonicRegression):一种可以使资源利用率最大化的算法

MLlib--保序回归

stanford coursera 机器学习编程作业 exercise 5(正则化线性回归及偏差和方差)

基于Isotonic回归(保序回归算法)的鸢尾花数据集回归问题