Project 21

[2022 빅콘테스트] 앱 사용성 데이터를 통한 대출신청 예측분석 - 문제 파악 및 데이터 살펴보기

2022 빅콘테스트 퓨처스부문에 참가하게 되었다. 데이터 분석에 대하여 아는 바가 거의 없었지만 맨땅에 헤딩하는 심정으로 참여하게 되었고, 감사하게도 같은 과 선배들이 팀원으로 받아들여주셨다. 대회 문제는 아래와 같다. 앱 사용성 데이터를 통한 대출신청 예측분석 가명화된 데이터를 기반으로 고객의 대출상품 신청여부 예측 (2022년 3~5월 데이터제공 / 2022년 6월 예측) 예측모델을 활용하여 탐색적 데이터 분석 수행 대출신청, 미신청 고객을 분류하여 고객의 특성 분석결과 도출 크게 두 가지의 문제로 나누어 볼 수 있는데, 하나는 고객의 대출상품의 신청여부를 예측하는 이진분류 문제, 다른 하나는 고객의 특성 분석결과를 도출하는 클러스터링 문제이다. 먼저 데이터테이블 정의서를 통하여 데이터를 탐색해보았다..

느낀 점, 보완점

혼공머신으로 아주 간단한 머신러닝 기법들을 공부한 뒤, 빅콘테스트에 이어 모델들을 실제로 사용해 볼 경험으로 삼아 나가본 데이콘 대회. 실제 데이터를 받아보고 제공된 baseline 코드를 살펴보니, 정형 데이터임에도 불구하고 딥러닝 기반 학습을 이용한 방식이어서 놀랐다. 제공된 데이터 자체는 빅콘테스트보다 다루기 쉬웠다. 하지만 훈련에 제공된 feature와 test할 때의 feature가 다르다는 점, (feature가 일부로 제한됨) 과대적합 문제를 해결하기 어렵다는 점 등에서 모델링은 빅콘테스트보다 훨씬 어렵게 느껴진 것 같다. 실제로 공유된 코드를 살펴보면 데이터 전처리보다는 모델링에 신경을 많이 쓴 사람들이 많았다. 나는 이번에 결국 baseline 코드에서 하이퍼파라미터만 살짝 수정한 방식으..

Modeling (2) 과대적합 해결, 최종 제출본 완성

baseline을 이용하여 모델을 학습시켜 보니, train set에서는 f1 score가 79~ 80점대로 형성되는 반면, validation set에서는 f1 score가 50~51점대로 형성되는 것을 확인할 수 있었다. 이는 상당히 과대적합되어있다고 판단되어, 딥러닝 학습에서 over fitting을 해결하는 방법에 대해 탐색해 보았다. 또한 전처리 과정을 하나하나 넣어서 모델을 학습시켜보니 isolation forest기법을 이용한 이상치 처리는 데이터의 유실이 많아서 그런지 과소적합 현상이 발생하여 이상치는 따로 처리해 주지 않는 방향을 선택하였다. 3) Under/Over-fitting 해결방법 Overfitting Overfitting(과대적합)이란 모델이 Train set 에서는 좋은 성능..

Modeling (1) Baseline 분석

모델링은 DACON에서 제공하는 Baseline 코드를 활용하였다. Baseline 코드는 Knowledge Distillation 방법 중 가장 기본적인 방법을 적용하다. 즉, 모든 Feature가 주어지는 학습데이터로부터 Teacher 모델을 학습시키고 추론 시에는 제한된 Feature로 이루어지기 때문에, 제한된 Feature로부터 추론해야하는 Student 모델을 Teacher 모델의 결과를 바탕으로 지식 증류가 이루어진다. '지식 증류(Knowledge Distillation)'의 방식은 상당히 여러가지가 제안되어 있고, 참가자들의 가설과 실험에 의해 충분히 새로운 방법도 제안될 수 있다. import torch import torch.nn as nn import torch.nn.function..

Data Processing (3) 불균형 데이터 처리

출처: https://www.youtube.com/watch?v=Vhwz228VrIk&list=PLpIPLT0Pf7IoTxTCi2MEQ94MZnHaxrP0j&index=7 안녕하세요! 이전에 신용카드 사기 검출 실습에서 불균형 데이터를 다뤘었는데 불균형 데이터를 처리하는 다른 방법들은 무엇이 있을까 궁금하여 찾아보다 제가 강의를 자주 듣던 김성범 교수님 채널에서 불균형 데이터 분석을 위한 샘플링 기법 강의를 보고 공부하여 포스팅하게 되었습니다. 그럼 불균형 데이터를 처리하는 여러 샘플링 기법들에 대해서 알아보겠습니다. 불균형 데이터란? 1-1. 개념 1-2. 문제점 데이터를 조정해서 불균형 데이터를 해결하는 샘플링 기법들 2-1. 언더 샘플링 2-1-1. Random Sampling 2-1-2. Tome..

Data Processing (2) Feature Scaling

Feature Scaling이란? 서로 다른 변수의 값 범위를 일정한 수준으로 맞추는 작업이다. Feature Scaling을 하는 이유는? 변수 값의 범위 또는 단위가 달라서 발생 가능한 문제를 예방할 수 있다. 머신러닝 모델이 특정 데이터의 편향성을 갖는 걸 방지할 수 있다. 데이터 범위 크기에 따라 모델이 학습하는 데 있어서 bias가 달라질 수 있으므로 하나의 범위 크기로 통일해주는 작업이 필요할 수 있다. 연속형 변수를 가진 피쳐들의 단위가 대부분 비슷하지만, 다른 단위가 섞여 있으므로 정규화를 진행하고, 범주형 변수를 가진 피쳐들은 label encoding을 진행해 주었다. Scaling Code 작성 categorical_features = ['COMPONENT_ARBITRARY', 'YE..

Data Processing (1) 결측치 처리

Isolation Forest 모델을 import해서 clf라는 변수로 지정해주고, for문과 연속형 변수를 갖는 컬럼명만 모아놓은 numerical_features 리스트를 이용하여 컬럼 하나씩 모델에 학습시켜준다. train_list = train.columns.to_list() for i in train_list: a = train[i].isnull().sum()/len(train)*100 print(i, '결측치:', a, '%') percent70UP = list(train_info[train_info['nullPCT'] >= 70.0]['dataFeatures']) train = train.drop(percent70UP,axis=1) print(train.shape) 결측치 비율이 70% 이상..

EDA (4) 데이터 시각화

target값 분포 시각화 plt.subplots(figsize = (8,8)) plt.pie(train['Y_LABEL'].value_counts(), labels = train['Y_LABEL'].value_counts().index, autopct="%.2f%%", shadow = True, startangle = 90) plt.title('Anomaly Ratio', size=20) plt.show() 이진분류에서 1값의 비율이 8.53%, 즉 target값은 불균형 데이터인 것을 알 수 있다. Feature 시각화 categorical 변수인 feature가 target값(anomaly)과 어떤 관계가 있는지 seaborn 라이브러리의 countplot을 이용하여 나타내 보았다. countplo..

EDA (3) 결측치, 이상치 확인

결측치 확인 test.csv와 train.csv의 결측치를 확인하였다. Train 데이터의 Feature 중 Test 데이터에 존재하지 않는 Feature(진단 환경이 아닌 Feature)는 대부분 결측치인 것을 확인할 수 있다. 이상치 확인 boxplot을 그려 이상치를 확인하는 방법 column 특성에 따라 정의 # 범주형, 연속형 변수의 특징으로 분할해 정의함. categorical_features = ['ID','COMPONENT_ARBITRARY', 'YEAR', 'Y_LABEL'] numerical_features = [i for i in train.columns if i not in categorical_features] test_features = [i for i in test.column..

EDA (2) 데이터프레임으로 정리

DACON 에서 TeamBALAB이 공유한 EDA코드를 바탕으로 EDA를 진행하였다. train = pd.read_csv('/content/drive/MyDrive/train.csv') test = pd.read_csv('/content/drive/MyDrive/test.csv') # show dataframe for each features that we have dataFeatures = [] dataType = [] null = [] nullPCT = [] unique = [] minValue = [] maxValue = [] uniqueSample = [] for item in list(train): dataFeatures.append(item) for item in dataFeatures: da..