tanh_saturación_de_referencia#
- pymc_marketing.mmm.transformers.tanh_saturation_baselined(x, x0, gain=0.5, r=0.5)[fuente]#
Saturación Tanh de referencia.
Esta parametrización es más fácil de usar que
tanh_saturation()para aplicaciones industriales donde el conocimiento del dominio es esencial.En resumen, se presenta una parametrización alternativa de la función de alcance dada por:
\[\begin{split}\begin{align} c_0 &= \frac{r}{g \cdot \arctan(r)} \\ \beta &= \frac{g \cdot x_0}{r} \\ \operatorname{saturation}(x, \beta, c_0) &= \beta \cdot \tanh \left( \frac{x}{c_0 \cdot \beta} \right) \end{align}\end{split}\]donde:
\(x_0\) es el «punto de referencia». Este es un punto elegido por el usuario (no se proporciona un previo) donde espera que la mayor parte de sus datos se encuentre. Por ejemplo, si está gastando entre 50 y 150 dólares en un canal particular, podría elegir \(x_0 = 100\). El valor sugerido es el gasto mediano del canal:
np.median(spend).\(g\) es la «ganancia», que es el valor del CAC (\(c_0\)) en el punto de referencia. Debe establecer un previo sobre lo que piensa que es el CAC cuando gasta \(x_0 = 100\). Imagine que tiene cuatro canales de publicidad y adquirió 1000 nuevos usuarios. Si cada canal tuvo un rendimiento igualmente bueno, y la publicidad impulsó todas las ventas, podría esperar que ganó 250 usuarios de cada canal. Aquí, su «ganancia» sería \(250 / 100 = 2.5\). El previo sugerido es
pm.Exponential.\(r\), la fracción de gasto excesivo te está indicando dónde se encuentra el punto de referencia.
\(0\) - podemos aumentar nuestro presupuesto considerablemente para alcanzar la región saturada, los rendimientos decrecientes aún no son visibles.
\(1\) - el punto de referencia ya se encuentra en la región de saturación y el gasto adicional en dólares no conducirá a nuevos usuarios.
\(0.8\), aún puedes aumentar los usuarios adquiridos en \(50\%\) tanto como obtienes en el punto de referencia al aumentar el presupuesto. El efecto de \(x_0\) está a un 20% del punto de saturación.
Sugerido anterior es
pm.Beta
Nota
El punto de referencia \(x_0\) debe establecerse dentro del rango de los gastos reales. Es decir, si compras anuncios tres veces y gastas \(5\), \(6\) y \(7\) dólares, \(x_0\) debe establecerse dentro de \([5, 7]\), por lo que no puede ser \(4\) ni \(8\). De lo contrario, la posterior de r y la ganancia se convierte en una línea diagonal delgada. Podría ser muy relevante si hay muy pocas observaciones de gasto para un canal particular.
La función original de alcance o saturación utilizada en un MMM se formula como
\[\operatorname{saturation}(x, \beta, c_0) = \beta \cdot \tanh \left( \frac{x}{c_0 \cdot \beta} \right)\]donde:
\(\beta\) es la saturación, o el límite del número total de nuevos usuarios obtenidos cuando se gastan una cantidad infinita de dólares en ese canal.
\(c_0\) es el costo por adquisición (CAC0), por lo que el costo inicial por nuevo usuario.
\(\frac{1}{c_0}\) es el inverso del CAC0, por lo que es el número de nuevos usuarios que podríamos esperar después de gastar nuestro primer dólar.
- Parámetros:
- x
tensor Tensor de entrada.
- x0: tensor
Línea base para la saturación.
- ganancia :
tensor,pordefecto 0.5tensor, por defecto 0.5 ROAS en el punto base, matemáticamente como \(ganancia = f(x0) / x0\).
- r :
tensor,pordefecto 0.5tensor, por defecto 0.5 La fracción de gasto excesivo, matemáticamente como \(r = f(x0) / \text{saturation}\).
- x
- Devoluciones:
tensorTensor transformado.
Referencias
Desarrollado por Max Kochurov y Aziz Al-Maeeni, realizando un trabajo innovador en PyMC Labs.
Ejemplos
import pymc as pm import numpy as np x_in = np.exp(3+np.random.randn(100)) true_cac = 1 true_saturation = 100 y_out = abs(np.random.normal(tanh_saturation(x_in, true_saturation, true_cac).eval(), 0.1)) with pm.Model() as model_reparam: r = pm.Uniform("r") gain = pm.Exponential("gain", 1) input = pm.ConstantData("spent", x_in) response = pm.ConstantData("response", y_out) sigma = pm.HalfNormal("n") output = tanh_saturation_baselined(input, np.median(x_in), gain, r) pm.Normal("output", output, sigma, observed=response) trace = pm.sample()