Data 처리 및 기타 programming/Python

빅분기 시험용 족보(?)

BS Ryu 2021. 12. 3. 21:57

내일(12/04) 빅데이터 분석기사 실기 보러 가면서 계속 보려고 작성합니다

수정 : (12/24 작성중)합격예정이네요. 2유형은 40점이니 시험에서는 써먹을만 한듯합니다. 외우기 귀찮을때 이정도만 해갑시다.

 

순서 

1) Data 전처리

명목형 -> Encoding

수치형 -> Scaling

가능하다면 pipeline처리하는걸 선호하지만, 이 시험에서는 사족인것같다.

2) Validation data확보 (필수라고 생각합니다 하기 내용 참조)

3) 모델링 및 Hyper Params setting (추천 모델은 무조건 XG boost)

시험에서 필요한정도는 n_estimators랑 max_depth 정도만 건들면 될것같다. 솔직히 depth 3만되면 웬만해서는 고성능 나올게 뻔하니까 분류기만 많이 만들도록해도 될것같다. learning rate써놨던건 사실 lr scheduler 쓸려고 했던건데 굳이 외워야되나라는 생각이 들어가지고 안했다.

4) 모델 피팅 및 성능체크

 

 

주의사항 및 개인적인 견해

0) 작업형은 문제 꼭 끝까지 읽어야한다. 문제 예시코드에 주어진 변수명이 있으면 꼭 따라가야한다. 많은분들이 피흘린 포인트로 알고있다.

 

1) 1분이라는 런닝 타임 제한 : One-hot encoding이 아닌 Label Encoding을 써야할것같다. (이론적으로 나는 One-hot이 맞다고 생각한다. 예를들어, Label처리하여 1부터 10의 카테고리로 변했는데, 수치의 고저에 따른 선형적 경향성이 발생할 수도 있기 때문이다. 그런데 이건 시험이다. 시간제한이 있으니 Label로 가자) categories가 엄청나게 많다고 가정했을때 PCA를 안해주면 모델 학습시간이 아웃될 가능성이 있다.

 

2) 모듈 버전 확인이 필수다. 해당 코드는 3회차를 기준으로 작성해두었다. 예시 사이트 안들어가보고 시험장을 가면 정말로 후회할것이다. 우리가 평소에 무시하던 Warning 이 0점의 원인이 될 수 있다.

 

3) 뇌피셜이지만, 이 시험에서 무조건적으로 y_test Data는 따로 안줄거다. 모델이 이상해도 운좋으면 N%이상의 정확도가 나와버릴 수도 있기 때문이다. train data로 Split해서 validation data로 꼭 성능체크하면서 학습시켜야한다. 성능이 안나오면 Crossvalidation 이나 Gridsearch CV등으로 HPO해야되나 생각하겠지만, 성능 안나올수가없을거다.

 

4) classification으로만 두 번 나온걸로 알고있는데, 다음번 시험에서는 regression이나 Clustering 문제 나올가능성도 충분하다고 생각한다. 대비 버전은 하나씩 가장 최소한의 코드로만 구성해놓기를 추천한다.

 

 

import sklearn
import pandas as pd
import numpy as np
import sklearn.preprocessing
import sklearn.ensemble
import sklearn.neural_network
import sklearn.metrics

X_train = pd.read_csv('/content/gdrive/MyDrive/빅분기/[Dataset] 작업형 제2유형/X_train.csv', encoding='euc-kr')
X_test = pd.read_csv('/content/gdrive/MyDrive/빅분기/[Dataset] 작업형 제2유형/X_test.csv', encoding='euc-kr')
y_train = pd.read_csv('/content/gdrive/MyDrive/빅분기/[Dataset] 작업형 제2유형/y_train.csv', encoding='euc-kr')

X_train['gubun'] = 'train'
X_test['gubun'] = 'test'

X = pd.concat([X_train, X_test],ignore_index = True)
# X.isna().sum()
# X.info()
X.fillna(0, inplace = True)

cat_col = ['주구매상품','주구매지점']
useless_col = ['cust_id', 'gubun']
temp_col = [x for x in X.columns if x not in cat_col]
num_col = [x for x in temp_col if x not in useless_col]

OH_Encoder = sklearn.preprocessing.OneHotEncoder(sparse =False)
OH_DF = pd.DataFrame(OH_Encoder.fit_transform(X[cat_col]))
OH_DF.columns = OH_Encoder.get_feature_names(X[cat_col].columns)

NUM_Std = sklearn.preprocessing.StandardScaler()
NUM_DF = pd.DataFrame(NUM_Std.fit_transform(X[num_col]))
NUM_DF.columns = X[num_col].columns

#merge
X_NEW = pd.concat([X[useless_col],NUM_DF,OH_DF],axis=1)


X_NEW
X_train = X_NEW[X_NEW['gubun']=='train']
X_test = X_NEW[X_NEW['gubun']=='test']

del X_train['gubun']
del X_train['cust_id']

del X_test['gubun']
del X_test['cust_id']

del y_train['cust_id']


xx_train, xx_test, yy_train, yy_test = sklearn.model_selection.train_test_split(X_train,y_train, test_size=0.3)
model = sklearn.ensemble.GradientBoostingClassifier(n_estimators=1000, max_depth = 3, learning_rate=0.01)
model.fit(xx_train,yy_train.values.ravel())
print("train MSE : ",sklearn.metrics.mean_squared_error(model.predict(xx_train), yy_train))
print("test MSE : ",sklearn.metrics.mean_squared_error(model.predict(xx_test), yy_test))
pd.DataFrame(model.predict(X_test))