基于keras的多重营销归因研究

2024-04-16 04:24:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我曾多次参加三次市场营销活动。假设营销活动是独立的,每个都有自己的转换概率p\u A,p\u B,p\u C

campaigns = {
    'A': 0.1, # name, conversion probability
    'B': 0.2,
    'C': 0.4,
}

一些用户已转换为付费帐户。
我有一个数据帧,当每一行是一个用户,而列是用户暴露于特定活动的次数。你知道吗

   A  B  C  converted
0  3  1  0       True
1  0  0  1      False
2  3  1  1       True
3  1  3  2      False
4  1  0  0      False 

在这种情况下,总转换概率为:

1 - (1 - p_A) ** A * (1 - p_B) ** B * (1 - p_C) ** C

估计原始p_A, p_B, p_C的最佳方法是什么?你知道吗

我正在寻找一些keras解决方案,但我不知道如何设置自定义幂/指数层。我认为模型应该是这样的:

1 - (w_1 ** A) * (w_2 ** B) * (w_3 ** C) ~ predicted probability

但keras中既没有标准的电源,也没有产品层。你知道吗

生成完整示例的Python代码:

import numpy as np
import pandas as pd

np.random.seed(4)
n = 1000
data = pd.DataFrame(np.zeros(n), columns=['prob'])

campaigns = {
    'A': 0.1,
    'B': 0.2,
    'C': 0.4,
}

for campaign, conversion in campaigns.items():
    data[campaign] = np.random.geometric(1 / (1 + .5), n) - 1
    data['prob'] = 1 - (1 - data['prob']) * (1 - conversion) ** data[campaign]

data['converted'] = np.random.rand(n) < data['prob']
print(data.head())   

       prob  A  B  C  converted
0  0.416800  3  1  0       True
1  0.400000  0  0  1      False
2  0.650080  3  1  1       True
3  0.834112  1  3  2      False
4  0.100000  1  0  0      False

Tags: 用户importfalsetruedatanprandom概率
1条回答
网友
1楼 · 发布于 2024-04-16 04:24:11
from keras import backend as K
from keras.engine.topology import Layer
import numpy as np
from keras.backend import pow

class MyLayer(Layer):

    def __init__(self, output_dim, **kwargs):
        self.output_dim = output_dim
        super(MyLayer, self).__init__(**kwargs)

    def build(self, input_shape):
        # Create a trainable weight variable for this layer.
        self.kernel = self.add_weight(name='kernel',
                                      shape=(input_shape[1], self.output_dim),
                                      initializer='uniform',
                                      trainable=True)
        super(MyLayer, self).build(input_shape)  # Be sure to call this at the end

    def call(self, x):
        A,B,C,w_1,w_2,w_3=x[0],x[1],x[2],self.kernel[0],self.kernel[1],self.kernel[2]
        return  (1-(pow(w_1, A))*(pow(w_2, B))*(pow(w_3, C)))

    def compute_output_shape(self, input_shape):
        return (input_shape[0], self.output_dim)

此层表示以下公式:

1 - (w_1 ** A) * (w_2 ** B) * (w_3 ** C) ~ predicted probability

https://keras.io/layers/writing-your-own-keras-layers/ 这是我使用的模板,唯一需要更改的是调用函数。你知道吗

相关问题 更多 >