본문 바로가기
IT&게임/빅데이터분석기사(빅분기)

빅데이터분석기사 제2유형 : 분류문제 예제1

by 푸루루 2024. 6. 7.
728x90
반응형

신용카드서비스를 떠나는 고객을 찾아라

  • 나이, 급여, 결혼 상태, 신용 카드 한도, 신용 카드 카테고리 등의 컬럼이 있음
  • 평가: ROC-AUC, 정확도(Accuracy), F1, 정밀도(Precision), 재현율(Recall)을 구하시오
  • target : Attrition_Flag (1:이탈, 0:유지)
  • csv파일 생성 : 수험번호.csv (예시 아래 참조)

<출력의 예시>

CLIENTNUM,Attrition_Flag
788544108,0.633
719356008,0.123
712142733,0.355

 

데이터불러오기

 

import pandas as pd

train = pd.read_csv('train.csv')
test= pd.read_csv('test.csv')

train.head(5)

#데이터의 크기를 확인했더니, train에는 타겟값이 하나 더 붙어 있음
print(train.shape,test.shape)

#타겟값도 먼저 확인하자
#데이터의 불균형이 있음. 성능이 안좋을 수 있어
train['Attrition_Flag'].value_counts()

# 결측값 확인하기 >> 결측값은 없었음 
train.isnull().sum()
test.isnull().sum()

 

데이터 전처리 & 피처엔지니어링

###########################################################
# 첫번째 베이스 라인 
# object 타입이 5개 있으니 제거해보자 
cols = train.select_dtypes(include="object").columns

# train=train.drop(cols,axis=1)

# #test도 항상 똑같이 해줘야함 
# test = test.drop(cols,axis=1)

###########################################################3

# 두번쨰로는 label인코딩도 했을때의 결과를 알아보자

#   # label
# from sklearn.preprocessing import LabelEncoder

# for col in cols:
#     le = LabelEncoder()
#     train[col] = le.fit_transform(train[col])
#     test[col] = le.transform(test[col])

# train[cols].head()

###########################################################
#세번째 원핫 인코딩을 해보자
train= pd.get_dummies(train,columns=cols)
test = pd.get_dummies(test,columns=cols)

 

 

# number는 별 상관이 없으니 걍 지워버림 
train=train.drop('CLIENTNUM',axis=1)
# test 데이터에는 필요함.. (문제에서 제시가 되었기 때문)
test_id= test.pop('CLIENTNUM')

 

 

검증 데이터 분리 

from sklearn.model_selection import train_test_split

# train(타겟값을제거한 데이터임), target, test_size, randome_state
X_tr, X_var, y_tr, y_var = train_test_split(train.drop('Attrition_Flag',axis=1),train['Attrition_Flag'],test_size=0.2,random_state=2022)

 

 

모델 & 평가

# 분류
from sklearn.ensemble import RandomForestClassifier

#random 값을 넣으면 고정되어서 학습해서 비교가 가능 ! 
model = RandomForestClassifier(random_state=2022)
model.fit(X_tr,y_tr) #학습
pred = model.predict(X_var) # 예측
pred

 

from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score

# 정확도
print(accuracy_score(y_var, pred))

# 정밀도
print(precision_score(y_var, pred))

# 재현율 (민감도)
print(recall_score(y_var, pred))

# F1
print(f1_score(y_var , pred))

#baseline 
0.9654534238124615
0.9327731092436975
0.8473282442748091
0.888
0.99

# #label
# 0.9679210363972857
# 0.9411764705882353
# 0.8549618320610687
# 0.896
# 0.989734818484629

# one-hot
# 0.9623689080814312
# 0.935064935064935
# 0.8244274809160306
# 0.8762677484787019
# 0.99
# 0.9881564239534009

 

pred_proba=model.predict_proba(X_var) # 두개를 반환, 0일때 확률, 1일때 확률 
print(roc_auc_score(y_var,pred_proba[:,1]))

#baseline 점수
# 0.992536328350999 굉장히 훌륭해서 제출해도 되지만.. 조금더 학습하겠음

 

예측 및 csv 제출

 

pred=model.predict_proba(test)
pred

submit = pd.DataFrame({
    'CLIENTNUM':test_id,
    'Attrition_Flag':pred[:,1]
})
submit

submit.to_csv('00000.csv', index=False)

 

 

728x90

댓글