| 프로젝트 개요
- 프로젝트명 : 난임 환자 대상 임신 성공 여부 예측 모델 개발
- 공모전명 : LG Aimers 6기
- 진행 기간 : 2025.02.01 ~ 2025.02.27
- 프로젝트 목표 : 난임 환자 데이터를 분석하여 임신 성공에 영향을 미치는 주요 요인을 도출하고, 정확한 예측을 위한 최적의 AI 모델을 개발
- 평가 지표 : ROC-AUC
- 사용 데이터 : 영국의 인간수정 및 배아관리청 (Human Fertilisation & Embryology Authority, HFEA)에서 제공하는 난임 환자 시술 데이터
- 참여 팀원 : 5명
- 역할 : 데이터 불균형을 해결하기 위한 샘플링 기법 실험 / autoML을 이용한 하이퍼 파라미터 튜닝
- 사용 언어 : Python
- 성과 : Public 141등 Private 116등
1. 데이터 구조
- train, test 데이터 셋 각각 약 25.6만 개, 약 9만 개의 행을 가짐
- 독립변수 67개, 종속변수(임신 성공 여부) 1개
- 종속변수에 데이터 불균형 문제가 존재(약 3:1의 비율)
2. 데이터 전처리
2-1. 초반에 한 시도
- 결측치를 확인하는 중, 결측치 개수가 6291개인 행이 다수 발견
- 해당 원인을 찾기 위해, 결측치 개수가 6291개인 컬럼들의 특징을 확인함

- 시술 유형 컬럼이 DI이면 해당 결측치를 가짐
- 시술 유형에는 IVF(In Vitro Fertilization, 체외 수정)와 DI(Donor Insemination, 기증 정자 인공 수정)이 존재
- DI인 경우, 배아 생성 주요 이유, 이식된 배아 수와 같은 컬럼 정보가 존재하지 않음
- 따라서, 시술 유형에 따라 사용 가능한 컬럼이 다르다고 판단 → IVF와 DI를 나눠서 각각 예측 모델을 구축하고자 함
- 그러나, 대회 중 해당 방식을 철회하고 데이터를 시술 유형에 따라 나누지 않고 진행..! 그 이유는 아래와 같음
- 성능 검증의 어려움
- 대회에서 평가하는 것은 IVF와 DI가 합쳐져 있는 데이터 셋. but, 우리가 얻은 것은 IVF, DI 모델 성능 각각임
- 또한, 이번 대회의 평가 지표는 ROC-AUC 이기 떄문에 마냥 단순하게 평균을 내서는 정확한 성능 지표 값을 얻을 수 없다고 판단
- 하이퍼 파라미터 튜닝 소요 시간
- train 데이터 수가 25만개 이상으로, 디폴트 옵션으로 모델링을 해도 시간이 꽤 소요
- 여기다, 하이퍼 파라미터 튜닝은 기본적으로 시간이 오래 걸림
- 이를 두개 모델로 나눠서 튜닝을 하면, 시간적인 문제가 더욱 심화된다고 판단
- 성능 검증의 어려움
- 시술 유형에 따라 나누지 않고 진행 → 성능 역시 상승했음
- 결측치, 범주형 인코딩 기법을 거의 유사하게 진행했음
2-2. 의미 없는 컬럼 삭제
- 모든 행에 대해서 같은 값을 가지는 열은 제거
- '불임 원인 - 여성 요인' 컬럼은 모든 행에서 0 값을 가짐 → 제거
2-3. 결측치 처리
- 유사한 의미를 가진 컬럼을 이용해서 대체
- PGD 시술(착상 전 유전자 진단)은 착상 전 유전 진단과 관련 있다고 판단
- '착상 전 유전 진단 사용 여부' 컬럼이 1이면, 'PGD 시술 여부'의 결측치를 1로 대체
- 또한, 'PGD 시술 여부'가 1이면, '착상 전 유전 진단 사용 여부' 역시 1로 대체
- 결측치 비율이 80% 이상인 컬럼은 제거 → 총 6개의 컬럼 제거
제거된 컬럼 : ‘임신 시도 또는 마지막 임신 경과 연수’, ‘착상 전 유전 검사 사용 여부’, ‘PGD 시술 여부’, ‘PGS 시술 여부’, ‘난자 해동 경과일’, ‘배아 해동 경과일’ - 시술 유형이 DI라서 생기는 결측치 따로 처리(결측치 개수가 6291개인 컬럼)
- 해당 컬럼 : '단일 배아 이식 여부', '착상 전 유전 진단 사용 여부', '배아 생성 주요 이유’ 등의 21개 컬럼
- 3개 이상의 범주를 가진 범주형 변수 → ‘DI_알 수 없음’이라는 범주로 대체
- 2개의 범주를 가진 범주형 변수 → 최빈값으로 대체
- 수치형 변수 → 평균값으로 대체
- 기타 결측치 처리
- '특정 시술 유형'의 경우 → 최빈값 대채
- 일자 관련 변수의 경우 → 평균값 대체
2-4. 범주형 변수 인코딩
- 횟수를 나타내는 범주형 변수의 경우, 해당 횟수의 숫자로 인코딩
- ex) ‘1회’ → 1, ‘6회 이상‘ → 6
- 적용 컬럼 : "총 시술 횟수", "클리닉 내 총 시술 횟수", "IVF 시술 횟수", "DI 시술 횟수", "총 임신 횟수", "IVF 임신 횟수", "DI 임신 횟수", "총 출산 횟수", "IVF 출산 횟수", "DI 출산 횟수"
- 나이를 나타내는 범주형 변수의 경우, 범위로 주어짐 → 해당 범위의 평균값으로 인코딩
- ex) ‘만18~34세’ → 26, ‘만35~37세’ → 36
- 적용 컬럼 : "시술 당시 나이", "난자 기증자 나이", "정자 기증자 나이“
- 나머지 변수형 변수에는 One-Hot-Encoding 적용 →
최종적으로, 111개의 독립변수와 1개의 종속변수의 데이터를 얻음
3. 모델 구축
3-1. 데이터 불균형 해소를 위한 샘플링 기법 적용
- 샘플링 기법 적용 시점도 고민이 필요함
- 샘플링 기법은 훈련에 사용되는 데이터에만 적용되어야 한다.
- 검증하는 데이터에는 샘플링 기법이 적용되면 안 됨 → 적용된다면 모델 성능이 왜곡될 가능성 존재
- 따라서 train-test-split을 한 다음, train set에 대해서만 샘플링 기법을 적용하고 test set으로 성능 검증 진행
→ 이를 k-fold에도 똑같이 적용되도록 코드 작성
3-2. 샘플링 기법을 정하기 위한 실험
- RandomForest, XGBoost, LightGBM, CatBoost 분류 모델에 대해서 실험 진행
- 큰 데이터 크기 문제로, RandomForest는 추후 후보군에서 제외
- 샘플링 적용 전(basic)과 Random OverSampling, Random UnderSampling 기법을 2배수, 3배수로 적용해 성능 비교
- 모델 훈련 과정
- Stratified- K Fold로 데이터를 train set, validation set으로 분할
- train set에 대해 샘플링 기법 적용
- 샘플링 기법이 적용된 train set을 이용하여 모델 학습 진행
- 학습된 모델을 validation set으로 성능 확인
- 이를 K번(k = 5로 진행) 반복하여 얻은 성능의 평균값을 확인
- 해당 실험으로 구한 가장 좋은 샘플링, 모델 조합 → 샘플링 적용 X + LightGBM
- k fold 평균 auc : 0.738864
- 지난 LG Aimers 5기에서는 모델 앙상블을 통해, 성능이 많이 향상 됨 → 모델 앙상블 진행
- 앙상블 기법인 Voting , Stacking , Weighted Blending 진행
- 기본 모델들을 앙상블한 경우 꽤나 성능 향상이 됨
- k fold 평균 auc : 0.739193
LG전자 자동차 디스플레이 불량품 예측 모델 개발 - LG Aimers 5기 온라인 해커톤
| 프로젝트 개요프로젝트명 : LG전자 자동차 디스플레이 불량품 예측 모델 개발공모전명 : LG Aimers 5기진행 기간 : 2024.08.01 ~ 2024.08.27프로젝트 목표 : LG VS(Vehicle Solution) 사업본부의 자동차 디스
pmq0328.tistory.com
- 그러나, 단일 모델을 하이퍼 파라미터 튜닝한 것보다는 성능이 낮고, 여러 모델을 튜닝한 다음 앙상블을 하니 오히려 public 성능이 낮아짐
- 따라서, 해당 프로젝트에서는 모델 앙상블을 사용하지 않고 단일 모델의 하이퍼 파라미터 튜닝에 집중함
3-3. optuna를 이용한 하이퍼 파라미터 튜닝
- 가장 성능이 좋았던 샘플링 적용 X + LightGBM 조합에 대해서 하이퍼 파라미터 튜닝 진행
- 하이퍼 파라미터를 튜닝해주는 AutoAI Optuna 사용 초반 탐색은 랜덤으로 진행하다가, 나중에 TPESampler를 이용해 집중 탐색 진행
- 랜덤 30회, 집중 탐색 100회 진행 튜닝 후 평균 k fold auc : 0.740108
- 튜닝 결과 중 좋은 성능을 보인 3개를 뽑아 앙상블을 진행했지만 오히려 성능이 낮아짐
4. 후처리 진행
- train 데이터를 살펴보는 중 일정한 규칙 발견
- 시술 당시 나이가 '알 수 없음’이면 → 항상 '임신 성공 여부'는 0의 값을 가짐
- 배아 생성 주요 이유가 '난자 저장용', '기증용’이면 → 항상 '임신 성공 여부'는 0의 값을 가짐
- 따라서, 이 경우에 해당하는 최종 예측 확률값을 0으로 지정하는 후처리 진행
- pubilc 점수의 미미한 상승 확인 → 최종 적용하기로 결정
- 0.7414300336 → 0.7414302443 (정말 미세한 차이.. 0.0000002)
5. 최종 결과
- public : 0.74143 (141등)
- private : 0.74184 (116등)
6. 마무리
- 2-1 초반에 한 시도에서 언급한, 시술 유형에 따라 IVF, DI로 나눈 뒤 모델 예측하는 것이 맞는 방향이라고 확신했었다. DI의 경우에서만 발생하는 결측치도 자연스럽게 처리가 되고, 해당 경우에 맞는 최적 모델을 더욱 잘 만들 수 있다고 생각했기 때문이다.
하지만, 성능 파악의 어려움, 시간 등의 요소 때문에 하나로 합쳤지만 성능이 그렇게 오를지는 몰랐다.
(0.002 정도 향상했다. 이는 매우 미미한 상승으로 보이지만, 해당 대회 1등과 100등의 성능 차이가 0.002가 안된다.)
이를 통해, 무조건 맞다고 생각한 방식도 다시 돌아보는 시간이 필요하다고 느꼈다. - ROC-AUC를 평가지표로 하는 대회를 처음 참가했다. 분류 모델 평가 지표로는 F1 Score를 사용하는 대회에만 참여해봤는데, F1 Score에 비해 ROC-AUC 값이 잘 오르지 않았다. 이는 대회 리더보드를 보면 더욱 확실히 알 수 있다.
위에서 언급했지만, 해당 대회 1등과 100등의 성능 차이가 0.002가 안된다.
또한 샘플링 기법처럼 ROC-AUC에 큰 영향을 주지 못한 기법도 있었고, 임계값 최적화처럼 F1 Score의 경우 적용할 수 있는 기법을 적용 못하기도 했었다. 평가 지표의 변화가 꽤 많은 것에 영향을 줄 수 있다는 것을 이번 대회에서 체감할 수 있었다. - optuna를 이용한 하이퍼 파라미터 튜닝 중, trial 수를 늘릴 수록 내부 지표가 상승했다. 따라서 200번,500번 이렇게 시도를 했는데, 내부지표는 상승했지만 public 점수는 오히려 낮아졌다. k fold를 이용한 내부지표가 상승하면 public 점수 역시 상승할 것으로 예상했지만, 해당 경우는 아니었다.
내부지표를 믿을 것인가, public 점수를 믿을 것인가를 선택해야하지만, 대부분의 팀들은 public 점수가 높은 모델을 최종적으로 택할 것이고, 우리 팀 또한 그러했다.
'Project' 카테고리의 다른 글
| 부산대학교 정학관 활용 방안 경제성평가 - 경제성공학 텀프로젝트 (0) | 2025.03.15 |
|---|---|
| 이미지 분석을 통한 식단 기반 질병예측 및 보험 추천 인슈어테크 플랫폼 - 부산대학교 핀테크융합전공 연구 아이디어 경진대회 (0) | 2025.03.13 |
| 소득 예측 모델 개발 및 성능 향상 - 소득 예측 AI 데이콘 해커톤 (0) | 2025.03.11 |
| 기업 리스크 관리를 위한 유튜버 등급 평가모형 및 예측모델 개발 - 삼성화재 X POSTECH 2023 데이터기반 리스크관리 경진대회 (0) | 2025.03.08 |
| 침수발생 예측을 활용한 침수 대비 대안 차량 경로 도출 - 인공지능응용 텀프로젝트 (0) | 2025.03.07 |