🤖 AI/ML

공정성

Fairness

AI가 특정 그룹에 차별적 결과를 생성하지 않는 속성. 통계적 패리티, 기회 균등 등 다양한 지표 존재.

📖 상세 설명

공정성(Fairness)은 AI 시스템이 성별, 인종, 나이, 장애 여부 등 민감 속성에 관계없이 모든 사용자에게 동등한 품질의 결과를 제공하는 것을 의미합니다. AI 모델이 학습 데이터에 내재된 편향을 그대로 학습하면 특정 그룹에 불리한 예측을 하게 되어 사회적 차별을 확대할 수 있습니다. 예를 들어 이력서 심사 AI가 과거 채용 데이터의 성별 편향을 학습하면 여성 지원자에게 낮은 점수를 부여할 수 있습니다.

공정성을 측정하는 다양한 지표가 존재합니다. 통계적 패리티(Statistical Parity)는 모든 그룹에서 긍정적 예측 비율이 동일해야 함을 요구합니다. 기회 균등(Equalized Odds)은 실제 결과가 같은 경우 예측 결과도 그룹과 무관해야 한다는 기준입니다. 예측 패리티(Predictive Parity)는 긍정 예측을 받은 사람들 중 실제 긍정인 비율이 그룹 간 동일해야 함을 의미합니다. 이들 지표는 수학적으로 동시에 만족하기 어려워 상황에 맞는 선택이 필요합니다.

공정성 문제는 데이터 수집, 전처리, 모델 학습, 후처리 등 ML 파이프라인 전반에서 다뤄져야 합니다. 데이터 수집 단계에서는 대표성 있는 샘플링으로 특정 그룹의 과소/과다 표현을 방지합니다. 전처리 단계에서는 민감 속성 제거나 리샘플링을 적용하고, 학습 단계에서는 공정성 제약을 손실 함수에 추가합니다. 후처리 단계에서는 임계값 조정으로 그룹 간 결과를 균형화합니다.

공정성은 신뢰할 수 있는 AI(Trustworthy AI)의 핵심 요소이며 EU AI Act, 한국 AI 기본법 등 규제에서도 중요하게 다루어집니다. IBM AI Fairness 360, Microsoft Fairlearn 등 오픈소스 도구를 활용하면 공정성 지표를 측정하고 편향을 완화하는 알고리즘을 적용할 수 있습니다. 다만 공정성의 정의 자체가 윤리적, 법적 맥락에 따라 달라지므로 기술적 해결책만으로는 충분하지 않으며 도메인 전문가 및 이해관계자와의 협업이 필수적입니다.

💻 코드 예제

Fairlearn 라이브러리를 사용하여 공정성 지표를 측정하고 편향을 완화하는 예제입니다.

# pip install fairlearn scikit-learn from fairlearn.metrics import MetricFrame, selection_rate, false_positive_rate from fairlearn.reductions import ExponentiatedGradient, DemographicParity from sklearn.model_selection import train_test_split from sklearn.ensemble import GradientBoostingClassifier from sklearn.datasets import fetch_openml import pandas as pd # Adult Census 데이터셋 로드 (소득 예측) data = fetch_openml(data_id=1590, as_frame=True) X = data.data y = (data.target == ">50K").astype(int) # 민감 속성: 성별 sensitive_feature = X["sex"] # 학습/테스트 분할 X_train, X_test, y_train, y_test, sf_train, sf_test = train_test_split( X.drop(columns=["sex"]), y, sensitive_feature, test_size=0.3, random_state=42 ) # 수치형 변환 (간단한 전처리) X_train = pd.get_dummies(X_train) X_test = pd.get_dummies(X_test) X_test = X_test.reindex(columns=X_train.columns, fill_value=0) # 기본 모델 학습 base_model = GradientBoostingClassifier(n_estimators=50, random_state=42) base_model.fit(X_train, y_train) y_pred_base = base_model.predict(X_test) # 공정성 지표 측정 print("=== 기본 모델 공정성 분석 ===") mf = MetricFrame( metrics={"selection_rate": selection_rate, "accuracy": lambda y_true, y_pred: (y_true == y_pred).mean()}, y_true=y_test, y_pred=y_pred_base, sensitive_features=sf_test ) print(f"그룹별 선택률:\n{mf.by_group['selection_rate']}") print(f"선택률 차이: {mf.difference()['selection_rate']:.4f}") # 공정성 완화 적용 (Demographic Parity) mitigator = ExponentiatedGradient( estimator=GradientBoostingClassifier(n_estimators=50, random_state=42), constraints=DemographicParity() ) mitigator.fit(X_train, y_train, sensitive_features=sf_train) y_pred_fair = mitigator.predict(X_test) # 완화 후 공정성 비교 print("\n=== 완화 후 공정성 분석 ===") mf_fair = MetricFrame( metrics={"selection_rate": selection_rate}, y_true=y_test, y_pred=y_pred_fair, sensitive_features=sf_test ) print(f"그룹별 선택률:\n{mf_fair.by_group['selection_rate']}") print(f"선택률 차이: {mf_fair.difference()['selection_rate']:.4f}") # 결과 예시: # === 기본 모델 공정성 분석 === # 그룹별 선택률: # sex # Female 0.095 # Male 0.312 # 선택률 차이: 0.2170 # # === 완화 후 공정성 분석 === # 그룹별 선택률: # sex # Female 0.182 # Male 0.198 # 선택률 차이: 0.0160

🗣️ 실무에서 이렇게 말하세요

PM:
"이번 대출 심사 AI, 성별에 따른 승인률 차이가 문제되지 않을까요?"
ML 엔지니어:
"Fairlearn으로 Demographic Parity 지표를 확인해보니 남녀 승인률 차이가 15%p 정도 납니다. Equalized Odds 제약을 적용해서 실제 상환 능력이 같은 경우 예측 결과도 동일하게 만들겠습니다. 다만 공정성과 정확도 간 트레이드오프가 있어서 비즈니스팀과 허용 범위를 논의해야 합니다."

⚠️ 흔한 실수 & 주의사항

민감 속성을 피처에서 제거하면 공정해진다고 생각함. 다른 피처가 대리 변수로 작용할 수 있음
민감 속성 제거 후에도 프록시 변수(우편번호, 이름 등)의 영향을 분석해야 함
하나의 공정성 지표만 만족시키면 된다고 판단함
여러 공정성 지표를 함께 모니터링하고 도메인 맥락에 맞는 지표를 우선시함
배포 후 공정성 모니터링을 하지 않음
데이터 분포 변화로 공정성이 악화될 수 있으므로 지속적 모니터링 필요

🔗 관련 용어

📚 더 배우기