Home 从0到1设计一个CPC分时自动投放系统(三):效果和评估
Post
Cancel

从0到1设计一个CPC分时自动投放系统(三):效果和评估

前言

上篇文章我们设计了一个简单的算法,并分析了的边界条件和边界情况。这篇文章,我们将评估推广通自动投放算法使用前和使用后的效果,看看实际情况是怎么样的。

参考基准

推广通投放的基准就是人工投放。一般分几种方式:

  • 方式一:设定一个价格基本不变:最偷懒、也是最方便的方式。把出价一直设为2元或者2.5元,最多上下浮动调整。这种方式一般不精准,不能根据时段分开,但是节省人力。

图为推广通金额消耗,纵坐标为“消耗金额(元)”,全天预算设定400,出价为3元,当天为周三。中间只在17:00左右更改过一次价格。可以看到凌晨消耗量较小,中午开始到下午消耗逐渐增多,到了夜间又减少。

设定一个基本不变的推广通金额消耗,纵坐标为“消耗金额(元)”,全天预算400,出价3元,当天为周三。中间只在17:00左右更改过一次价格。可以看到凌晨消耗量较小,中午开始到下午消耗逐渐增多,到了夜间又减少。
  • 方式二:在特定时间段内提升投放:适合预算较少的情况。这种策略一般适合想对时间精准投放的商户,把握黄金流量时间来投放。

按照时段投放,纵坐标为“消耗金额(元)”,全天预算400,当天为周三。在12:00~15:00,18:00前后,21:00前后时段投放比较多。这种方式需要专人管理推广通的投放。

按照时段投放,纵坐标为“消耗金额(元)”,全天预算400,当天为周三。在12:00~15:00,18:00前后,21:00前后时段投放比较多。这种方式需要专人管理推广通的投放。
  • 方式三:“拍脑门”投放:没有策略,随意投放。想加就加,想减就减,预算耗尽为止。

自动投放效果

参数设定

自动投放之前,我们先要设定时段和时段内的投放金额,用来模拟方式二。根据之前的分析,我们做出如下设定:

时段投放金额(元)
0:00~1:0020
1:01~7:0010
7:01~9:0010
9:01~12:0020
12:01~14:0080
14:01~17:0060
17:01~19:0080
19:01~21:0020
21:01~22:0060
22:01~24:0040
合计400

开始投放

我们按照之前的投放策略执行程序,执行结果如下:

按照时段投放,纵坐标为“消耗金额(元)”,全天预算400,当天为周三。可以看到投放点击量为111,点击均价3.6元。消耗主要集中在11:00, 14:00和18:00左右。但是效果并不好,因为时间虽然集中,但是点击均价过高。在这种情况下,注意12:00~14:00时段,设定的预算还提早消耗完毕。没有达到预期效果

按照时段投放,纵坐标为“消耗金额(元)”,全天预算400,当天为周三。可以看到投放点击量为111,点击均价3.6元。

从图里可以看到,消耗主要集中在11:00, 14:00和18:00。但是效果并不好,因为时间虽然集中,但是点击均价过高。在这种情况下,特别注意12:00~14:00时段,设定的预算还提早消耗完毕。并且,在夜间19:00左右,当日预算耗尽,导致晚上没有预算投放。总体来说,没有达到预期效果。

原因在哪里呢?

我们导出出价记录看看:

1月13日12:00~13:30分推广通自动投放记录,H列为点评出价,I列为美团出价

1月13日12:00~13:30分推广通自动投放记录,H列为点评出价,I列为美团出价

可以看到点评出价和美团出价极为不稳定,价格经常一下从2元跳到3~4元,只投放了5分钟立马就又降下来了。总的来说,“抖动”严重。

为什么会出现这样的情况呢?和开发同学对了一下以后,发现程序没有问题。于是验算了一下算法。最后发现是算法本身的问题。问题主要出在:

  • 出价上升太快,瞬间过高出价导致广告位过于靠前,一下吸引了太多流量1,于是预算流失太快。在下一次轮询时发现钱所剩无几,于是算法立即下调出价。
  • 这种情况频繁出现,导致平均出价过高,投放效果不佳。

改进

根据以上经验,我们将算法做出如下改进。

加入步长参数

改进公式:

\[P_{high} = \left\{\begin{matrix} 0.15 \cdot (P_{t} - P_{t-1}) + P_{t-1} & , P_{t}>P_{t-1} \\ P_{t} & , P_{t}\leq P_{t-1} \end{matrix}\right.\]

其中

\[P_{t} = \frac{t\cdot B \cdot \sum_{i=0}^{t-1}(P_i \cdot k_i)}{T\cdot b\cdot t} = \frac{B \cdot\sum_{i=0}^{t-1}(P_i\cdot k_i)}{T\cdot b}\]

改进后的公式设定了一个出价提升缓冲参数 0.15,可以让算法在提升出价时缓慢提升,不会一下子提升的太高,这样就可以抑制抖动。

经过调整后的推广通消耗,可见时段内的出价断层没有了

经过调整后的推广通消耗,可见时段内的出价断层没有了

至于为什么是 0.15,这个是我们试出来的参数,不仅能明显抑制抖动,而且可以保持出价在一个相对合适的范围。

再调取出价记录看看:

出价能够缓慢调整了,很棒

后面要做什么

投放策略的来源

尽管目前已经可以按照预设的时间段自动调整出价,但是仍然要事先设定时段内投放方案。投放方案是通过经验确定的,人的经验能靠得住吗。

技术宅从不相信人所谓的经验,于是,我问自己:能不能根据以往的投放经验,结合投放后的效果,来自动设定投放策略呢?

机器学习迷思

我于是很快想到。既然以前投放的记录是一条一条的数据,应该可以从这些数据出发,用机器学习的方式寻找规律,给出当前情况下最优的出价。

如果用机器学习,也许可以这样:

将以往投放记录和出价记录一起看作训练集 $X$ ,那么我们需要为每个 $ x_i \in X $ 设定一个分值,视为 $ yᵢ \in Y $ 。之后训练模型,有了模型就能预测出价了。2

最后一个问题:分数$y_i$应该怎么定义?

合理的方式是,从运营数据里估算一个值来定义$y_i$。一般来说,可供参考的数据可以是订单量、电话联系数、点击量等。

结语

这篇文章里,我们首先参考了人工投放方式,作为基线。然后,通过检查程序的出价记录和推广通的投放情况,我们发现了公式里的抖动问题并做了改进。结果还不错。

最后,我们提出了一个使用机器学习方法的思路。

大家可以期待一下,如果有机会,以后我们也许会尝试用机器学习处理推广通问题。

最后,我是个技术宅,如果文章中对于数学表述有不妥当的地方,请大家指出谢谢。

参考文献

1. 越靠前的广告位,出价越高。因为:消耗金额 = 单价 x 点击量,在竞价排名中,单价越高广告位越靠前,点击量越高。如果假设点击量和广告位的位置为幂律关系,而广告位的位置与出价为线性关系,那么消耗金额与单价也为幂律关系。 

2. 机器学习算法是如何工作的?:How Machine Learning Algorithms Work (they learn a mapping of input to output) (machinelearningmastery.com)

版权声明

知识共享许可协议

本作品采用知识共享署名 4.0 国际许可协议进行许可。

This post is licensed under CC BY 4.0 by the author.

从0到1设计一个CPC分时自动投放系统(二):设计和算法

让 Jekyll 支持 LaTex 数学公式(MathJax v3)