빅데이터분석기사 실기 제2유형
2유형은 머신러닝으로 모델을 세우고 이를 피팅시켜 예측하는 문제이다.
따라서, 해당 유형에선 모델 성능이 우수한 RandomForest를 다루고, 이것만 사용하여 해결하면 된다.
기타 트리기반 혹은 부스팅 모델도 존재하지만, RandomForest 하나면 충분하다.
classification이라면 RandomForestClassifier, regression이라면 RandomForestRegressor를 사용한다.
학습에 참고한 문제는 아래와 같다.
https://www.kaggle.com/datasets/agileteam/bigdatacertificationkr/data
Big Data Certification KR
빅데이터 분석기사 실기 (Python, R tutorial code)
www.kaggle.com
이번 파트는 모든 문제를 동일한 구조로 해결할 것이므로, 본인만의 파이프라인을 구성하는 것이 중요하다.
해당 글은 결측치 처리 → 라벨 인코딩 → 모델 생성 및 학습 → csv 생성 순으로 진행했다.
필요한 라이브러리를 우선 정리하면, 아래와 같다.
import pandas as pd
from sklearn.preprocessing import LabelEncoder
from sklearn.impute import SimpleImputer
from sklearn.ensemble import RandomForestClassifier, RandomForestRegressor
from sklearn.metrics import accuracy_score, r2_score
맨 아래줄의 metric은 사실 없어도 무방하며, 단지 학습이 제대로 됐는지 확인하기 위한 라이브러리이다.
1. 결측치 처리
결측치가 존재하면 모델을 제대로 학습시킬 수 없으므로, 이를 적절히 처리하는 것은 정말 중요하다.
전체 데이터셋 대비 결측치가 적다면 dropna하는 것이 깔끔하지만, y_train도 함께 처리해야하므로 df를 손봐야한다.
따라서, 최빈값으로 대체하여 진행했다.
im = SimpleImputer(strategy='most_frequent')
for col in X_train.columns:
X_train[col] = im.fit_transform(X_train[[col]])
X_test[col] = im.transform(X_test[[col]])
2. dtype이 object인 데이터 처리
dtype이 int나 float라면 모델이 학습하는 데 큰 지장이 없지만, object 타입은 원활하게 학습할 수 없다.
따라서, 이를 적당히 인코딩하는 라이브러리로 object의 dtype을 int로 변경해야 한다.
le = LabelEncoder()
for col in X_train.select_dtypes(include='object').columns:
X_train[col] = le.fit_transform(X_train[col])
X_test[col] = le.transform(X_test[col])
3. 모델 생성 및 학습
1번과 2번 과정에서 data preprocessing을 완료했으며, 정규화는 학습에 필수적인 요소가 아니므로 스킵했다.
RandomForest의 default hyperparameter로도 준수한 성능이 나오므로 믿고 진행하자!
시험에서 굳이 fine tuning까지 진행할 이유는 없다.
model = RandomForestClassifier()
model.fit(X_train, y_train['Survived'])
res = model.predict(X_test)
4. csv 저장
모델 학습까지 완료했다면, 이제 답안지를 저장하면 된다.
2유형의 요구사항대로 pd.DataFrame 모양으로 만들어주고, 인덱스 없이 내보내면 된다.
이후, read_csv로 저장이 잘 됐는지 확인하여 제대로 저장됐는지 확인하면 좋다.
submit = pd.DataFrame({'id': X_test['PassengerId'], 'pred': res})
submit.to_csv('12345.csv', index=False)
chk = pd.read_csv('12345.csv')
print(chk)
Code overview
전체적인 코드는 아래와 같다.
처음 데이터를 불러오고, 데이터 전처리 이후 두 번에 걸쳐 X_train.info()를 통해 데이터셋의 상태를 확인하면 좋다.
import pandas as pd
from sklearn.preprocessing import LabelEncoder
from sklearn.impute import SimpleImputer
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
im = SimpleImputer(strategy='most_frequent')
for col in X_train.columns:
X_train[col] = im.fit_transform(X_train[[col]])
X_test[col] = im.transform(X_test[[col]])
le = LabelEncoder()
for col in X_train.select_dtypes(include='object').columns:
X_train[col] = le.fit_transform(X_train[col])
X_test[col] = le.transform(X_test[col])
print(X_train.info(), X_test.info())
model = RandomForestClassifier()
model.fit(X_train, y_train['Survived'])
res = model.predict(X_test)
print(accuracy_score(model.predict(X_train), y_train['Survived']))
submit = pd.DataFrame({'id': X_test['PassengerId'], 'pred': res})
submit.to_csv('12345.csv', index=False)
chk = pd.read_csv('12345.csv')
print(chk)