분석시각화 대회 코드 공유 게시물은
내용 확인 후
좋아요(투표) 가능합니다.
[public: 0.60998] tensorflow 딥러닝을 활용한 예측 모델
📌 코드 개요
이 코드는 데이콘 ‘채무 불이행 여부 예측 AI 알고리즘 개발’ 해커톤에 사용된 딥러닝 기반 예측 모델을 구현한 Jupyter Notebook입니다.
ROC-AUC 평가 방식에서 퍼블릭 리더보드 13등, 프라이빗 리더보드 1등을 기록한 모델입니다.
🚀 주요 내용
1. 데이터 로드 및 전처리
• train.csv, test.csv 파일을 로드하여 학습/테스트 데이터를 구성
• UID 컬럼을 제거하고, 종속변수(채무 불이행 여부)와 독립변수 분리
• 결측치 처리(SimpleImputer) 및 StandardScaler로 정규화
• SMOTE 기법을 적용하여 데이터 불균형 해결
2. 딥러닝 모델 설계 (TensorFlow 기반 MLP)
• 입력층 → 은닉층 3개(512, 256, 128 노드) → 출력층 구조
• 활성화 함수: ReLU / 최종 출력층 Sigmoid 적용
• Dropout 적용(0.3) 및 BatchNormalization 활용
• 손실 함수: BinaryCrossEntropy, 옵티마이저 Adam
3. 모델 학습 및 검증
• K-Fold 교차검증을 적용하여 일반화 성능 향상
• roc_auc_score 기반 성능 평가
• GPU 가속을 활용하여 학습 속도 향상
4. 예측 및 제출
• 학습된 모델을 기반으로 test.csv 데이터의 채무 불이행 여부 예측
• 데이콘 제출 형식으로 결과 저장
🛠 사용 환경
• 기기: M1 MacBook Air (16GB RAM)
• 라이브러리: TensorFlow(Keras), Scikit-learn, Pandas, Imbalanced-learn 등
프라이빗 점수는 어떻게 확인하신거에요...?
제 착각이었어요.. 프라이빗은 대회 종료하고 최종순위 결정될 때 사용하는 건데, 지금까지 실험한 것 중 잘 나왔다는 뜻이에요;ㅠ 혼동드려 죄송합니다.
아하 알겠습니다!
범주형 인코딩에서 '현재 직장 근속 연수'에만 label 인코딩을 한 이유가 있을까요?
경우의 수를 다 해보셨는데 가장 점수가 좋았던 건지 궁금합니다!
'현재 직장 근속 연수'에 레이블 인코딩을 사용한 이유는 다음과 같습니다:
1. 순서 정보 보존
- 이 변수는 시간의 순서를 가진 ordinal categorical 데이터입니다
- 원-핫 인코딩을 사용하면 이러한 순서 정보가 손실됩니다
- 레이블 인코딩은 1년 미만 → 1, 1년 → 2, 2년 → 3 등으로 변환하여 순서 관계를 유지할 수 있습니다
2. 차원 축소 효과
- 원-핫 인코딩을 사용하면 10개 이상의 새로운 컬럼이 생성됩니다
- 레이블 인코딩은 하나의 컬럼으로 정보를 표현할 수 있어 모델의 복잡도를 낮출 수 있습니다
3. 수치적 의미 반영
- 근속 연수는 단순한 범주가 아닌 시간이라는 수치적 의미를 가집니다
- 레이블 인코딩된 값들 간의 차이가 실제 근속 기간의 차이를 어느 정도 반영할 수 있습니다
감사합니다!
잘봤습니다! 로그 변환을 왜 저 3개의 변수에 대해서만 했는지 여쭤봐도 될까요?
데이터의 특성상 다음과 같은 변수들이 매우 큰 금액 단위를 가지고 있습니다:
1. 연간 소득 (1백만원 ~ 1천6백만원 범위)
2. 현재 대출 잔액 (0원 ~ 1백2십만원 범위)
3. 현재 미상환 신용액 (0원 ~ 2백6십만원 범위)
이러한 금액 관련 변수들은 일반적으로 다음과 같은 특징을 가집니다:
1. 매우 넓은 범위의 값을 가짐
2. 양의 왜도(right-skewed)를 보임 - 즉, 작은 값들이 많고 큰 값들이 적음
3. 이상치(outlier)의 영향을 많이 받음
로그 변환을 하는 주된 이유는:
1. 데이터의 분포를 더 정규분포에 가깝게 만들어줌
2. 이상치의 영향을 줄여줌
3. 모델의 성능을 향상시킬 수 있음
따라서 위 세 변수에 로그 변환을 적용한 것은 매우 일반적이고 타당한 전처리 방법이라고 할 수 있습니다.
오 감사합니다.
StandardScaler을 이용해서 전처리를 해주신것 같은데
딥러닝 과정에서 Relu함수를 사용하셔서 StandardScaler을 사용하게 된다면, 음수 데이터가 생겨나 정보의 소실이 생길 수 있다고 생각해요
차라리 MinMaxScaler을 이용해서 0과 1 사이로 만들어주거나, 딥러닝 과정에서 BatchNormalization을 추가해서 처리하는 방법도 괜찮을 것 같은데 어떠신가요?
날카롭고 좋은 지적 감사드립니다!!!!! 이 프로젝트에 집중해서 진행했던것도 아니었고, 혼자 해보다보니 이 부분을 고려를 하질 못했네요ㅠ
한번 바꿔서 해볼게요~~
코드 올려주신 덕분에 도움 많이 받았습니다 ㅎㅎ 감사합니다
DACON Co.,Ltd | CEO Kookjin Kim | 699-81-01021
Mail-order-sales Registration Number: 2021-서울영등포-1704
Business Providing Employment Information Number: J1204020250004
#901, Eunhaeng-ro 3, Yeongdeungpo-gu, Seoul 07237
E-mail dacon@dacon.io | Tel. 070-4102-0545
Copyright ⓒ DACON Inc. All rights reserved
Deleted Comment