Skip to content

Conversation

@Soyoung-JUN
Copy link
Contributor

안녕하세요, 작업한 내용은 다음과 같습니다.

2개 데이터셋(아이스크림, 이메일)에 대한 CATE 모델(선형 vs 메타-러너) 비교 구현

  1. 모델 구현: 4가지 CATE 추정 모델 구현
  • 선형 CATE 모델 (OLS + 상호작용 항)
  • 메타 러너 (RF 기반): S/T/X-Learner
  1. 평가 프레임워크 구축:
  • AUUC (Area Under Uplift Curve) 수치 평가 함수 구현
  • Cumulative Gain Plot (누적 성과 곡선) 시각화 함수 구현
  1. 비교 분석 적용 (Main):
  • Part A: 아이스크림 데이터셋(연속형 처치)에 4개 모델 적용 및 평가
  • Part B: 이메일 마케팅 데이터셋(이진형 처치)에 4개 모델 적용 및 평가

@Soyoung-JUN Soyoung-JUN self-assigned this Oct 18, 2025
@Soyoung-JUN Soyoung-JUN linked an issue Oct 18, 2025 that may be closed by this pull request
Copy link
Contributor

@Funbucket Funbucket left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이번 주도 코드 작성하느라 고생 많으셨습니다!
덕분에 연속형 및 이진형 처치에 대한 비모수적 CATE 추정 및 평가(AUUC)의 전체 실무 코드 흐름을 이해할 수 있었습니다.


요약

  • 학습/평가 분리: 관측(편향) 데이터로 학습하고 RCT로 평가
  • 모델 구성: OLS와 S / T / X-Learner (메타 러너)를 모두 구현하여, 개별 처치 효과(CATE)의 이질성(heterogeneity) 추정 성능 비교
  • 데이터셋별 목적
    • Ice Cream Sales (연속형 처치)
      • 목표: 가격(Price) 변화가 판매량(Sales)에 미치는 민감도 추정
      • 연속 처치 변수(Price)를 중앙값 기준으로 이진화하여 “낮은 가격 vs 높은 가격” 그룹으로 AUUC 비교 수행
    • Email Marketing (이진형 처치)
      • 목표: 이메일 발송 여부가 전환에 미치는 영향 추정
      • 이진형 처치 변수(Email 발송)를 기반으로 모델 비교
  • 지표/시각화: Uplift Curve + AUUC로 상위 대상 선별력을 직관적으로 비교

Comment on lines 187 to 207
"# --- 모델 1: 선형 CATE (OLS) ---\n",
"formula_linear_ice = 'sales ~ price * (temp + C(weekday) + cost)'\n",
"linear_model_ice = smf.ols(formula_linear_ice, data=train_ice).fit()\n",
"\n",
"# CATE 추정 함수 (연속형 T용)\n",
"def get_linear_cate_predictions(model, df, t_col):\n",
" df_t1 = df.copy(); df_t1[t_col] = df_t1[t_col] + 1\n",
" return model.predict(df_t1) - model.predict(df)\n",
"\n",
"test_preds_ice['cate_linear'] = get_linear_cate_predictions(linear_model_ice, test_preds_ice, T_ice_cont)\n",
"\n",
"\n",
"# --- 모델 2: S-Learner (RF) ---\n",
"rf_model_base = RandomForestRegressor(n_estimators=100, min_samples_leaf=20, random_state=42)\n",
"s_learner_ice = clone(rf_model_base)\n",
"s_learner_ice.fit(train_ice[X_ice + [T_ice_cont]], Y_train_ice)\n",
"\n",
"# CATE 추정\n",
"X_test_s_ice_t1 = X_test_ice.copy(); X_test_s_ice_t1[T_ice_cont] = test_ice[T_ice_cont] + 1\n",
"X_test_s_ice_t0 = X_test_ice.copy(); X_test_s_ice_t0[T_ice_cont] = test_ice[T_ice_cont]\n",
"test_preds_ice['cate_s_learner'] = s_learner_ice.predict(X_test_s_ice_t1) - s_learner_ice.predict(X_test_s_ice_t0)\n",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

현재 ols와 s-learner의 학습은 price(연속형)로 진행하고, 평가는 price_binary(이진형) AUUC로 하고있어서 불균형이 존재하는 것 같습니다.
아래와 같은 방식으로 모두 진행해보는 것도 좋을 것 같습니다.

  1. 전체 모델 대상 이진 비교:

    OLS/S-Learner도 price_binary로 학습 및 예측하여, 모든 모델을 동일 이진 처치 기준으로 AUUC-binary 비교

  2. 연속 처치 기준 비교:

    기존 OLS/S-Learner를 연속형 처치로 유지하고 이 두 모델만 대상으로 AUUC-continuous 비교

@Soyoung-JUN
Copy link
Contributor Author

안녕하세요 리뷰어님. 주요 변경 사항은 다음과 같습니다.

  1. Part A (아이스크림) 평가 이중화
  • 기존: OLS/S-Learner(연속형 학습)와 T/X-Learner(이진형 학습)를 이진형 AUUC로 불공정하게 비교했습니다.
  • 변경: **Part A-1 (이진 비교)**과 **Part A-2 (연속 비교)**로 명확히 분리했습니다.
    • A-1: 모든 모델(OLS, S, T, X)을 price_binary로 학습 및 평가하여 공정한 이진 처치 성능을 비교합니다.
    • A-2: OLS, S-Learner만 price (연속형)로 학습 및 평가하여 공정한 연속 처치 성능을 비교합니다.
  1. Part B (이메일) 기본 모델 교체 (RF -> LGBM)
  • 이메일 데이터셋의 S/T/X-Learner 기본 모델을 RandomForestRegressor에서 LGBMRegressor로 변경했습니다.
  • 21장에서 사용된 하이퍼파라미터(max_depth, min_child_samples)를 정확히 적용하여 교재의 결과를 재현할 수 있도록 했습니다.
  1. [Docs] 분석 노트 추가: LGBM을 사용한 이유와 각 AUUC 그래프(아이스크림, 이메일)의 해석을 담은 노트를 코드에 덧붙였습니다.

  2. [Fix] Conda 환경 의존성 문제 해결

  • numpy, scipy, lightgbm 등에서 발생한 바이너리 비호환성 오류(TypeError, ValueError)를 해결했습니다.
  • pip/conda가 꼬인 myenv 대신, conda-forge 기반의 새 환경(causal_env)을 구축하고 Jupyter/Cursor 커널을 올바르게 연결하여 문제를 해결했습니다.

걈사합니다.

@jhkimon
Copy link
Contributor

jhkimon commented Oct 30, 2025

안녕하세요 리뷰어입니다.

우선 일정을 착각하여 리뷰가 늦은 점 사과드립니다.
써주신 내용을 바탕으로 메타러너에 대해 복습할 수 있었으며, 특히 비교적 잘 분석되지 않는 연속형 처치까지 리뷰할 수 있는 좋은 시간이었습니다.

다만, 커밋 기록 을 확인해보니 수정된 내용이 아직 브랜치에 반영되지 않은 것 같아, 우선은 예전 버전을 기준으로 코멘트 전달드립니다.

++ 적어주신 리뷰를 바탕으로 이진과 연속 파트 분류해주신 점 확인하였으며, 나머지 리뷰 내용만 확인해주시면 감사할 것 같습니다!

@Soyoung-JUN
Copy link
Contributor Author

안녕하세요 정현님.
이전 커밋(2548e01 - "피드백 반영")에 기술적인 문제가 생겨서, 수정했던 코드 내용이 싹 날아가고 커밋 메시지만 올라가는 사고가 있었습니다. 이전 버전을 덮어쓰면서 작업 내용이 유실되었던 것 같습니다.

이전 코멘트에서 논의했던 모든 수정 사항을 처음부터 다시 작업해서 복구 완료했습니다.
혼란을 드려 죄송합니다! 🙇‍♀️ 이제 확인하셔도 좋습니다.

감사합니다.

@Soyoung-JUN Soyoung-JUN force-pushed the 33-비모수적-cate-추정-방법론-구현 branch from 66e91c5 to 0aa5e88 Compare November 2, 2025 05:46
@Soyoung-JUN Soyoung-JUN force-pushed the 33-비모수적-cate-추정-방법론-구현 branch from 0aa5e88 to 1343876 Compare November 2, 2025 05:47
@Soyoung-JUN Soyoung-JUN requested a review from jhkimon November 2, 2025 06:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

비모수적 CATE 추정 방법론 구현

5 participants