이 글은 사전지식 기반 (교재 미확인 — agent 사전학습 기반). 핵심 정리는 Chernozhukov et al. (2018) Econometrics J. 원논문에 한해 명시.
이 글은 Phase J 시리즈의 12 번째 글이자 J-MLHTE 시리즈의 마지막 글. ML 의 통계적 신뢰성 을 보장하는 Double/Debiased Machine Learning (DML) — 가장 영향력 있는 framework — 을 다룬다.
1 진입 직관 — “ML 의 bias 를 ML 로 제거”
ML 알고리즘은 예측 정확성 우선. 그러나 인과 추론 에서:
- Regularization: ML 의 과적합 방지 가 bias 도입
- Overfitting: 같은 데이터로 모든 단계 추정 시 noise 학습
Chernozhukov 등의 통찰: 이 두 bias 를 2 가지 도구 로 제거:
- Neyman Orthogonality: Score 함수가 nuisance parameter 변화에 robust
- 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 알고리즘
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) \]
두 부분:
- IP 가중 + outcome regression bias 보정
- 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.
핵심 메시지:
- Naive plug-in 의 두 bias: Regularization + Overfitting
- Neyman orthogonality: Nuisance 변화에 robust
- Cross-fitting: K-fold 로 nuisance + target 분리
- Asymptotic normality: ML 추정에 고전 통계 추론
- Doubly robust: μ 또는 e 중 하나만 정확해도 일관
- EconML LinearDML, CausalForestDML — 표준 도구
- 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 후속 시리즈
- DiD — Difference-in-Differences (placeholder)
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/