우리FISA

우리FIS아카데미(우리FISA) 14주차 AI 엔지니어링 미니프로젝트 복습

히그다스 2023. 7. 30. 20:38

 

 

이번주에 진행한 미니 프로젝트 

 

조별로 주제 정해서 데이터 튜닝해보기

 

자료는 Kaggle의 Bank Marketing Data를 사용했다

 

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib import rc

 

필수적인 pandas와 numpy를 비롯한 시각화 라이브러리 import

 

Bank Client Data만 사용하여 해당 고객의 예금 가입 여부를 예측해보았다

 

 

1차적으로 pandas profiling으로 자료 파악

 

 

 

 

Baseline Model을 먼저 만들었다

 

LogisticRegression, DecisionTreeClassifier, XGBoostClassifier, KNN

 

이렇게 4개를 활용했다

 

여기선 내가 맡았던 KNN에 대해서만 작성

 

from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier

# 모델 정의
knn_clf = KNeighborsClassifier(n_neighbors=5)

# 학습
knn_clf.fit(X_train, y_train)

 

 

필요한 라이브러리 import 해주고

 

int인 나이만 빼고 나머지는 one-hot encoding 진행

 

다시 나이와 합쳐주기

 

#age 제외 encoding 할 데이터
X_encoding = X[['job', 'marital', 'education', 'default', 'housing', 'loan']]

# X에 대한 인코딩 실행
from sklearn.preprocessing import OneHotEncoder

X_encoding = pd.get_dummies(X_encoding)
X_encoding

#encoding 후 합치기
X2 = pd.concat([X['age'],X_encoding], axis=1)
X2.head()

 

 

예금 가입 여부는 yes/no이기 때문에 label encoding으로 진행해도 무관할 거라 판단

 

 

# y에 대한 인코딩 실행(yes / no 밖에 없어서 라벨인코딩으로)
from sklearn.preprocessing import LabelEncoder

labelencoder = LabelEncoder()
y['y']= labelencoder.fit_transform(y['y'])

 

전체 데이터 중 33%만 테스트 데이터로 빼두기

 

#test_size: 0.33
X_train, X_test, y_train, y_test = train_test_split(X2, y, test_size=0.33, random_state=42)
X_train.shape, X_test.shape, y_train.shape, y_test.shape

 

모델 학습시키기

 

from sklearn.neighbors import KNeighborsClassifier

# 모델 정의
knn_clf = KNeighborsClassifier(n_neighbors=5)

# 학습
knn_clf.fit(X_train, y_train)

 

모델을 예측시켜 나온 점수 비교

 

knn_clf.score는 0.877정도 나왔다

 

knn_clf.score(X_test, y_test)

y_pred = knn_clf.predict(X_test)
print(classification_report(y_test, y_pred))

 

 

이건 y_pred의 결과

 

 

데이터 튜닝을 위한 2차 DEA를 진행했다

 

나이를 10단위로 잘라 구간 설정

 

# 나이대를 10 단위로 변경

bank3['age'] = pd.cut(bank3.age, bins=[0,19,29,39,49,59,69,79,89,99], labels=['10s','20s','30s','40s','50s','60s','70s','80s','90s'])

 

근데 2차 DEA에서 yes와 no의 심한 불균형 발견

 

 

진작에 발견하지 못한 건 비슷할 것이라는 편견 때문

 

no를 5천개만 비복원 추출해서 진행했더니

 

0.886 -> 0.612 정도로 score가 떨어졌다 (LogisticRegression 기준)

 

그래서 베이스라인과 같은 데이터 상태로 진행

 

knn.clf_score가 0.879로 소폭 상승했다

 

knn_clf.score(X_test, y_test)

y_pred = knn_clf.predict(X_test)
print(classification_report(y_test, y_pred))

 

y_pred 결과

 

 

 

결과적으로 다음과 같다

 

여기선 KNN만 설명했지만 다른 결과도 같이 게시한다

 

이 미니 프로젝트를 통해 얻은 것은

 

1.  모델링 전에 자료를 잘 파악해야한다는 것

2. 데이터 양에 따라 나오는 score가 많이 바뀐다는 것

 

크게 두가지다

 

그 중에 더 중요한 건 당연히 데이터를 섬세하게 잘 파악하는 것

 

비교해보면 다음과 같다

 

데이터를 중간에 변형하지 않으면 데이터 튜닝 후 score가 상승하는 모습을 보인다

 

처음 실행한 방법에서 score가 떨어졌다고 한 것은 데이터의 차이 때문

 

잘못된 비교였기 때문에 떨어졌다고 할 수 없다

 

 

발표 후에 데이터의 불균형을 맞추는 것에 대해서도 수업을 들었다 

 

그건 다음에

 

👋👋

 

 


출처 :  Kaggle, 우리 조 발표자료