본문 바로가기
career/자격증

빅데이터분석기사 실기 2유형 템플릿 : 내가 보려고 작성하는 베이스라인

by 고기만두(개발자) 2024. 6. 10. 00:39
728x90
반응형

빅데이터분석기사

7회까지 기준으로는 랜덤포레스트 모델링 / 별도의 튜닝 진행하지 않아도 40점 만점에 지장이 없다는 후기 다수 목격.

상대평가가 아니기도 하고, 내가 어떤 전략을 가지고 있는지 점검하고 마지막에 들어가서 보려고 쓰는 글

1/3유형도 조만간 이렇게 정리해서 올릴 예정...

 

1. 문제정의

  • 분류인지, 회귀인지 확인 : 이거 판단 잘못 하면 0점!
  • 그룹 나누기/ 확률예측(predict_proba)는 분류, 가격예측은 회귀
  • 평가지표 칼럼 확인 : train에 있고 test에 없는 칼럼
  • 제출할 csv파일의 형태 확인 (인덱스 유무, 칼럼수, 칼럼명)
  • 요즘은 주로 train.csv/test.csv 로 나오는 듯 한데, x_train.csv/x_test.csv/y_train.csv 3개 파일일 때도 파일 확인해서 상황에 맞게 대처
728x90

2. 데이터 불러오기

import pandas as pd
train = pd.read_csv(train.csv)
test = pd.read_csv(test.csv)
#칼럼이 많은데 시험환경 콘솔창이 작은 경우
pd.set_option('display.max_columns', None)

 

 

3. EDA : 탐색적 데이터 분석

  • head(), shape()로 칼럼 갯수와 값 확인
  • info()로 칼럼 찍어볼 것 : 시계열 데이터 object인지 datetime인지 특히 꼭 확인
  • describe(), describe(include = "O") 를 통해 수치형/범주형 간단한 통계 값 확인, 이상치 확인
  • 7회까지 6회차 동안 결측치 있는 데이터 나온 적 없음
  • isnull().sum() 을 통해 결측치 확인해서 있다면 .fillna()로 대처 : 최빈값 mode, 중앙값 median, 평균 mean
  • 결측치가 있다고 데이터를 삭제해버리면 안 됨 : 최종 제출 테스트데이터 행숫자 맞아야 함, 과대/과소적합 이슈

 

4. 데이터 전처리

  • 인덱스 같은 불필요한 칼럼은 dataset.drop('컬럼명', axis = 1) 로 날릴 것
  • 제출파일에 id가 필요한 경우 또는 train데이터의 target칼럼: pop('칼럼명')을 사용하여 ctrl+x
  • 나는 주로 pd.get_dummies를 통한 범주형 변수의 원핫 인코딩 선호 (범주 갯수가 수십개씩 되는 경우 비추천)
  • 만일에 사태에 대비하여 라벨인코더 사용방법 알아두기
from sklearn.preprocessing import LabelEncoder
cols= ['job', 'marital', 'education', 'default', 'housing', 'loan', 'contact', 'month', 'poutcome']

#라벨 인코딩 : job이 너무 많아서 어쩔 수 없음
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()

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

구름EDU - 모두를 위한 맞춤형 IT교육

구름EDU는 모두를 위한 맞춤형 IT교육 플랫폼입니다. 개인/학교/기업 및 기관 별 최적화된 IT교육 솔루션을 경험해보세요. 기초부터 실무 프로그래밍 교육, 전국 초중고/대학교 온라인 강의, 기업/

edu.goorm.io

혹시 1유형에서 스케일링이 필요한 경우 sklearn.preprocessing import minmax_scale 이런거 가져올 것

from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import RobustScaler

train[cols] = fit_transform(train[cols])
test[cols] = transform(test[cols])

 

 

5. 검증데이터 분리

from sklearn.model_selection import train_test_split
#순서 기억
x_tr, x_val, y_tr, y_val = train_test_split(train, target, test_size = 0.2, random_state = 0)
  • 타겟데이터 앞에서 분리 해놨어야 했음
  • x_tr, x_val, y_tr, y_val 순서
  • test_size = 0.2로 계속 연습 했는데, train/test 데이터 갯수 보면서 눈치껏 조절. 개인적으로는 20%면 차고 넘치는 듯
  • random_state = 0 고정 : 그래야 재실행해도 고정된 결과가 나옴

 

6. 랜덤포레스트

#randomforestclassifier : 분류
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(random_state = 0)
model.fit(x_tr, y_tr)
pred = model.predict(x_val)


#randomforestregressor : 회귀
from sklearn.ensemble import RandomForestRegressor
model2 = RandomForestRegressor(random_state = 0)
model2.fit(x_tr, y_tr)
pred = model2.predict(x_val)

 

train 데이터 x_tr(X), y_tr(Y) 값으로 모델을 학습하여 검증데이터로 따로 쪼개놨던 testsize만큼의 x_val을 predict

분류모델 중 확률값 예측인 경우 Ex. 구매확률 - predict_proba

*평가지표가 roc-auc-score인 경우에도 predict_proba

*predict_proba 사용하는 경우 [:, 1]  사용해야 함 : [0.4, 0.6] 꼴로 출력되는데, 음성일 확률 , 양성일 확률 이므로, 물론 문제 봐가면서 해야겠지만 우리는 보통 후자를 사용함

반응형

6-1. 번외모델 : 선형/로지스틱회귀, lightGBM, xgboost, 등등이 있지만... 굳이 사용하지 않을 예정

from sklearn.linear_model import LogisticRegression #로지스틱회귀 : 분류
lr = LogisticRegression()
lr.fit(x_tr, y_tr)
pred = lr.predict(x_val)

from sklearn.linear_model import LinearRegression #선형회귀
lr = LinearRegression()
lr.fit(x_tr, y_tr)
pred = lr.predict(x_val)

import lightgbm as lgb
lg = lgb.LGBMClassifier(random_state = 0, verbose = -1) #lightGBM 분류
lg = lgb.LGBMRegressor(random_state = 0, verbose = -1) #lightGBM 회귀

import xgboost as xgb
xg = xgb.XGBRegressor(random_state = 0) #XGboost 분류
xg = xgb.XGBClassifier(random_state = 0) #XGBoost 회귀

*내가 출제자라면 랜포 사용 금지라든가, 이런 특성을 갖는 모델로 하라든가... 등 함정을 팔 것도 같은데

아직 그런적은 없었다고 함.

 

 

7. 평가 지표 : 검증 데이터로 대강 평가지표 확인해볼 것. 너무 낮거나 높으면 가볍게만 의심 (0.8~0.9 넘는 데이터셋 기출된 적 있다고 함)

  • 대부분의 평가지표는 sklearn.metrics 밑에 있음 : help/dir 적극 활용
  • 분류일 때 : accuracy_scor, roc_auc_score, f1_score(micro/macro/weighted), precision_score (micro/macro/weighted) , recall_score (micro/macro/weighted) 
  • 회귀일 때 : mean_squared_error, mean_absolute_error, r2_score, mean_squared_log_error
  • MSE에 루트를 씌워서 계산하는 RMSE가 출제된 적이 있음 : RMSE는 별도 패키지 없음 **0.5 직접 계산해야함.
# RMSE
from sklearn.metrics import mean_squared_error
def getRmse(y_true, y_pred):
  rmse = (mean_squared_error(y_true, y_pred)) **0.5
  return rmse
 
 getRmse(y_val, pred)

 

8. 테스트 데이터 예측 -> 파일 생성

pred = model.predict(test) #반드시 갯수는 테스트데이터와 동일해야 : 테스트데이터 full 버전 대입
submission = pd.DataFrame({ 'pred' : pred}).to_csv('submission.csv', index = False)
     
# result.csv 확인
pd.read_csv('submission.csv')

 

  • 실제 테스트데이터를 선정한 모델에 집어넣어 pred 데이터 새로 생성하고 그 데이터가 테스트 데이터와 행수 똑같은지 확인.
  • 분류 - 확률값 예측하는 모델은 predict_proba
  • 칼럼명 / 인덱스 여부 등 문제 잘 확인하여 csv파일 만들고, read하여 크로스체크

9. 하이퍼파라미터 튜닝 - max_depth, n_estimators 등의 변수를 조정하는 방법이 있지만, 잘못했다가 감점났다는 경우를 들어본 적이 있음. 시간 봐서 남으면 할 지도 모르겠음.

728x90
반응형

댓글