Я несколько раз участвовал в трех маркетинговых кампаниях A, B, C
Пусть говорят, что маркетинговые события независимы, и каждая из них имеет свою собственную вероятность преобразования p_A, p_B, p_C.
campaigns = {
'A': 0.1, # name, conversion probability
'B': 0.2,
'C': 0.4,
}
Некоторые пользователи конвертируются в платные аккаунты.
У меня есть dataframe, когда каждая строка является пользователем, а столбец - это количество раз, когда пользователь подвергался определенной кампании.
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
но нет ни стандартной мощности, ни слоев продукта в керасе.
Код 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
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/ Это шаблон, который я использовал. Единственное, что мне пришлось изменить, это функция вызова.