[AIB7] Section3 project 회고
드디어 오늘 section3 프로젝트의 피드백까지 끝났다. 새삼스럽게 벌써 부트캠프를 시작한지 3달가량이 지났다는게 놀랍다. 벌써 세달이 지나갔다고...? 하는 느낌이다.
Section3 Project의 주제는?
내가 만든 프로젝트의 주제는 "대충 이런 게임을 만들건데 사람들이 얼마나 관심을 가져줄지 한번 볼까?" 이런 느낌이라서 서비스 이름을 짓기가 정말 애매해서 결국 발표할 때도 제가 발표할 주제는 이렇습니다. 하고 발표 영상을 찍었는데 다들 서비스 이름을 기가막히게 잘 지으셔서 머리를 좀 더 굴려서 그럴싸한 이름 한번 만들어볼걸 하고 쪼금 후회했다. 이름을 못지어서 발표 영상용 피피티를 만들 때도 아래처럼 진행해버렸다.
Project 설명
우선 프로젝트는 전체적인 파이프라인을 한번 경험해 본다는 것에 의미를 두고 진행해서 최대한 간단하게 만들었다. 간단하게 만들어서 전체적인 파이프라인을 경험해보고 싶었다. 물론 섹션을 진행하면서 한번씩 경험해봤지만, 그래도 내가 하나부터 열까지 다 코딩하면서 경험해보는것이 좋다고 생각했기 때문이었다. 그리고.. 이번 섹션에서는 과제랑 스프린트 챌린지가 모두 3점을 받았기 때문에 프로젝트도 3점을 받고 싶다는 욕심이 있었다. 받을지는 모르겠지만😅 받으면 자랑하러 와야지...
데이터 가져오기
첫번째로는 API를 사용해서 데이터를 받아왔다. RAWG API를 사용했는데 딱 봤을때 데이터를 쉽게 가져올 수 있을 것 같아서 마음에 들었고, 인증키 발급도 바로바로 나오는 편이라 이 API를 선택했다. 문제는 카테고리 데이터들의 범주가 많아도 너무..! 많다는 점이었다. 그리고 장르와 태그 데이터 부분에서 반복문을 사용해서 0번째 혹은 1번째 데이터를 가지고 오게 되면 죄다 "Action" 혹은 "Singleplayer"가 나와서 문제였다.
나름대로 극복을 해보려고 randint를 사용해서 랜덤으로 장르와 태그를 가져왔지만 데이터의 범주가 기하급수적으로 늘어나게 됐고 태그는 결국 length가 400을 넘어버렸다. 그리고 태그 부분에서 또 문제가 있었는데 바로 "Steam"이 들어간 태그였다. 전혀 게임의 소개에 도움이 되지 않는 태그였다.
왜 게임의 소개에 도움이 되지 않는다고 생각했냐면, 스팀은 게임을 다운로드하고 플레이할 수 있도록 지원해주는 곳이다. 내가 생각한 주제는 일단 "게임을 만들기 전" 단계이고 "구상" 단계이다. 근데 스팀은 이미 출시된 게임을 파는 곳이라서 내가 만드는 모델의 학습에 전혀 도움이 안된다고 생각했다. 그리고 어떤 게임을 소개할 때 "이 게임 스팀에서 인기있어" 이렇게 설명한다면 그래서 그 게임이 뭐하는 게임인데? 하는 답이 돌아올거라고 생각했다. 게임에 대한 설명력이 전혀 없는 태그라고 판단해서 나름대로 if문을 사용해서 가져온 태그에 steam이 들어가있으면 다시 랜덤으로 숫자를 뽑아서 태그를 가져오게 했는데 내 생각대로 잘 안됐다.
프로젝트 영상을 제출하고 나서 고민해본건데 아예 태그를 list로 받아와서 랜덤으로 하나를 뽑고, 그 태그가 steam이라면 list에서 제거한 뒤에 다시 랜덤으로 하나를 뽑는 방식으로 했다면 태그 부분에서 steam이 눈에 띄게 줄어들지 않을까? 라는 생각을 했다. 이건 나중에 프로젝트를 보완할 시간이 생기면 한번 도전해보기로 했다.
데이터 적재
나는 우선 API를 통해서 가져온 데이터들을 pandas를 통해서 데이터 전처리를 미리 해준 다음에 MongoDB에 넣어줬다. MongoDB를 선택한 이유는 나중에 Dashboard에서 서비스를 사용한 유저들이 넣은 데이터를 띄워보기 위함이었다. SQLite로 데이터를 넣자니 그럼 유저들이 넣은 데이터를 새로고침한다고 해서 대시보드의 내용이 바뀔 것 같지 않았다.
데이터 전처리와 모델 학습
데이터 전처리는 카테고리 데이터 위주로 해줬다. 우선 장르 부분을 Top9을 선정해서 9개의 장르와 나머지로 설정했고, 태그 부분도 똑같이 설정해줬다.
그리고 대망의 전처리가 된 태그..인데 아무리봐도 망했다 싶었다. 사실 저것도 Steam Achievements 태그가 줄어든거라고 하면 믿어지시나요? 원래는 한 3천정도 나왔는데 그래도 데이터를 다시 가져오고 위에서 말했던 if문으로 조금 거르니까 2천 4백 정도로 줄어들었다. 여기서부터 모델 성능이 망하겠구나..싶어서 조금 더 시간을 쏟고 싶었는데 이미 API 탐색 & 선정 그리고 계속해서 데이터를 다시 가지고 오는 바람에 시간이 부족해서 그냥 진행해버렸다.
그리고 R2 score를 찍어보고 절망에 빠졌다.
이걸 보고 아 데이터 다시 가지고 와서 전처리 다시하고 인코딩도 다른걸로 고민해봐야겠다...싶었다. 그래서 지금까지 진행했던 코드들을 죄다 뜯어고치고 category encoder들을 찾아보기 시작했다.
사실 봐도 내가 아는 거라곤 onehot과 target뿐이라서 그냥 무작정 다 해봤고, target으로 인코딩 했을 때가 R2 score가 제일 좋아서 결국 target으로 결정했다.
근데 target encoder가 인코딩할 때 같은 수치를 가진 서로 다른 두개의 데이터를 같은 수치로 표현하는 단점이 있다는 글을 봤다. 다행인건지 같은 수치를 가진 데이터가 없어서 그냥 썼지만 target encoder를 사용할 땐 주의해야할 것 같다.
데이터를 몇번이나 다시 가져오고 다시 전처리를 하면서 API가 막혀서 이제 데이터를 못가져오면 어떡하지 하는 걱정을 많이 했다. 그래서 현실과 타협하기로 했다. 시간이 부족하기도 하고, 만약 다시 가져오다가 막히면 그건 그거대로 자괴감이 들 것 같아서 0.1에서 0.32로 올랐으니 행복하다고 세뇌하면서 모델 튜닝을 놔줬다.
Flask & heroku
Flask에서는 딱히 기억나는 에러가 없을정도로 자잘자잘한 에러였는데 heroku로 배포할 때 문제가 생겼었다.
! [remote rejected] main -> main (pre-receive hook declined)
에러 메세지를 살펴보는데 처음에는 이것만 보여서 진짜 이게 대체 뭔지 한 2시간 정도 열심히 구글링을 했다. 근데 안되는 바람에,, 그때가 밤 12시가 넘은 시간이라서 포기하고 아 이제 그만하고 내일 해야지! 했는데 이게 자꾸 생각나서 잠이 안왔다. 그래서 3시쯤에 자려고 누웠는데 결국 잠은 못자고 다시 노트북을 켰다. 그리고 나서 에러 메세지를 다시 천천히 읽어보는데 이게 보였다.
Failed to find attribute 'app' in 'flask_app'.
web: guricorn --workers=1 'flask_app:create_app()'
원래는 flask_app 안에 app.py와 templates 폴더만 있었던지라 Procfile을 적을 때도 'flask_app:create_app()'가 아닌 flask_app:app로 설정했었는데 구글링을 해보니까 app를 인식을 못한다는 글이 몇개 보였다. 그래서 APP로 설정해서 해보라길래 APP로 해봤는데도 인식을 못해서 결국 코드를 __init__.py와 main_views.py로 나눠버렸다. 저렇게 하니까 다행스럽게도 인식이 돼서 git push를 성공했고, 드디어 배포도 됐다.
Metabase (Dashboard)
메타베이스는 처음에 MongoDB를 당연하다는듯이 SQL문을 써서 데이터를 탐색하려고 하니까 안됐다. 당연하겠지 NoSQL인데 SQL문이 통할리가 없다!^^
그래서 MongoDB에서 사용하는 쿼리를 구글링해서 쓰려고 했는데 이상하게도 내가 쓰는 쿼리는 자꾸 안됐다. 자꾸 에러가 나서 열받았다. 그래서 그냥 쉽게 가자!! 하면서 Metabase에서 제공해주는 Simple 쿼리 사용해서 데이터 탐색했다😉
전체적인 후기
좀 더 퀄리티 있게 만들고 싶었는데 생각보다 flask의 자잘자잘한 에러들이 많아서 시간을 꽤 잡아먹혔고, heroku와 모델링에서 애를 많이 먹어서 .. 결국 퀄리티 있는 웹 페이지는 못만들었지만 나중을 기약하면서 꼭 보완하겠다고 마음을 먹었다. 짧은 시간 안에 결과물을 만드는 프로젝트인지라 섹션1에서도, 섹션2에서도 아쉬움이 남았었지만 특히나 이번 프로젝트가 너무 아쉬웠다.
그래도 전체적인 파이프라인을 경험한것에 대해서 박수를 치면서...나중을 기약하고..보완 꼭! 해야지
Author And Source
이 문제에 관하여([AIB7] Section3 project 회고), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@woooa/AIB7-Section3-project-회고저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)