빅데이터분석기사/코드

[빅데이터분석기사] 작업형 2유형 예시문제 풀이

EveningPrimrose 2023. 5. 25. 01:10
반응형

빅데이터분석기사 작업형 2유형 예시문제

 

import pandas as pd

X_test = pd.read_csv("data/X_test.csv")
X_train = pd.read_csv("data/X_train.csv")
y_train = pd.read_csv("data/y_train.csv")

# X_train에 적용한 전처리를 X_test에 동일하게 적용해야 함.
# Data Science에서는 X_train과 X_test를 합친 데이터로 전처리를 하는 것은 Data Leakage 위배
# 기본적으로 X_train은 현재만 알 수 있는 정보이고, X_test는 알 수 없는 정보이기 때문에 합쳐서 전처리를 하는 것은 대뢰나 공모전에서 실격 사유에 해당.

# LabelEncoding -> text 형태의 데이터를 정수 형태로 인코딩(ex. 강남점 = 1, 일산점 = 2, ...)
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()

# X_train으로는 fit_transform을 해주고 X_test에 대해서는 transform만 적용
X_train['주구매지점'] = le.fit_transform(X_train['주구매지점'])
X_test['주구매지점'] = le.transform(X_test['주구매지점'])

X_train['주구매상품'] = le.fit_transform(X_train['주구매상품'])
X_test['주구매상품'] = le.transform(X_test['주구매상품'])

# 결측치 처리 -> 0, 평균, 중위값 등 특정 값으로 대체하거나 레코드 자체를 삭제 혹은 컬럼을 삭제하는 것도 방법(단, X_test에 대해서는 레코드 삭제 불가)
# 알고리즘을 사용해 결측치를 채우는 방식도 있지만 코드 실행 시간을 고려하여 위의 방법만 사용하여도 무방
# print(X_train.isnull().sum()) 코드 실행 시 환불금액 컬럼에 2295개 레코드가 결측치인 것을 확인
# print(X_test.isnull().sum()) 코드 실행 시 환불금액 컬럼에 1611개 레코드가 결측치인 것을 확인

# 1) 컬럼 삭제
# X_train.drop('환불금액', axis = 1, inplace = True)
# X_test.drop('환불금액', axis = 1, inplace = True)

# 2) 평균값으로 대체
X_train.fillna(X_train.mean(skipna = True), inplace = True)
X_test.fillna(X_test.mean(skipna = True), inplace = True)

# 모델링을 위해 input 데이터 구성
X = X_train.drop('cust_id', axis = 1)
y = y_train['gender']

# test 예측용 input 데이터 구성
target = X_test.drop('cust_id', axis = 1) # 혹은 target = X_test[X.columns]

from sklearn.model_selection import train_test_split
# y_train의 gender별 비중을 고려하여 학습/검증 데이터 분할할 때도 stratify를 사용하여 비중 동일하게 구성
tr_x, val_x, tr_y, val_y = train_test_split(X, y, test_size = 0.2, random_state = 42, stratify = y, shuffle = True)

# 모델은 간단하게 3개 사용
# 1) LogisticRegression
# 2) RandomForest
# 3) LightGBM

from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from lightgbm import LGBMClassifier

lr = LogisticRegression(random_state = 42)
rf = RandomForestClassifier(random_state = 42, max_depth = 5)
lgbm = LGBMClassifier(random_state = 42, max_depth = 5, learning_rate = 0.01, n_estimators = 2000)

# 모델 학습(학습 데이터)
lr.fit(tr_x, tr_y)
rf.fit(tr_x, tr_y)
lgbm.fit(tr_x, tr_y)

# 검증을 위해 검증 데이터로 예측값 생성
# 평가지표가 roc-auc이기 때문에 남자일 확률(probability)가 필요 -> predict가 아닌 predict_proba 사용
# 이 때, 남자일 확률(1)로 확률 output 값 중 두번째 열이기 때문에 [:, 1]로 지정
lr_pred = lr.predict_proba(val_x)[:, 1]
rf_pred = rf.predict_proba(val_x)[:, 1]
lgbm_pred = lgbm.predict_proba(val_x)[:, 1]

# validation 성능 확인
from sklearn.metrics import roc_auc_score

lr_score = roc_auc_score(val_y, lr_pred)
rf_score = roc_auc_score(val_y, rf_pred)
lgbm_score = roc_auc_score(val_y, lgbm_pred)

print('Validation Score 확인')
print(f'{lr.__class__.__name__} ROC-AUC : {lr_score}')
print(f'{rf.__class__.__name__} ROC-AUC : {rf_score}')
print(f'{lgbm.__class__.__name__} ROC-AUC : {lgbm_score}')

# test 데이터에 대해 예측값 생성
te_lr_pred = lr.predict_proba(target)[:, 1]
te_rf_pred = rf.predict_proba(target)[:, 1]
te_lgbm_pred = lgbm.predict_proba(target)[:, 1]

# 앙상블 -> 3개의 예측값의 평균값을 csv로 제출
pred = (te_lr_pred + te_rf_pred + te_lgbm_pred) / 3
submission = pd.DataFrame({'cust_id' : X_test['cust_id'], 'gender' : pred})
submission.to_csv('수험번호.csv', index = False)

print('답안 작성 종료!')
# 답안 제출 참고
# 아래 코드 예측변수와 수험번호를 개인별로 변경하여 활용
# pd.DataFrame({'cust_id' : X_test.cust_id, 'gender' : pred}).to_csv('000000000.csv', index=False)

 

 

 

반응형