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
'IT&게임 > 빅데이터분석기사(빅분기)' 카테고리의 다른 글
[빅분기] 여러가지 에러 케이스 (0) | 2024.06.18 |
---|---|
빅데이터분석기사 제2유형 : 회귀문제 예제1 (0) | 2024.06.07 |
빅데이터분석기사 제2유형 : ⑥ 평가지표 (0) | 2024.06.06 |
빅데이터분석기사 제2유형 : ④ 머신러닝 (분류) (1) | 2024.06.06 |
빅데이터분석기사 제2유형 : ③ 피처엔지니어 (스케일/인코딩) (2) | 2024.06.06 |
댓글