ALE와 Permutation Importance로 모델 해석성 운영하기

ALE와 Permutation Importance의 원리, 상관 변수 해석 한계, 검증·모니터링 절차와 Python 구현을 정리한다.

2026-08-14 · 최초 발행 2024-04-29

배포 전 해석 결과에서 확인할 것

고성능 블랙박스 모델을 운영할 때는 예측 성능만으로 충분하지 않다. 특정 특성이 어느 구간에서 예측을 밀어 올리거나 낮추는지, 그 특성을 섞었을 때 성능이 얼마나 달라지는지까지 확인해야 배포 판단과 운영 중 이상 징후 탐지가 가능하다.

Accumulated Local Effects(ALE)는 특성 값의 변화가 예측에 만드는 지역 효과를 구간 단위로 근사하고 누적해 전역 곡선으로 나타낸다. 출력은 1D·2D ALE 곡선 또는 표면이며, 상대 효과값은 0을 기준으로 중앙 정렬된다. 데이터 분포를 반영한 조건부 구간에서 국소 차분을 구하므로 Partial Dependence(PDP)의 외삽 문제와 상관 변수로 인한 왜곡을 완화한다.

Permutation Importance(PI)는 검증 데이터에서 특정 특성만 무작위로 섞은 뒤 성능 저하량을 중요도로 삼는다. 모델과 평가 지표에 덜 종속적이어서 회귀와 분류 모두에 적용하기 쉽다. 다만 강하게 상관된 특성이 있으면 다른 특성이 대체 역할을 해 중요도가 과소평가될 수 있으므로 conditional permutation 같은 변형 기법을 고려해야 한다.

국소 효과와 성능 저하를 계산하는 방식

ALE는 특성을 분위수 기반으로 구간화한다. 관측치가 밀집한 영역은 더 세밀하게, 희박한 영역은 더 거칠게 다룰 수 있다. 각 구간에서는 특성 값을 하한과 상한으로 바꿨을 때의 예측 차분을 평균내고, 이를 누적해 곡선을 만든다. 마지막에는 중앙화해 해석의 기준점을 맞춘다.

PI는 기준 성능을 먼저 계산한 다음, 한 특성만 섞어 성능을 다시 측정한다. 두 성능의 차이가 중요도가 되며, 여러 번 반복해 평균과 분산을 추정할 수 있다. 이 과정은 어떤 모델과 지표에도 비교적 쉽게 적용할 수 있지만, 검증 세트의 독립성은 보장돼야 한다.

상관과 상호작용은 두 방법의 사용 방식을 가른다. ALE는 조건부 국소 차분으로 상관 변수의 영향을 완화하며, 2D ALE로 상호작용 구조를 볼 수 있다. PI의 단변량 permutation은 상관 변수 환경에서 보수적으로 추정될 수 있으므로 grouped permutation, conditional permutation, knockoff 변수를 보완 수단으로 사용한다.

계산 비용도 운영 설계에 포함해야 한다. ALE는 O(N × B) 수준의 예측 호출이 필요하며, 대규모 데이터에서는 하위 샘플링과 bin 수 조절로 다룬다. PI는 특성 F와 반복 R에 따라 O(N × R × F) 수준이 되므로, 비용이 큰 모델에서는 샘플 축소, 조기 종료, 병렬화가 필요하다.

구분 ALE Permutation Importance
성능(계산비용) 중간: O(N×B), 예측 호출 선형 증가 중간~높음: O(N×R×F), 반복·특성 수 영향 큼
확장성 샘플/특성 선택, bin 최적화로 확장 용이 병렬화/샘플링으로 확장 가능
일관성(상관 변수) 비교적 강함: 조건부 차분 기본은 약함: 과소평가 위험, 변형 기법 필요
안정성(잡음·드리프트) 곡선 형태로 이상 구간 탐지 용이 반복 평균·분산으로 신뢰구간 추정 가능
운영 편의 시각화 해석 용이, 1D/2D 지원 구현 간단, 지표 독립성 강점

검증 세트에서 해석 결과를 운영 지표로 만드는 흐름

학습 데이터와 검증 데이터를 분리하고, 평가와 해석에 쓸 검증 세트는 고정한다. 피처 엔지니어링과 스케일러를 포함한 모델 파이프라인도 단일 객체로 고정해야 결과를 비교할 수 있다.

이후 ALE의 bin 수(B), PI의 반복 수(R), 평가 지표(metric)를 정한다. 1D ALE를 먼저 계산하고 상위 특성 쌍에는 2D ALE를 적용한다. PI는 전체 특성에 수행한다. 결과에서는 중요도 순위의 안정성, ALE 곡선의 단조성 및 물리적 타당성, 분포 밖 경계를 함께 점검한다. 변동 임계치를 넘으면 원인 분석과 재학습 또는 특성 엔지니어링을 트리거한다.

금융·의료처럼 설명 요구가 있는 환경에서는 PI로 전역 중요도의 근거를 제시하고, ALE로 특정 구간의 리스크 패턴을 설명할 수 있다. 제조·IoT에서는 1D ALE로 공정 변수의 영향 구간을 탐색하고, PI를 센서 축소 판단에 활용한다. 재학습 과정에서는 PI 분산과 ALE 곡선의 형태 변화를 감시해 모델 일관성을 모니터링한다.

결측치는 permutation 과정에서도 모델 전처리 파이프라인과 같은 방식으로 처리해야 한다. 고카디널리티 범주형 특성은 bin 수를 제한하고 target·leave-one-out 인코딩의 누수를 막는다. 분류에서는 ROC AUC 또는 PR AUC를 사용하며, 불균형 데이터에서는 PR AUC를 권장한다. 회귀는 RMSE 또는 MAE를 일관되게 사용한다. ALE의 경계는 데이터 분위수를 기준으로 두고, 경계 바깥 구간은 해석하지 않는다.

검증 데이터 X_val, y_val고정된 모델 파이프라인ALE 계산기(분위수 binning, 국소 차분,누적·중앙화)Permutation Importance엔진(기준 성능, 특성별 셔플, 성능저하 추정)ALE 1D/2D 곡선특성 중요도 순위 분산리포트/게이트

Python으로 ALE와 PI 계산하기

회귀 문제의 캘리포니아 주택 데이터를 예시로 사용한다. ALE 1D는 직접 구현하고, PI는 scikit-learn을 사용한다.

  • Python 3.9+, scikit-learn 1.3+, numpy, pandas, matplotlib
  • 회귀 문제 예시(캘리포니아 주택). ALE 1D 직접 구현, PI는 sklearn 사용.
# Python 3.9+, scikit-learn 1.3+
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import r2_score
from sklearn.inspection import permutation_importance

# 데이터 로드
data = fetch_california_housing(as_frame=True)
X = data.data
y = data.target
feature_names = X.columns.tolist()

X_train, X_val, y_train, y_val = train_test_split(
    X, y, test_size=0.2, random_state=42
)

# 모델 학습 (파이프라인 가정 단순화)
model = RandomForestRegressor(
    n_estimators=300, max_depth=None, random_state=42, n_jobs=-1
)
model.fit(X_train, y_train)

print("Baseline R2:", r2_score(y_val, model.predict(X_val)))

# 1D ALE 간단 구현 (연속형 특성 전용)
def ale_1d(model, X_df, feature, bins=20, random_state=42):
    rng = np.random.default_rng(random_state)
    X = X_df.copy()
    xk = X[feature].to_numpy()
    # 분위수 기반 bin 경계
    qs = np.linspace(0.0, 1.0, bins + 1)
    edges = np.quantile(xk, qs)
    edges[0], edges[-1] = xk.min(), xk.max()  # 안전 고정

    # 각 bin에서 국소 차분 계산
    local_effects = []
    bin_centers = []
    weights = []
    for j in range(1, len(edges)):
        lo, hi = edges[j - 1], edges[j]
        mask = (xk >= lo) & (xk <= hi)
        idx = np.where(mask)[0]
        if idx.size == 0:
            local_effects.append(0.0)
            bin_centers.append((lo + hi) / 2.0)
            weights.append(0)
            continue
        # 하한/상한으로 대체하여 예측 차분
        X_lo = X.iloc[idx, :].copy()
        X_hi = X.iloc[idx, :].copy()
        X_lo[feature] = lo
        X_hi[feature] = hi
        pred_hi = model.predict(X_hi)
        pred_lo = model.predict(X_lo)
        diff = np.mean(pred_hi - pred_lo)
        local_effects.append(diff)
        bin_centers.append((lo + hi) / 2.0)
        weights.append(idx.size)

    local_effects = np.array(local_effects)
    weights = np.array(weights, dtype=float)
    bin_centers = np.array(bin_centers)

    # 누적 합 → 중앙화
    ale_values = np.cumsum(local_effects)
    # 가중 평균으로 중앙값 0 정렬
    if weights.sum() > 0:
        shift = np.average(ale_values, weights=weights)
    else:
        shift = ale_values.mean()
    ale_values_centered = ale_values - shift

    return pd.DataFrame({
        "feature_value": bin_centers,
        "ale": ale_values_centered,
        "weight": weights
    })

# 예시: 'MedInc'(중간 소득) 특성 ALE
target_feature = "MedInc"
ale_df = ale_1d(model, X_val, target_feature, bins=20)

# 시각화
plt.figure(figsize=(6,4))
plt.plot(ale_df["feature_value"], ale_df["ale"], marker="o")
plt.title(f"ALE 1D - {target_feature}")
plt.xlabel(target_feature)
plt.ylabel("ALE effect (centered)")
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()

# Permutation Importance (검증 세트)
pi = permutation_importance(
    model, X_val, y_val, scoring="r2", n_repeats=10, random_state=42, n_jobs=-1
)
pi_df = pd.DataFrame({
    "feature": feature_names,
    "importance_mean": pi.importances_mean,
    "importance_std": pi.importances_std
}).sort_values("importance_mean", ascending=False)

print(pi_df.head(10))

ALE 곡선에서는 구간별 단조성과 급격한 기울기가 나타나는 민감 영역을 확인한다. PI 테이블에서 상위 특성의 표준편차가 크다면 상관 또는 표본 민감성을 의심할 수 있으며, 반복 수(R)를 늘리거나 grouped·conditional permutation을 검토한다.

비용·재현성·민감 데이터의 제약

Permutation은 원본 레코드를 섞는 방식이므로 재식별 위험이 낮지만, 외부 조인이나 로그를 내보낼 때는 식별자를 제거해야 한다. 모델 예측 비용이 크면 특성별 셔플 인덱스만 바꾸고 배치 예측으로 벡터화한다. ALE는 bin별 배치 예측을 캐싱한다.

무작위 시드는 고정하고 데이터 스냅샷은 버전 관리한다. CI에서는 중요도 순위 상위 K개의 변동 허용 임계치를 설정한다. ALE는 곡선을 통해 해석하기 좋지만 2D 이상으로 넓히면 복잡도가 커진다. PI는 평가 지표 선택의 자유도가 크지만 상관 변수에 취약하므로 보완 기법을 병행한다.

ALE의 O(N×B), PI의 O(N×R×F) 계산 복잡도를 관리하면 대규모 데이터에도 해석 절차를 적용할 수 있다. PI의 반복 기반 분산 추정은 중요도 신뢰구간과 배포 게이트의 지표가 된다. ALE의 구간별 영향과 PI의 전역 순위를 함께 보면 곡선 변형과 중요도 급변 같은 모델 오작동 징후를 더 일찍 포착하고, 설명 가능성에 대한 이해관계자의 수용성을 높일 수 있다.

모델 해석성ALEPermutation ImportanceMLOps특성 중요도