Efectos del tratamiento antisesgado con aprendizaje automático doble |  de Ryan O’Sullivan |  abril de 2024

IA causal, que explora la integración del razonamiento causal en el aprendizaje automático

Foto por Ales Nesetril en desempaquetar

Bienvenido a mi serie sobre IA causal, donde exploraremos la integración del razonamiento causal en modelos de aprendizaje automático. Espere explorar una serie de aplicaciones prácticas en diferentes contextos comerciales.

En el último artículo exploramos hacer que Causal Discovery funcione en entornos empresariales del mundo real. Esta vez cubriremos Efectos del tratamiento antisesgado con Double Machine Learning.

Si se perdió el último artículo sobre Causal Discovery, consúltelo aquí:

Este artículo demostrará por qué el aprendizaje automático doble es una parte esencial de la caja de herramientas de IA causal:

Espere obtener una comprensión profunda de:

  • Efectos promedio del tratamiento (ATE)
  • Los desafíos de utilizar la regresión lineal para estimar ATE
  • Doble aprendizaje automático y cómo supera los desafíos que enfrenta la regresión lineal
  • Un caso de estudio trabajado en Python que ilustra cómo aplicar el Double Machine Learning.

El cuaderno completo se puede encontrar aquí:

COMIÓ

ATE es el impacto promedio de un tratamiento o intervención en una población. Podemos calcularlo comparando el cambio promedio en una métrica elegida entre un grupo de tratamiento y de control.

Por ejemplo, imaginemos que un equipo de marketing está realizando una promoción. El grupo de tratamiento está formado por clientes que reciben una oferta, mientras que el grupo de control está formado por clientes que no la recibieron. Podemos calcular ATE comparando el número promedio de pedidos en el grupo de tratamiento y control.

Marco de resultados potenciales

El marco de resultados potenciales fue desarrollado por Donald Rubin y se ha convertido en un concepto fundamental en la inferencia causal. Intentemos entenderlo usando el ejemplo anterior del equipo de marketing.

  1. Asignación de tratamiento: Cada cliente tiene dos resultados potenciales, el resultado de estar en el grupo de tratamiento (oferta enviada) y el resultado de estar en el grupo de control (oferta no enviada). Sin embargo, sólo se observa un resultado potencial para cada cliente.
  2. Contrafácticos: El resultado potencial que no se observa es un contrafactual, por ejemplo, qué habría sucedido si este cliente estuviera en el grupo de control (no se hubiera enviado la oferta).
  3. Efecto causal: El efecto causal de un tratamiento es la diferencia entre los resultados potenciales bajo diferentes condiciones de tratamiento (oferta enviada versus no enviada).
  4. Estimacion: Los efectos causales se pueden estimar utilizando datos experimentales u observacionales utilizando una variedad de técnicas causales.

Se hacen varios supuestos para ayudar a garantizar que los efectos estimados sean válidos:

  • Supuesto de Valor de Tratamiento Unitario Estable (SUTVA): El resultado potencial para cualquier cliente no se ve afectado por la asignación de tratamiento de otros clientes.
  • Positividad: Para cualquier combinación de características, debe haber cierta probabilidad de que un cliente pueda recibir tratamiento o control.
  • Ignorabilidad: Se observan todos los factores de confusión que afectan tanto al tratamiento como al resultado.

Datos experimentales

Estimar ATE con datos experimentales es relativamente sencillo.

Los ensayos controlados aleatorios (ECA) o pruebas AB están diseñados para asignar aleatoriamente a los participantes a grupos de tratamiento y control. Esto garantiza que cualquier diferencia en los resultados pueda atribuirse al efecto del tratamiento y no a características preexistentes de los participantes.

Volvamos al ejemplo del equipo de marketing. Si dividen aleatoriamente a los clientes entre el grupo de tratamiento y el de control, la diferencia promedio en los pedidos es el efecto causal de la oferta enviada.

Datos observacionales

Estimar ATE utilizando datos observacionales es más desafiante.

El desafío más común son las variables de confusión que afectan tanto el tratamiento como el resultado. No controlar los factores de confusión dará lugar a estimaciones sesgadas del efecto del tratamiento. Volveremos a esto más adelante en el artículo en el estudio de caso trabajado.

Otros desafíos incluyen:

  • Sesgo de selección: la asignación del tratamiento está influenciada por factores relacionados con el resultado.
  • Efectos del tratamiento heterogéneos: el efecto del tratamiento varía entre los diferentes subgrupos de la población.

Descripción general

La regresión lineal se puede utilizar para estimar el ATE utilizando datos observacionales. Las características de tratamiento (T) y control (X) se incluyen como variables en el modelo.

Usar imagen generada

El coeficiente de la variable de tratamiento es el ATE: el cambio promedio en la variable de resultado asociado con un cambio unitario en la variable de tratamiento, manteniendo constantes las características de control.

Proceso de generación de datos

Podemos utilizar un proceso simple de generación de datos con un resultado, tratamiento y factor de confusión para ilustrar cómo podemos utilizar la regresión lineal para estimar ATE.

En primer lugar podemos visualizar el gráfico causal:

# Create node lookup variables
node_lookup = {0: 'Confounder',
1: 'Treatment',
2: 'Outcome'
}

total_nodes = len(node_lookup)

# Create adjacency matrix - this is the base for our graph
graph_actual = np.zeros((total_nodes, total_nodes))

# Create graph using expert domain knowledge
graph_actual[0, 1] = 1.0 # Confounder -> Treatment
graph_actual[0, 2] = 1.0 # Confounder -> Outcome
graph_actual[1, 2] = 1.0 # Treatment -> Outcome

plot_graph(input_graph=graph_actual, node_lookup=node_lookup)

Imagen generada por el usuario

Y luego podemos crear muestras utilizando el sencillo proceso de generación de datos. Preste mucha atención al coeficiente de la variable de tratamiento (0,75): esta es nuestra verdad fundamental ATE.

np.random.seed(123)

# Create dataframe with a confounder, treatment and outcome
df = pd.DataFrame(columns=['Confounder', 'Treatment', 'Outcome'])
df['Confounder'] = np.random.normal(loc=100, scale=25, size=1000)
df['Treatment'] = np.random.normal(loc=50, scale=10, size=1000) + 0.50 * df['Confounder']
df['Outcome'] = 0.25 * df['Confounder'] + 0.75 * df['Treatment'] + np.random.normal(loc=0, scale=5, size=1000)

sns.pairplot(df, corner=True)

Imagen generada por el usuario

Regresión lineal

Luego podemos entrenar un modelo de regresión lineal y extraer el coeficiente de la variable de tratamiento. Podemos ver que estima correctamente el ATE (0,75).

# Set target and features
y = df['Outcome']
X = df[['Confounder', 'Treatment']]

# Train model
model = RidgeCV()
model = model.fit(X, y)

# Extract the treatment coefficient
ate_lr = round(model.coef_[1], 2)

print(f'The average treatment effect using Linear Regression is: {ate_lr}')

Imagen generada por el usuario

Desafíos

La regresión lineal puede ser un método muy eficaz para estimar ATE. Sin embargo, existen algunos desafíos a tener en cuenta:

  • Tiene problemas cuando tenemos datos de alta dimensión.
  • Los “parámetros molestos” (las características de control que son “molestos” de estimar) pueden ser demasiado complejos para estimarlos mediante regresión lineal.
  • Se supone que el efecto del tratamiento es constante en diferentes subgrupos de la población (por ejemplo, sin heterogeneidad).
  • No asume factores de confusión no observados.
  • Supone que el efecto del tratamiento es lineal.

Descripción general

El aprendizaje automático doble es un método causal introducido por primera vez en 2017 en el artículo “Aprendizaje automático doble/desbiasado para el tratamiento y los parámetros estructurales”:

Su objetivo es reducir el sesgo y mejorar la estimación de los efectos causales en situaciones en las que tenemos datos de alta dimensión y/o parámetros molestos complejos.

Está inspirado en el teorema de Frisch-Waugh-Lovell, así que comencemos por entenderlo.

Teorema de Frisch-Waugh-Lovell

El teorema de FWL se utiliza para descomponer los efectos de múltiples regresores sobre una variable de resultado, lo que nos permite aislar efectos de interés.

Imagine que tiene dos conjuntos de funciones, X1 y X2. Podría estimar los parámetros del modelo mediante regresión lineal como hicimos antes. Sin embargo, también puedes obtener el mismo parámetro para X1 siguiendo estos pasos:

  1. Utilice X2 solo para predecir el resultado
  2. Utilice X2 solo para predecir X1
  3. Calcule los residuos del modelo de resultados (paso 1) y del modelo de características (paso 2)
  4. Haga una regresión de los residuos del modelo de resultados sobre los residuos del modelo de características para estimar el parámetro para X1

A primera vista, esto puede resultar bastante difícil de seguir, así que probémoslo en Python para ilustrarlo. Usamos los mismos datos que antes, pero tomamos la columna de tratamiento como X1 y la columna de factor de confusión como X2:

# Set treatment, outcome and confounder samples
treatment = df['Treatment'].to_numpy().reshape(-1,1)
outcome = df['Outcome'].to_numpy().reshape(-1,1)
confounder = df['Confounder'].to_numpy().reshape(-1,1)

# Train treatment model and calculate residuals
treatment_model = RidgeCV()
treatment_model = treatment_model.fit(confounder, treatment)
treatment_pred = treatment_model.predict(confounder)
treatment_residuals = treatment - treatment_pred

# Train outcome model and calculate residuals
outcome_model = RidgeCV()
outcome_model = outcome_model.fit(confounder, outcome)
outcome_pred = outcome_model.predict(confounder)
outcome_residuals = outcome - outcome_pred

# Train residual model and calculate average treatment effect
final_model = RidgeCV()
final_model = final_model.fit(treatment_residuals, outcome_residuals)
ate_dml = round(final_model.coef_[0][0], 2)

print(f'The average treatment effect is: {ate_fwl}')

Imagen generada por el usuario

Podemos ver que estima correctamente el coeficiente de la variable de tratamiento (0,75).

Aprendizaje automático doble

Double Machine Learning se basa en FWL aislando los efectos de las funciones de tratamiento y control y utilizando modelos flexibles de aprendizaje automático.

La primera etapa a menudo se denomina ortogonalización, ya que los parámetros molestos se estiman independientemente de la estimación del efecto del tratamiento.

Primera etapa:

  • Modelo de tratamiento (dessesgo): Modelo de aprendizaje automático utilizado para estimar la probabilidad de asignación de tratamiento (a menudo denominado puntuación de propensión). Luego se calculan los residuos del modelo de tratamiento.
  • Modelo de resultados (eliminación de ruido): Modelo de aprendizaje automático utilizado para estimar el resultado utilizando solo las funciones de control. Luego se calculan los residuos del modelo de resultados.

Segunda etapa:

  • Los residuos del modelo de tratamiento se utilizan para predecir los residuos del modelo de resultados.

El coeficiente del modelo de segunda etapa es el ATE. Vale la pena señalar que el modelo de la segunda etapa es un modelo lineal, lo que significa que asumimos que nuestro efecto de tratamiento es lineal (es por eso que llamamos al DML un modelo parcialmente lineal).

En lugar de codificarlo nosotros mismos, podemos usar el paquete EconML de Microsoft. EconML tiene implementadas una amplia gama de técnicas de ML causal, incluidas varias implementaciones de DML:

# Train DML model
dml = LinearDML(discrete_treatment=False)
dml.fit(df['Outcome'].to_numpy().reshape(-1,1), T=df['Treatment'].to_numpy().reshape(-1,1), X=None, W=df['Confounder'].to_numpy().reshape(-1,1))

# Calculate average treatment effect
ate_dml = round(dml.ate()[0], 2)

print(f'The average treatment effect using the DML is: {ate_dml}')

Imagen generada por el usuario

Nuevamente podemos ver que estima correctamente el coeficiente de la variable de tratamiento (0,75).

Fondo

El equipo de Marketing envía ofertas atractivas a clientes seleccionados. Actualmente no presentan una muestra de clientes seleccionada al azar para medir el impacto de las ofertas.

Se pide al equipo de ciencia de datos que estime cómo las ofertas afectan los pedidos de los clientes.

Sesgo de confusión

Comparar ingenuamente a los clientes a los que se les enviaron ofertas y a los que no es sesgado. Esto se debe a factores de confusión:

  • Los clientes que optan por no recibir correo electrónico no pueden recibir una oferta: esta población está menos comprometida y es menos probable que realice pedidos.
  • El equipo de CRM se dirige a los clientes en función de su historial de pedidos; el historial de pedidos afecta la probabilidad de que vuelva a realizar un pedido.

Proceso de generación de datos

Configuramos un proceso de generación de datos con las siguientes características:

  • Parámetros difíciles y molestos
  • Efecto del tratamiento simple (sin heterogeneidad)

Las características X son características del cliente tomadas antes del tratamiento:

Imagen generada por el usuario

T es una bandera binaria que indica si el cliente recibió la oferta.

Imagen generada por el usuario
np.random.seed(123)

# Set number of observations
n=100000

# Set number of features
p=10

# Create features
X = np.random.uniform(size=n * p).reshape((n, -1))

# Nuisance parameters
b = (
np.sin(np.pi * X[:, 0] * X[:, 1])
+ 2 * (X[:, 2] - 0.5) ** 2
+ X[:, 3]
+ 0.5 * X[:, 4]
+ X[:, 5] * X[:, 6]
+ X[:, 7] ** 3
+ np.sin(np.pi * X[:, 8] * X[:, 9])
)

# Create binary treatment
T = np.random.binomial(1, expit(b))

# Set treatment effect
tau = 0.75

# Calculate outcome
y = b + T * tau + np.random.normal(size=n)

El código Python del proceso de generación de datos se basa en el creador de datos sintéticos del paquete Ubers Causal ML. Ser capaz de crear datos sintéticos realistas es crucial cuando se trata de evaluar métodos de inferencia causal, por lo que te recomiendo que lo consultes:

Regresión lineal

Comenzamos usando regresión lineal para estimar el ATE. Nuestra expectativa es que tendrá dificultades para capturar los parámetros molestos y luego potencialmente especificar incorrectamente el efecto del tratamiento.

# Append features and treatment
X_T = np.append(X, T.reshape(-1, 1), axis=1)

# Train linear regression model
model = RidgeCV()
model = model.fit(X_T, y)
y_pred = model.predict(X_T)

# Extract the treatment coefficient
ate_lr = round(model.coef_[-1], 2)

print(f'The average treatment effect using Linear Regression is: {ate_lr}')

Imagen generada por el usuario

Doble aprendizaje automático

Luego entrenamos un modelo DML utilizando LightGBM como modelos flexibles de primera etapa. Esto debería permitirnos capturar los parámetros molestos difíciles mientras calculamos correctamente el efecto del tratamiento.

np.random.seed(123)

# Train DML model using flexible stage 1 models
dml = LinearDML(model_y=LGBMRegressor(), model_t=LGBMClassifier(), discrete_treatment=True)
dml.fit(y, T=T, X=None, W=X)

# Calculate average treatment effect
ate_dml = round(dml.ate(), 2)

print(f'The average treatment effect using the DML is: {ate_dml}')

Imagen generada por el usuario

Comparación

Cuando comparamos los resultados, observamos que la regresión lineal nos da una estimación sesgada, mientras que DML está muy cerca de la verdad fundamental. ¡Esto realmente muestra el poder de DML!

# Plot comparison of results
categories = ['Ground truth', 'DML', 'Linear Regression']
sns.barplot(x=categories, y=[tau, ate_dml, ate_lr])
plt.ylabel('ATE')
plt.title('Average Treatment Effect comparison')
plt.show()
Imagen generada por el usuario

Hay varios otros métodos causales que podemos usar para estimar ATE (muchos de los cuales están implementados tanto en los paquetes EconML como en CausalML):

  • Emparejamiento por puntuación de propensión (PSM)
  • Emparejamiento por puntuación de propensión inversa (IPSM)
  • S-aprendiz
  • T-aprendiz
  • Estudiante doblemente robusto (DR)
  • Aprendice de variable instrumental (IV)

Si desea profundizar más en estos métodos, le recomendaría comenzar con S-Learner y T-Learner (a menudo denominados metaaprendices). Un par de aprendizajes clave que le ayudarán a empezar a determinar cuándo y dónde podría aplicarlos:

  • Cuando su tratamiento es binario y el tamaño de su tratamiento y control está igualmente equilibrado, el T-Learner suele ser una alternativa más sencilla a la DML.
  • Cuando su tratamiento es continuo y sospecha que el efecto del tratamiento puede no ser lineal, S-Learner puede ser más apropiado que DML.
  • Los metaaprendices pueden tener problemas con el sesgo de regularización (particularmente el S-learner). Cuando vemos que DML supera a los metaaprendices, esta suele ser la razón.