빅데이터분석기사

빅분기 2유형 (1) (분류)

하웅이 2024. 11. 28. 17:38

* 내가보려고만드는 빅데이터분석기사 정리본 ◠‿◠

* 빅데이터분석기사 시험 대비용 코드 (실제 분석보다 단순화)

* 데이터마님 블로그를 참고하여 작성하였습니다.

 

저 지금 시험 이틀 전 벼락치기입니다 헉헉;

 

렛츠기릿 ( ੭ ・ᴗ・ )੭🔥⭐

 


0. 순서

작업형 2유형 분류 문제 풀이 순서는 아래와 같이 고정해놓음 (총 8단계)

  1. 데이터 불러오기
  2. 이상치 및 결측치 확인
    💥 결측치는 채워넣고, 이상치는 그대로 두기
  3. 범주형 데이터 더미화
    · 라벨인코딩(LabelEncoder) - 순서형 변수
    · 원핫인코딩(get_dummies) - 명목형 변수
    · 분류모형은 뭘쓰던 상관 없음. 특히 트리기반 모형에선 더더욱 상관없음!
  4. 데이터 분할
  5. 학습
  6. 평가
    분류모형 평가지표: accuracy_score, f1_score, recall_score, precision_score, roc_auc_score
  7. 예측
    트리모형: RandomForestClassifier
    트리모형이 가장 무난하기 때문.
  8. 제출

 


1. Baseline Code

8단계에 맞추어 코드를 작성하면 요로케 ~

 

* (기본 정보) 아래 데이터는 서비스 이탈 유무를 분류하는 데이터입니다.
   x_train_data: 6499rows*12columns
   y_train_data: 6499rows*2columns

* 즉, 고객(customer_ID)의 이탈여부(Exited)를 예측하는 데이터

 

## 서비스 이탈 예측 데이터 (분류)
## 고객의 신상 정보 데이터를 통한 회사 서비스 이탈 예측 (종속변수: Exited)

# 1) 데이터 불러오기
import pandas as pd
x_train = pd.read_csv('https://raw.githubusercontent.com/Datamanim/datarepo/main/churnk/X_train.csv')
y_train = pd.read_csv('https://raw.githubusercontent.com/Datamanim/datarepo/main/churnk/y_train.csv')
x_test = pd.read_csv('https://raw.githubusercontent.com/Datamanim/datarepo/main/churnk/X_test.csv')

# 2) 이상치, 결측치 확인 및 삭제
drop_cols = ['CustomerId', 'Surname']
x_train_drop = x_train.drop(columns = drop_cols)
x_test_drop = x_test.drop(columns=drop_cols)

# 3) 범주형 데이터 처리 (더미화)
x_train_dummies = pd.get_dummies(x_train_drop)
x_test_dummies = pd.get_dummies(x_test_drop)
y = y_train.Exited

# 4) 데이터 분할
from sklearn.model_selection import train_test_split
x_train, x_val, y_train, y_val = train_test_split(x_train_dummies, y, test_size=0.3, random_state=52)

# 5) 학습
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(random_state=52)
rf.fit(x_train, y_train)

# 6) 평가
# auc , 확률이라는 표현있으면 model.predict_proba로 결과뽑고 첫번째 행의 값을 가져오기 model.predict_proba()[:,1]
from sklearn.metrics import accuracy_score, f1_score, recall_score, roc_auc_score, precision_score
pred_xtrain_label = rf.predict(x_train)
proba_xtrain_label = rf.predict_proba(x_train)[:,1]

pred_xval_label = rf.predict(x_val)
proba_xval_label = rf.predict_proba(x_val)[:,1]

print('train_accuaracy:', accuracy_score(y_train, pred_xtrain_label)) # 정확도
print('validation_accuaracy:', accuracy_score(y_val, pred_xval_label))

print('train_f1_score:', f1_score(y_train, pred_xtrain_label)) #f1-score
print('validation_f1_score:', f1_score(y_val, pred_xval_label))

print('train_recall_score', recall_score(y_train, pred_xtrain_label)) #재현율
print('validation_recall_score:', recall_score(y_val, pred_xval_label))

print('train_precision_score:', precision_score(y_train, pred_xtrain_label)) #정밀도
print('validation_precision_score:', precision_score(y_val, pred_xval_label))

print('train_roc_auc_score:', roc_auc_score(y_train, proba_xtrain_label)) #roc곡선아래면적(auc)
print('validation_roc_auc_score:', roc_auc_score(y_val, proba_xval_label))

# 7) 예측
predcit_y_label = rf.predict(x_test_dummies)
proba_y_label = rf.predict_proba(x_test_dummies)[:,1] #예측한 각 클래스에 속할 확률

# 8) 제출
submit = pd.DataFrame()
submit['CustomerId'] = x_test['CustomerId']
submit['Exited'] = predcit_y_label
submit.to_csv("1churnk.csv", index=False)

pd.read_csv("1churnk.csv") #확인용