경 탁

[데이콘] 펭귄 몸무게 예측 경진대회 #2 본문

- 공부/2. AI

[데이콘] 펭귄 몸무게 예측 경진대회 #2

김 경 탁 2021. 12. 29. 16:52

 안녕하세요 ~ 
지난번에 이어 요번에는 본격적으로 모델링하고 EDA를 진행할까 합니다.
말은 거창하지만 PYCARET 모델 여러개 만들어서 섞고
툴 이용해서 EDA 한다는 거 ~ 
 이번에 쓰인 툴은 지난번과 똑같이 'PYCARET' 에 자동EDA툴인 'PANDAS-PROFILLING' 입니다.
(저희 도구를 사용하자고요 ㅎㅎ)
 본 포스팅은 저번 포스팅에 이어 하는 것이니, 저번 포스팅의 코드를 생략하도록 하겠습니다.

1. 자동 EDA & 레포트 받아보기 

import pandas_profiling
report =train.profile_report()
report
report.to_file('./pr_report.html')

 지난번의 TRAIN 데이터를 툴을 이용하여 EDA 자료를 만들어냅니다.
사실 다른 툴을 이용해서 직접 시각화 및 EDA 까지 하면 좋긴 하나,
제 기준에서는 PROFILLING 만으로도 DATA에 대해 많이 알 수 있더라고요.
그래서 툴만 이용해서 진행하겠습니다.
 참고로 가장 하단의 코드는 EDA 결과를 REPORT 파일로 변환하는 것으로 조그만한 창에서 보는 것보다 
크게 보는 데 도움이 됩니다.

2. 레포트 읽어보기 

 

 파일을 열게 되면 이런 페이지가 뜨는데, 정말 일목요연하게 잘 설명되있음을 알 수 있습니다.
일단 간편하게 독립변수들의 특징이 어떠한지 ~ (범주형이냐, 등등)
결측치도 있는 지 없는 지 알 수 있고, 데이터의 양도 알 수 있습니다. 

 그외에도 이렇게 시각화 자료까지 제공합니다. 정말 한눈에 보기 편하쥬 ~ ? 
그것보다 더 좋은 기능은 바로 ... ! 

 이렇게 두 변수간의 관계도 쉽게 알 수 있다는 것 ! 
한눈에 봐도 FLIPPER LENGTH(펭귄의 팔(날개) 길이) 와 몸무게가 양의 상관관계를 지닌다는 것이죠 ?
사실 상식적으로 생각해봐도 헤비급 리치하고 플라이급 리치가 다르니 당연한 사실 같습니다.

 상관계수도 쉽게 파악할 수 있는 데, 

  • Delta 15 N (o/oo) : 토양에 따라 변화하는 안정 동위원소 15N:14N의 비율
  • Delta 13 C (o/oo) : 먹이에 따라 변화하는 안정 동위원소 13C:12C의 비율

위 두 변수가 읽어도 뭔 소린지 모르겠고 마치 함정 같아서 없애버리려고 하다가 높은 상관계수를 보고는 
그대로 진행하리라 다짐했습니다. (여기 관련 전공이신분들께서 보시면 설명 부탁드립니다 ㅎㅎ) 

3. 결측치 제거 

train1 = train.dropna(axis=0)

 결측치를 제거하겠습니다. 사실 PYCARET을 이용하면 결측치를 알아서 해결해준다고 하는데, 

 

 위의 설명을 읽어보면 그냥 제거하는 것은 아까우니, 수치형의 경우 평균 ! 범주형의 경우 'CONSTANT'(?) 을 대입해준다고 하는데, 저는 그냥 결측치를 제거했습니다. 
 데이터가 총 5개가 줄어드네요. 

4. 모델 생성 및 튜닝 

from pycaret.regression import *
exp2 = setup(train1, target = 'Body Mass (g)', ignore_features=['id'])
compare_models()

et = create_model('et', cross_validation = False)
rg = create_model('ridge', cross_validation = False)
knn = create_model('knn', cross_validation = False)

tune_et = tune_model(et, optimize = 'RMSE', n_iter = 100)
tune_rg = tune_model(rg, optimize = 'RMSE', n_iter = 100)
tune_kn = tune_model(knn, optimize = 'RMSE', n_iter = 100)

 모델을 생성하고 튜닝까지 맞춰줍니다 ~ (지난 포스팅에서 다뤘던 내용이므로 간략히 지나가겠습니다.)
기준은 RMSE 값이 가장 작은 'EXTRA TREE REGRESSOR' 및 릿지 회귀 그리고 KNN 회귀로 하겠습니다.

 ㅋㅋ RMSE값이 125만 나와도 소원이 없겠네요 ... 

5. 모델 blending 

blended_model = blend_models(estimator_list = [tune_et, tune_rg, tune_kn], fold = 10, optimize = 'RMSE')

 

 앙상블이나 부스팅은 많이 들어봤는 데 블랜드는 처음 들어봐서 찾아왔습니다.
제가 보기에는 앙상블의 한 종류 같은데, 조금 더 찾아보니 모델들을 TRAINING SET에 피팅하고 VALIDATION / TEST SET 에 대해 예측, 그리고 VALIDATION SET에 대한 예측이 새로운 모델을 만드는 데 사용한다고 하네요.
(역시 어렵네요 이 곳은 ... @_@) 

6. 최종 테스트 결과 제출 

final_model = finalize_model(blended_model)
df = predict_model(final_model,test)
result_3 = df[['id','Label']]
result_3.rename(columns = {'Label' : 'Body Mass (g)'}, inplace = True)
result_3
result_3.to_csv('3.csv', index = None)

 제출해보니 RMSE 값이 286이 나오는 군요 ~ +_+ 
저번 포스팅에 비하면 매우매우매우 장족의 발전입니다. 
오늘은 벌써 3번이나 제출해버려서 못 제출하는 데, 대회가 끝날때까지 계속 점수를 내리는 데 집중해야 될 거 같습니다.
 다음 포스팅에서는 다른 분들께서 올리신 코드를 참조하고 데이터에 여러가지 시도를 해보겠습니다.
감사합니다 :-) 

Comments