ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Sigmoid: 실수를 확률로 변환하는 가장 자연스러운 함수
    Knowledge Base/Foundations 2026. 2. 23. 00:42

     

    Author: Claude Opus 4.6, mangowhoiscloud
    Purpose: Sigmoid 함수의 수학적 기초, 변형, 적용
    Date: 2026-02-22
    Related: Logistic Regression Foundations (26.02.08), Logprobs Knowledge Base (26.02.08)

    Executive Summary

    Sigmoid 함수 σ(z) = 1/(1+e^(-z))는 임의의 실수를 (0, 1) 확률로 매핑하는 가장 자연스러운 함수입니다. 이 함수가 자연스러운 이유는 단순히 "범위가 맞아서"가 아니라, logit(Bernoulli 분포의 canonical link function)의 역함수이기 때문입니다.

    본 문서는 (1) sigmoid의 유도와 5가지 핵심 성질, (2) 미분의 유도와 gradient 계산에서의 효율성, (3) softmax와의 관계, (4) Learning-to-Rank·Propensity Score·Calibration에서의 실전 역할, (5) 수치 안정성 구현, (6) 대안 함수와의 비교를 다룹니다.

    기존 Logistic Regression 포스트(26.02.08)와의 관계: 이전 포스트가 로지스틱 회귀 전체를 다뤘다면, 본 문서는 sigmoid 함수 자체에 초점을 맞추고 다양한 ML 파이프라인에서의 적용 사례로 확장합니다.


    1. Sigmoid의 수학적 정체

    1.1 정의와 유도

    Sigmoid는 logit 함수의 역함수입니다. logit이 확률 → 실수 변환이라면, sigmoid는 실수 → 확률 변환입니다.

    logit(p) = log(p / (1-p))        # 확률 → 실수 ((-∞, +∞))
    σ(z)     = 1 / (1 + e^(-z))      # 실수 → 확률 ((0, 1))

     

    유도 과정:

    logit(p) = z  로 놓으면
    log(p / (1-p)) = z
    p / (1-p) = e^z
    p = e^z · (1-p)
    p = e^z - p·e^z
    p(1 + e^z) = e^z
    p = e^z / (1 + e^z)
      = 1 / (1 + e^(-z))    [분자·분모에 e^(-z) 곱]

    왜 logit 변환인가?

    logit이 Bernoulli 분포의 canonical link function이기 때문입니다. Generalized Linear Model(GLM) 프레임워크에서, 지수족(exponential family) 분포의 canonical link는 충분통계량(sufficient statistic)과 자연모수(natural parameter)를 직접 연결하며, 이것이 MLE의 수렴성과 추론의 효율성을 보장합니다.

    1.2 핵심 성질 5가지

    # 성질 수식 실전 의미
    P1 범위 0 < σ(z) < 1 출력이 항상 유효한 확률 — 후처리 불필요
    P2 대칭 σ(-z) = 1 - σ(z) P(Y=0) = 1 - P(Y=1)로 자연 연결, 원점 대칭
    P3 자기미분 σ'(z) = σ(z)·(1-σ(z)) forward pass 값 재사용 → gradient 계산 O(1)
    P4 단조증가 σ'(z) > 0 ∀z 입력↑ → 확률↑ 항상 성립 (해석 용이)
    P5 포화 σ(z)→0 (z→-∞), σ(z)→1 (z→+∞) 극단 입력에서 자동 클리핑 효과

     

    각 성질의 증명:

    P1 (범위): e^(-z) > 0 ∀z → 1 + e^(-z) > 1 → 0 < 1/(1+e^(-z)) < 1  ✓
    
    P2 (대칭): σ(-z) = 1/(1+e^z)
             = (1+e^(-z)-1) / ((1+e^(-z)) · (1+e^z)/(1+e^(-z)))
             ... 간결하게:
             1 - σ(z) = 1 - 1/(1+e^(-z)) = e^(-z)/(1+e^(-z)) = 1/(1+e^z) = σ(-z)  ✓
    
    P4 (단조): σ'(z) = σ(z)(1-σ(z)), P1에서 σ(z) ∈ (0,1) → σ'(z) > 0  ✓
    
    P5 (포화): lim(z→+∞) e^(-z) = 0 → σ(z) → 1
              lim(z→-∞) e^(-z) = ∞ → σ(z) → 0  ✓

    1.3 미분의 유도

    σ(z) = (1 + e^(-z))^(-1)
    
    dσ/dz = -1 · (1 + e^(-z))^(-2) · (-e^(-z))        [chain rule]
           = e^(-z) / (1 + e^(-z))²
           = [1 / (1 + e^(-z))] · [e^(-z) / (1 + e^(-z))]
           = σ(z) · [(1 + e^(-z) - 1) / (1 + e^(-z))]
           = σ(z) · [1 - 1/(1 + e^(-z))]
           = σ(z) · (1 - σ(z))

    왜 이 성질이 중요한가:

    1. 계산 효율: forward pass에서 σ(z)를 한 번 계산하면, backward pass의 gradient는 곱셈 한 번으로 끝남. 별도의 지수함수 호출 불필요.
    2. BCE Loss 연결: Binary Cross-Entropy Loss의 gradient는 (예측값 - 실제값)이라는 직관적 형태로 귀결됨:
    Loss = -[y·log(σ(z)) + (1-y)·log(1-σ(z))]
    
    ∂Loss/∂z = -[y·σ'(z)/σ(z) + (1-y)·(-σ'(z))/(1-σ(z))]
             = -[y·(1-σ(z)) + (1-y)·(-σ(z))]
             = -[y - y·σ(z) - σ(z) + y·σ(z)]
             = σ(z) - y
             = (예측값 - 실제값)
    1. 미분의 최대값: σ'(z)는 z=0에서 최대값 0.25를 가짐. 이것이 후술할 vanishing gradient 문제의 근원.

    1.4 Softmax와의 관계: Sigmoid = 2-class Softmax

    softmax: P(class_k) = e^(z_k) / Σ_j e^(z_j)
    
    V = 2일 때 (class 0의 logit을 0으로 고정):
    P(class_1) = e^z / (e^z + e^0)
               = e^z / (e^z + 1)
               = 1 / (1 + e^(-z))       [분자·분모에 e^(-z) 곱]
               = σ(z)

     

    증명

    • sigmoid는 softmax에서 어휘 크기 V=2이고, 하나의 logit을 0으로 고정한 것과 동일합니다.

    실전 함의

    • 이진 분류(V=2): sigmoid 사용 → 출력 1개 (다른 하나는 1에서 빼면 됨)
    • 다중 분류(V>2): softmax 사용 → 출력 V개
    • LLM 토큰 예측: softmax (V = 어휘 크기, 통상 32K-256K)

    이전 Logprobs 포스트(26.02.08)에서 다룬 LLM의 softmax → logprobs 변환과 직접 연결됩니다.


    2. 실전 적용 ①: Propensity Score 추정

    2.1 인과추론에서의 역할

    Propensity Score Matching(PSM)에서 sigmoid는 처치 확률 추정의 link function입니다(Rosenbaum & Rubin, 1983):

    PS(X) = P(T=1 | X) = σ(β₀ + β₁x₁ + ... + βₖxₖ)
          = 1 / (1 + e^(-(β₀ + β₁x₁ + ... + βₖxₖ)))
    
    T = 처치 여부 (0 or 1)
    X = 공변량 벡터 (관측 가능한 특성들)
    β = Logistic Regression으로 추정하는 계수

     

    왜 Logistic Regression(sigmoid)으로 PS를 추정하는가:

    요구사항 1: 출력이 확률이어야 한다 (매칭에 사용되므로)
      → sigmoid:        ✓ (0, 1) 범위 자동 보장
      → 선형 회귀:      ✗ 범위 위반 가능
      → Random Forest:  △ probability 출력 가능하나 calibration 열위
    
    요구사항 2: Balancing property 성립
      PS(X) 조건부로 T ⊥ X (처치 할당이 공변량과 독립)
      → Logistic Regression: ✓ correctly specified 시 이론적 보장
      → GBDT:               △ 실전 성능 좋으나 이론적 보장 약함
    
    요구사항 3: 과적합 방지
      PS → 0 또는 1이면 매칭 불가 (positivity violation)
      → Logistic Regression: ✓ 자연스러운 regularization
      → GBDT/NN:            ✗ 과적합 시 PS가 극단값 수렴
    
    요구사항 4: 해석 가능
      어떤 공변량이 처치 할당에 영향을 미치는지
      → Logistic Regression: ✓ 계수 β의 오즈비(OR) 해석 가능
      → Neural Network:      ✗ 블랙박스

    2.2 수치 예시: 신약 임상시험의 PS 추정

    공변량: age=65, bmi=28, smoker=1, bp_systolic=145, diabetes=0
    
    β 계수 (가상):
      z = β₀ + β₁(age) + β₂(bmi) + β₃(smoker) + β₄(bp) + β₅(diabetes)
        = -3.2 + 0.04(65) + 0.08(28) + 0.5(1) + 0.02(145) + 0.3(0)
        = -3.2 + 2.6 + 2.24 + 0.5 + 2.9 + 0
        = 5.04
    
    PS = σ(5.04) = 1 / (1 + e^(-5.04)) ≈ 0.9935

    PS ≈ 0.99는 "이 환자는 거의 확실히 신약 투여군에 배정된다"는 의미입니다.

    이렇게 높은 PS는 매칭 대상을 찾기 어렵게 만듭니다.

     

    대응

    1. PS trimming: PS ∈ (0.05, 0.95) 밖은 제거
    2. Caliper: 0.2 × SD(PS) → 매칭 품질과 샘플 크기의 균형
    3. SMD < 0.1 검증 → balance 미달 시 모델 재추정

    2.3 Sigmoid의 포화와 Positivity Violation

    Sigmoid의 포화 성질(P5)은 PS 추정에서 양날의 검:

    장점: 확률이 자연스럽게 [0,1]에 머뭄 → 수치적 안정성
    단점: 공변량이 극단적이면 PS → 0 또는 1 → positivity violation
    
    PS → 0: "이 개체는 절대 처치받지 않음" → 대조군에 매칭 불가
    PS → 1: "이 개체는 반드시 처치받음" → 처치군에 비교 대상 없음

    이것이 PSM에서 PS trimming이 표준 전처리인 이유이며, 로지스틱 회귀가 GBDT보다 덜 극단적인 PS를 생성하는 것이 오히려 장점이 되는 이유입니다(Caliendo & Kopeinig, 2008).


    3. 실전 적용 ②: Learning-to-Rank의 쌍(Pair) 확률

    3.1 RankNet에서 LambdaMART까지

    Burges(2010)의 RankNet 프레임워크에서 sigmoid는 두 문서 간 순위 관계의 확률을 모델링합니다:

    P(i ≻ j) = σ(s_i - s_j) = 1 / (1 + e^(-(s_i - s_j)))
    
    i ≻ j: 문서 i가 j보다 상위 랭크
    s_i, s_j: 모델이 출력한 relevance 스코어

    왜 sigmoid가 자연스러운가:

    ① 스코어 차이(s_i - s_j) ∈ (-∞, +∞) → sigmoid가 (0,1) 확률로 매핑
    ② s_i = s_j이면 σ(0) = 0.5 → 동률이면 승률 50% (직관적)
    ③ 대칭(P2): P(i ≻ j) = 1 - P(j ≻ i) 자동 보장
    ④ 단조(P4): 스코어 차이 클수록 확률 높음

    LambdaMART는 이 확률을 NDCG 변화량과 결합하여 gradient를 만듭니다:

    λ_ij = [-σ_param / (1 + e^(σ_param · (s_i - s_j)))] · |ΔNDCG_ij|
         = -σ_param · σ(σ_param · (s_i - s_j)) · |ΔNDCG_ij|
    
    σ_param: gradient 스케일링 하이퍼파라미터 (sigmoid 함수와 기호 혼동 주의)
    ΔNDCG_ij: 문서 i↔j 순위 교환 시 NDCG 변화량

    3.2 수치 예시: 검색 엔진 결과 랭킹

    Query: "Python async tutorial"
    
    문서 A: 공식 docs (s_A = 0.89, relevance = 3)
    문서 B: 블로그 포스트 (s_B = 0.72, relevance = 2)
    문서 C: 질문 사이트 (s_C = 0.31, relevance = 1)
    
    쌍별 확률:
    P(A ≻ B) = σ(0.89 - 0.72) = σ(0.17) ≈ 0.542
    P(A ≻ C) = σ(0.89 - 0.31) = σ(0.58) ≈ 0.641
    P(B ≻ C) = σ(0.72 - 0.31) = σ(0.41) ≈ 0.601
    
    |ΔNDCG|:
    A↔B 교환: 상위 순위 간 교환 → |ΔNDCG| 높음
    A↔C 교환: 1위↔3위 교환 → |ΔNDCG| 매우 높음
    B↔C 교환: 2위↔3위 교환 → |ΔNDCG| 중간
    
    λ gradient:
    λ_AC > λ_AB > λ_BC
    → 모델은 A를 최상위에 올리는 데 가장 강하게 학습
    → 하위권 간의 미세한 순위 차이는 상대적으로 무시

    이것이 LambdaMART가 상위 K개 순위를 집중적으로 최적화하는 메커니즘의 수학적 핵심입니다. Sigmoid가 스코어 차이를 확률로 변환하고, ΔNDCG가 "어느 쌍이 중요한지"를 가중합니다.


    4. 실전 적용 ③: Probability Calibration

    4.1 문제: 모델은 좋은 순위를 만들지만, 좋은 확률은 아니다

    많은 ML 모델(GBDT, SVM, Neural Net)은 높은 classification accuracy를 달성하지만, 출력 확률이 실제 확률과 괴리됩니다(Guo et al., 2017):

    모델 출력: P(양성) = 0.9
    실제 빈도: 그 구간에서 양성 비율 = 0.7
    → 모델이 overconfident (자신감 과잉)
    
    ECE = Σ_b (n_b/N) · |acc(b) - conf(b)|
    
    ECE < 0.10이면 "신뢰할 수 있는 확률" 수준

    4.2 Platt Scaling: Sigmoid를 이용한 사후 보정

    Platt(1999)은 모델의 raw output을 sigmoid에 다시 통과시켜 calibration을 개선합니다:

    P_calibrated = σ(A · f(x) + B)
    
    A, B: validation set에서 학습하는 2개 파라미터 (MLE로 추정)
    f(x): 모델의 raw output (예: SVM의 decision function, GBDT의 raw score)

    왜 sigmoid인가 (다른 calibration 방법과 비교):

    Platt Scaling (sigmoid):
      + 파라미터 2개만 학습 → 과적합 위험 낮음
      + 전역적 단조 변환 → 순위(discrimination)를 보존
      - 단일 sigmoid로는 복잡한 miscalibration 패턴을 못 잡음
    
    Isotonic Regression:
      + 비모수적 → 임의 형태의 miscalibration 보정 가능
      - 데이터 많이 필요 → 소규모 데이터에서 과적합
      - 단조성만 보장, smoothness 보장 없음
    
    Temperature Scaling:
      + Platt의 특수 경우 (B=0, A=1/T)
      + Neural Net에서 주로 사용
      - sigmoid의 위치(offset) 보정은 불가

    4.3 수치 예시: GBDT 스팸 필터의 Calibration

    GBDT raw score:
      스팸 메일 평균 score: 2.1
      정상 메일 평균 score: -1.3
    
    Raw sigmoid (보정 전):
      σ(2.1)  = 0.891 → "이 메일이 스팸일 확률 89.1%"
      σ(-1.3) = 0.214 → "이 메일이 스팸일 확률 21.4%"
    
    문제: 실제로 score 2.1 구간의 스팸 비율은 78%
    → overconfident by 11%p
    
    Platt Scaling 적용 (A=0.7, B=-0.3 학습됨):
      σ(0.7·2.1 - 0.3) = σ(1.17) = 0.763 → 실제 78%에 근접
      σ(0.7·(-1.3) - 0.3) = σ(-1.21) = 0.229
    
    보정 후 ECE: 0.08 < 0.10 ✓

    Platt Scaling의 A < 1이면 overconfidence를 줄이고, B ≠ 0이면 threshold를 이동시킵니다. 2개 파라미터로 전역적 calibration을 수행하는 것이 sigmoid의 표현력이 적절하기 때문입니다.


    5. 실전 적용 ④: 가중치 전환의 Smooth Gate

    5.1 패턴: Sigmoid as a Gating Function

    ML 시스템에서 sigmoid는 두 모듈의 기여도를 연속적으로 전환하는 gate로 자주 사용됩니다:

    일반 패턴:
      w = σ(signal)
      output = w · module_A + (1 - w) · module_B
    
    signal > 0: module_A에 가중
    signal < 0: module_B에 가중
    signal = 0: 50:50 균등 배분

    이 패턴이 다른 함수 대비 우수한 이유:

    대안 1: 선형 (w = signal)
      ✗ signal이 음수이면 w도 음수 → 가중치 의미 상실
      ✗ signal이 크면 w가 무한정 증가 → 불안정
    
    대안 2: ReLU (w = max(0, signal))
      ✗ signal > 0 영역에서 선형 → 폭주 가능
      ✗ signal = 0에서 미분 불연속
      ✗ 상한 없음
    
    대안 3: Hard threshold (w = 1 if signal > 0, else 0)
      ✗ 불연속 → gradient 0 (학습 불가)
      ✗ 전환이 즉각적 → 불안정한 진동 가능
    
    대안 4: sigmoid (w = σ(signal)) ← 선택
      ✓ 출력 항상 (0, 1) → 유효한 가중치 범위 보장
      ✓ 부드러운 전환 → 급격한 변화 방지
      ✓ 양 극단에서 포화 → 자동 안전장치
      ✓ 미분 가능 → 필요 시 학습 가능

    5.2 수치 예시: Ensemble 가중치의 점진적 전환

    두 모델(Model A: rule-based, Model B: data-driven)의 신뢰도 기반 앙상블:

    Phase 1 (데이터 부족, 신뢰도 signal = -2.0):
      w_B = σ(-2.0) = 0.119
      output = 0.881 · A + 0.119 · B
      → rule-based 모델 중심 (안전)
    
    Phase 2 (데이터 축적, 신뢰도 signal = 0.5):
      w_B = σ(0.5) = 0.622
      output = 0.378 · A + 0.622 · B
      → data-driven으로 점진적 전환
    
    Phase 3 (충분한 검증, 신뢰도 signal = 3.0):
      w_B = σ(3.0) = 0.953
      output = 0.047 · A + 0.953 · B
      → data-driven 중심, rule-based는 보조
    
    Phase 4 (성능 하락 감지, 신뢰도 signal = -1.0):
      w_B = σ(-1.0) = 0.269
      output = 0.731 · A + 0.269 · B
      → 자동으로 rule-based로 회귀 (별도 개입 불필요)

    핵심: sigmoid 덕분에 전환이 연속적이고 안전합니다. 성능이 좋아지면 자연스럽게 전환되고, 나빠지면 자동으로 회귀합니다. Hard switching이 아닌 soft gating.


    6. Sigmoid의 한계와 대안

    6.1 Vanishing Gradient Problem

    σ'(z)의 최대값은 z=0에서 0.25입니다. |z|가 커지면 급격히 0에 수렴:

    z = 0  → σ'(0)  = 0.2500              [최대]
    z = 3  → σ'(3)  = 0.0451              [82% 감소]
    z = 5  → σ'(5)  = 0.0066              [97% 감소]
    z = 10 → σ'(10) = 0.0000454           [99.98% 감소]

    Deep Neural Network에서 sigmoid를 hidden layer activation으로 사용하면 역전파 시 gradient가 layer마다 최대 0.25배로 감소합니다. 10층이면 0.25^10 ≈ 10^(-6) → gradient 소멸.

     

    그러나 sigmoid가 여전히 적합한 경우:

    ① 출력층의 이진 분류: 단일 층이므로 vanishing gradient 무관
    ② Logistic Regression: 단일 층 모델
    ③ Platt Scaling: 2개 파라미터만 학습
    ④ Learning-to-Rank: GBDT 기반이므로 역전파 미사용
    ⑤ Gating function: 단일 sigmoid 적용

    결론: vanishing gradient는 딥러닝 hidden layer 문제이지, 단일 층·비신경망 모델에서는 해당 없습니다.

    6.2 대안 함수 비교

    함수 수식 범위 미분 적합 용도
    Sigmoid 1/(1+e^(-z)) (0,1) σ(1-σ) 확률 출력, gating, calibration
    Tanh (e^z-e^(-z))/(e^z+e^(-z)) (-1,1) 1-tanh²(z) hidden layer(구세대), 영점 중심
    ReLU max(0,z) [0,∞) 0 or 1 hidden layer(현재 표준)
    Probit Φ(z) (정규 CDF) (0,1) φ(z) PS 추정 대안, 실전 차이 미미
    Gumbel e^(-e^(-z)) (0,1) 비대칭 극단값 모델링, 희귀 사건

    Sigmoid vs Tanh:

    tanh(z) = 2σ(2z) - 1
    
    관계: tanh은 sigmoid의 확대·이동 버전
    차이: tanh는 영점 중심(zero-centered) → hidden layer에서 학습 안정성 우위
         sigmoid는 양수 출력만 → 확률 해석에 적합

    Sigmoid vs Probit:

    σ(z) ≈ Φ(1.7·z)  (근사)
    
    차이: probit은 꼬리가 더 빠르게 떨어짐 → 극단값에 더 민감
         sigmoid는 heavier tail → 극단값에 더 robust
    실전: PSM에서 logit vs probit 결과 차이는 대부분 무시 가능
         Caliendo & Kopeinig(2008): logit 권장 (계산 효율 + 오즈비 해석)

    7. 수치 안정성: 구현

    7.1 Overflow 방지

    # ✗ 위험한 구현
    def sigmoid_naive(z):
        return 1.0 / (1.0 + np.exp(-z))
    # z = -1000 → np.exp(1000) = inf → 0/inf = nan
    
    # ✓ 안전한 구현
    def sigmoid_stable(z):
        return np.where(z >= 0,
                        1.0 / (1.0 + np.exp(-z)),     # z ≥ 0: 원래 공식
                        np.exp(z) / (1.0 + np.exp(z)))  # z < 0: 동치 변환

    동치 증명:

    z < 0일 때:
    e^z / (1 + e^z)
    = e^z · e^(-z) / ((1 + e^z) · e^(-z))
    = 1 / (e^(-z) + 1)
    = 1 / (1 + e^(-z))    ✓

    7.2 Log-Sigmoid의 안정성

    BCE Loss에서 log(σ(z))가 빈번하게 등장합니다:

    # ✗ 위험: 직접 계산
    log_p = np.log(sigmoid(z))  # σ(z) ≈ 0이면 log(0) = -inf
    
    # ✓ 안전: log-sigmoid identity 사용
    # log(σ(z)) = z - log(1 + e^z) = -log(1 + e^(-z)) = -softplus(-z)
    log_p = -np.logaddexp(0, -z)  # numerically stable
    
    # log(1 - σ(z)) = log(σ(-z)) = -softplus(z)
    log_1_minus_p = -np.logaddexp(0, z)

    실전: PyTorch의 F.binary_cross_entropy_with_logits와 TensorFlow의 tf.nn.sigmoid_cross_entropy_with_logits는 내부적으로 이 안정 공식을 사용합니다. Raw sigmoid + log를 따로 호출하면 안 됩니다.


    8. 정리: Sigmoid가 반복적으로 등장하는 이유

    하나의 함수 σ(z) = 1/(1+e^(-z))가:
    
    [인과추론]
    └── Propensity Score: PS(X) = σ(Xβ)
        → 확률 해석 + 해석 가능성 + calibration
    
    [순위 학습]
    └── Learning-to-Rank: P(i ≻ j) = σ(s_i - s_j)
        → 스코어 차이 → 승률 확률
    
    [확률 보정]
    └── Platt Scaling: P_cal = σ(Af(x)+B)
        → 2-param으로 전역 calibration
    
    [모듈 전환]
    └── Gating: w = σ(signal)
        → 연속적·안전한 soft switching

     

    이 4가지 용도는 모두 실수를 확률로 변환합니다. Sigmoid를 선택한 것이 아니라, "실수 → 확률" 변환이라는 공통 요구사항이 자연스럽게 sigmoid로 수렴한 것입니다. Bernoulli 분포의 canonical link function이 logit이고, 그 역함수가 sigmoid인 한, 이진 확률이 필요한 모든 곳에 sigmoid가 등장하는 것은 수학적 필연입니다.


    References

    1. Bishop, C. M. (2006). Pattern Recognition and Machine Learning. Springer. Ch.4.
    2. Goodfellow, I., Bengio, Y., & Courville, A. (2016). Deep Learning. MIT Press. Ch.6.
    3. Rosenbaum, P. R. & Rubin, D. B. (1983). "The Central Role of the Propensity Score in Observational Studies for Causal Effects." Biometrika, 70(1), 41-55.
    4. Burges, C. J. C. (2010). "From RankNet to LambdaRank to LambdaMART: An Overview." Microsoft Research Technical Report MSR-TR-2010-82.
    5. Platt, J. (1999). "Probabilistic Outputs for Support Vector Machines." Advances in Large Margin Classifiers.
    6. Niculescu-Mizil, A. & Caruana, R. (2005). "Predicting Good Probabilities With Supervised Learning." ICML.
    7. Guo, C. et al. (2017). "On Calibration of Modern Neural Networks." ICML.
    8. Hosmer, D. W. & Lemeshow, S. (2013). Applied Logistic Regression. Wiley. 3rd Edition.
    9. Caliendo, M. & Kopeinig, S. (2008). "Some Practical Guidance for the Implementation of Propensity Score Matching." Journal of Economic Surveys, 22(1), 31-72.
    10. Agresti, A. (2013). Categorical Data Analysis. Wiley. 3rd Edition.

    댓글

ABOUT ME

🎓 부산대학교 정보컴퓨터공학과 학사: 2017.03 - 2023.08
☁️ Rakuten Symphony Jr. Cloud Engineer: 2024.12.09 - 2025.08.31
🏆 2025 AI 새싹톤 우수상 수상: 2025.10.30 - 2025.12.02
🌏 이코에코(Eco²) 백엔드/인프라 고도화 중: 2025.12 - Present

Designed by Mango