Double/Debiased ML — Chernozhukov et al.

Neyman Orthogonality 와 Cross-Fitting 의 ATE 통계 추론

Double/Debiased Machine Learning (DML, Chernozhukov et al. 2018) — ML 추정의 bias 를 통계적으로 제거. (1) Naive plug-in 의 regularization biasoverfitting bias, (2) Neyman orthogonality 의 정의 — score function 의 nuisance parameter derivative = 0, (3) Cross-fitting 의 메커니즘 — K-fold 로 nuisance ML 추정과 target parameter 추정 분리, (4) ATE 의 DML 추정량 + asymptotic normality, (5) CATE 로의 확장 — DR-Learner with cross-fitting, (6) EconML LinearDML, SparseLinearDML 사례 코드.

Experimentation
Causal Inference
Machine Learning
저자

Kwangmin Kim

공개

2026년 05월 09일

출처

이 글은 사전지식 기반 (교재 미확인 — agent 사전학습 기반). 핵심 정리는 Chernozhukov et al. (2018) Econometrics J. 원논문에 한해 명시.

이 글은 Phase J 시리즈의 12 번째 글이자 J-MLHTE 시리즈의 마지막 글. ML 의 통계적 신뢰성 을 보장하는 Double/Debiased Machine Learning (DML) — 가장 영향력 있는 framework — 을 다룬다.

1 진입 직관 — “ML 의 bias 를 ML 로 제거”

ML 알고리즘은 예측 정확성 우선. 그러나 인과 추론 에서:

  1. Regularization: ML 의 과적합 방지bias 도입
  2. Overfitting: 같은 데이터로 모든 단계 추정 시 noise 학습

Chernozhukov 등의 통찰: 이 두 bias 를 2 가지 도구 로 제거:

  1. Neyman Orthogonality: Score 함수가 nuisance parameter 변화에 robust
  2. Cross-Fitting: 데이터 K-fold 분할 — 한 fold 의 ML 추정으로 다른 fold 의 target 추정

결과: ML 추정량이 asymptotically normal + valid 신뢰구간.

비유 — 회전 도료: 페인트 칠할 때 한 면 칠하고 마르기 기다린 후 다른 면. 같은 면을 반복적으로 칠하면 두께 불균일. Cross-fitting 은 같은 데이터 의 반복 사용 회피.

2 Naive Plug-In 의 두 Bias

2.1 Setup

관찰 데이터 \((X, A, Y)\). 목표: ATE 추정 \(\theta_0 = \mathbb{E}[Y^{a=1} - Y^{a=0}]\).

Conditional exchangeability: \(Y^a \perp A | X\).

Doubly robust score:

\[ \psi(W; \theta, \eta) = \frac{A(Y - \mu(X, 1))}{e(X)} + \mu(X, 1) - \frac{(1-A)(Y - \mu(X, 0))}{1-e(X)} - \mu(X, 0) - \theta \]

Nuisance parameters: \(\eta = (\mu, e)\) (outcome regression, propensity score).

2.2 Naive Plug-In

ML 로 \(\hat{\mu}, \hat{e}\) 추정 → score 에 대입 → ATE 추정:

\[ \hat{\theta} = \frac{1}{n} \sum_i \hat{\psi}_i \]

2.3 Bias 1: Regularization Bias

ML 의 과적합 방지 가 nuisance 추정을 biased 만듦. 예측 정확 하지만 통계적 추정량 으로는 잘못.

예: Ridge regression 의 \(\beta_{\text{ridge}} \neq \beta_{\text{true}}\)bias 도입.

2.4 Bias 2: Overfitting Bias

같은 데이터로 \(\hat{\mu}, \hat{e}\) + ATE 모두 추정. Noise 학습 + correlation 발생. 추정량 biased + invalid 분산.

3 Neyman Orthogonality

3.1 정의

Score \(\psi(W; \theta, \eta)\)Neyman orthogonal ↔︎

\[ \frac{\partial}{\partial \eta} \mathbb{E}[\psi(W; \theta_0, \eta)] \Big|_{\eta = \eta_0} = 0 \]

score function 의 nuisance parameter 미분0 (true value 에서).

3.2 함의

Nuisance parameter 의 작은 추정 오차target parameter 추정영향 없음. Robustness.

3.3 Doubly Robust Score 가 Neyman Orthogonal

위 doubly robust score 는 Neyman orthogonality 를 만족. 따라서 DML framework 에 적합.

3.4 직관

나침반의 자북 비유. Neyman orthogonal score 는 근처에서 흔들려도 정확한 방향. Non-orthogonal score 는 작은 흔들림에 큰 오차.

4 Cross-Fitting

4.1 알고리즘

DML with Cross-Fitting
Input: (X, A, Y) data, K (fold 수, 예: 5)

Step 1: Random K-fold split
  D_1, D_2, ..., D_K (각 fold 가 데이터의 1/K)

Step 2: For k = 1 to K:
  - Training data: D_(-k) = D \ D_k
  - ML on D_(-k):
    μ̂^(k)(x, a) = E[Y | X=x, A=a]   (outcome regression)
    ê^(k)(x) = P(A=1 | X=x)           (propensity score)
  - Apply ML to D_k:
    Compute ψ_i(W_i; θ, μ̂^(k), ê^(k)) for i in D_k

Step 3: ATE 추정
  θ̂ = (1/n) sum over all i: ψ_i

4.2 메커니즘

각 fold 의 score 가 다른 fold 로 학습된 ML 에 의존. 같은 데이터로 학습 + 추정 회피 → overfitting 차단.

4.3 평균화

모든 fold 의 score 평균 → ATE 추정. 전체 데이터 사용 + cross-fitting 의 robustness.

5 Asymptotic Normality

5.1 Theorem (Chernozhukov et al. 2018)

Neyman orthogonality + cross-fitting + ML 의 consistency rate \(n^{-1/4}\) 충족 시:

\[ \sqrt{n} (\hat{\theta} - \theta_0) \xrightarrow{d} \mathcal{N}(0, \sigma^2) \]

ML 추정량이 고전 통계 추론에 적합. 신뢰구간·p-value 계산 가능.

5.2 \(n^{-1/4}\) Rate

ML 의 수렴 속도\(n^{-1/4}\) 이상이면 OK. Random Forest, Lasso, Neural Network 등 표준 ML 이 이 조건 충족.

함의: ML 의 정확도가 매우 높을 필요 없음. 적당한 정확도 면 ATE 추정에 충분.

6 DML 의 ATE 추정 — 깊이

6.1 Doubly Robust Score (recall)

\[ \psi_i = \frac{A_i(Y_i - \mu_1(X_i))}{e(X_i)} + \mu_1(X_i) - \frac{(1-A_i)(Y_i - \mu_0(X_i))}{1-e(X_i)} - \mu_0(X_i) \]

두 부분:

  1. IP 가중 + outcome regression bias 보정
  2. Outcome regression

6.2 Doubly Robust 의 의미

\(\mu\) 또는 \(e\)하나만 정확 해도 일관 추정. 둘 다 정확 하면 효율적.

6.3 직관

두 모델 (outcome, propensity) 모두 부정확 해도 cross-fitting + Neyman 으로 통계적 valid 추정. ML 의 robustness 보장.

7 CATE 로의 확장 — DR-Learner with Cross-Fitting

ATE 의 DML framework 를 CATE 추정 에 확장. DR-Learner.

7.1 알고리즘

Step 1: Cross-fitted nuisance estimation
  μ̂^(k), ê^(k) (각 fold 의 outcome + propensity)

Step 2: Doubly robust pseudo-outcome
  ψ_i = (A_i - ê(X_i)) / (ê(X_i)(1 - ê(X_i))) * (Y_i - μ̂(X_i, A_i))
        + μ̂(X_i, 1) - μ̂(X_i, 0)

Step 3: Final stage ML
  τ̂(x) = E[ψ | X=x]   (ML regression)

7.2 장점

Doubly robust + Cross-fitted CATE. EconML 의 DR-Learner 표준.

8 EconML 사례 코드

8.1 LinearDML (가장 단순)

from econml.dml import LinearDML
from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier

# 데이터: X (covariate), T (treatment), Y (outcome), W (instrument 또는 추가 covariate)

est = LinearDML(
    model_y=RandomForestRegressor(n_estimators=100),
    model_t=RandomForestClassifier(n_estimators=100),
    discrete_treatment=True,
    cv=5   # 5-fold cross-fitting
)
est.fit(Y, T, X=X, W=W)

# ATE 추정 + 신뢰구간
ate = est.ate(X)
ate_lower, ate_upper = est.ate_interval(X, alpha=0.05)

8.2 SparseLinearDML

Lasso + DML — 고차원 covariate 에 적합. Sparse linear CATE 가정.

8.3 CausalForestDML (이전 글)

Causal Forest + DML — 가장 강력. CATE 의 nonparametric estimation.

9 DML 의 한계와 주의

9.1 한계 1: ML 정확성 가정

\(n^{-1/4}\) rate 는 consistent 가정. ML 이 완전히 misspecified 면 DML 도 무력.

9.2 한계 2: 작은 sample

점근적 결과 — 작은 sample 에서 신뢰구간 유효성 약함. Bootstrap 으로 보완 권고.

9.3 한계 3: Computation

Cross-fitting K-fold + 각 fold 의 ML 학습 = K 배 계산 시간. 큰 데이터에서 부담.

10 DML vs Causal Forest

측면 DML (LinearDML) Causal Forest
추정 ATE + linear CATE Nonparametric CATE
가정 Linear in covariates Tree-based
신뢰구간 Asymptotic Honest forest
유연성 Linear models 중심 매우 유연
해석 매우 해석 가능 Tree-based
권장 ATE 우선 CATE heterogeneity

11 시뮬레이션 — DML

import numpy as np
from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier
from sklearn.model_selection import KFold

np.random.seed(42)

n = 5000
d = 10
X = np.random.randn(n, d)

# 진짜 ATE = 0.5 (CATE function)
def true_cate(X):
    return 0.5 + 0.3 * X[:, 0] - 0.2 * X[:, 1]

# Confounded treatment
prob_A = 1 / (1 + np.exp(-(0.5 * X[:, 0] - 0.3 * X[:, 1])))
A = (np.random.random(n) < prob_A).astype(int)

# Outcome
te = true_cate(X)
Y0 = 0.5 * X[:, 0] - 0.2 * X[:, 1] + np.random.normal(0, 1, n)
Y = Y0 + A * te

# True ATE
ate_true = te.mean()
print(f"진짜 ATE: {ate_true:.3f}\n")

# Naive (조정 없음)
naive_ate = Y[A == 1].mean() - Y[A == 0].mean()
print(f"[Naive (조정 없음)]: ATE = {naive_ate:.3f} — biased")

# Single ML (no cross-fitting)
print(f"\n[Single ML — Plug-in (overfitting bias 위험)]")
mu_T = RandomForestRegressor(n_estimators=100, max_depth=10, random_state=42)
mu_C = RandomForestRegressor(n_estimators=100, max_depth=10, random_state=42)
mu_T.fit(X[A == 1], Y[A == 1])
mu_C.fit(X[A == 0], Y[A == 0])
ate_plugin = (mu_T.predict(X) - mu_C.predict(X)).mean()
print(f"Plug-in ATE: {ate_plugin:.3f}")

# DML with Cross-fitting (5-fold)
print(f"\n[DML with Cross-fitting (5-fold)]")
kf = KFold(n_splits=5, shuffle=True, random_state=42)
psi_all = np.zeros(n)

for train_idx, test_idx in kf.split(X):
    X_train, X_test = X[train_idx], X[test_idx]
    A_train, A_test = A[train_idx], A[test_idx]
    Y_train, Y_test = Y[train_idx], Y[test_idx]

    # Outcome regression on train
    mu_t = RandomForestRegressor(n_estimators=100, max_depth=10, random_state=42)
    mu_c = RandomForestRegressor(n_estimators=100, max_depth=10, random_state=42)
    if (A_train == 1).sum() > 0:
        mu_t.fit(X_train[A_train == 1], Y_train[A_train == 1])
    if (A_train == 0).sum() > 0:
        mu_c.fit(X_train[A_train == 0], Y_train[A_train == 0])

    # Propensity on train
    e_model = RandomForestClassifier(n_estimators=100, max_depth=10, random_state=42)
    e_model.fit(X_train, A_train)

    # Apply to test
    mu1_test = mu_t.predict(X_test)
    mu0_test = mu_c.predict(X_test)
    e_test = np.clip(e_model.predict_proba(X_test)[:, 1], 0.05, 0.95)

    # DR pseudo-outcome
    psi_test = (
        A_test * (Y_test - mu1_test) / e_test +
        mu1_test -
        (1 - A_test) * (Y_test - mu0_test) / (1 - e_test) -
        mu0_test
    )
    psi_all[test_idx] = psi_test

ate_dml = psi_all.mean()
ate_dml_se = psi_all.std() / np.sqrt(n)
ci_low, ci_high = ate_dml - 1.96 * ate_dml_se, ate_dml + 1.96 * ate_dml_se

print(f"DML ATE: {ate_dml:.3f}")
print(f"DML SE: {ate_dml_se:.3f}")
print(f"DML 95% CI: ({ci_low:.3f}, {ci_high:.3f})")
print(f"\n진짜 ATE = {ate_true:.3f} 가 CI 안에 있는가? {ci_low <= ate_true <= ci_high}")

print(f"\n→ DML 이 진짜 ATE 가까운 추정 + valid CI")
print(f"→ Naive 는 confounding 으로 biased")
print(f"→ Cross-fitting 으로 통계 추론 가능")

12 결론

DML 은 Neyman orthogonality + Cross-fitting 으로 ML 의 bias 제거 + asymptotic normality 보장. ATE·CATE 추정의 통계적 신뢰성 의 표준 framework.

핵심 메시지:

  1. Naive plug-in 의 두 bias: Regularization + Overfitting
  2. Neyman orthogonality: Nuisance 변화에 robust
  3. Cross-fitting: K-fold 로 nuisance + target 분리
  4. Asymptotic normality: ML 추정에 고전 통계 추론
  5. Doubly robust: μ 또는 e 중 하나만 정확해도 일관
  6. EconML LinearDML, CausalForestDML — 표준 도구
  7. CATE 확장: DR-Learner with cross-fitting

J-MLHTE 시리즈 종합:

  • J-MLHTE-0: ML HTE 개관
  • J-MLHTE-1: Meta-learners (단순)
  • J-MLHTE-2: Causal Forest (specialized)
  • J-MLHTE-3: DML (통계 추론) — 이 글

다음 시리즈 (J-DID): Difference-in-Differences.

13 관련 주제

선행 지식

Phase J 후속 시리즈

14 참고문헌

  • Chernozhukov, V., Chetverikov, D., Demirer, M., et al. (2018). Double/debiased machine learning for treatment and structural parameters. Econometrics J. 21, C1-C68.
  • Robins, J. M. & Rotnitzky, A. (1995). Semiparametric efficiency in multivariate regression models. J. Amer. Statist. Assoc. 90, 122-129.
  • Newey, W. K. & Robins, J. R. (2018). Cross-fitting and fast remainder rates for semiparametric estimation. arXiv:1801.09138.
  • Kennedy, E. H. (2020). Optimal doubly robust estimation of heterogeneous causal effects. arXiv:2004.14497.
  • Microsoft Research. EconML LinearDML: https://econml.azurewebsites.net/

Subscribe

Enjoy this blog? Get notified of new posts by email: