일지/네부캠 AI 4기(22.09.19~23.02.14)

20221027금-5th of Pstage, Offline in 역삼

제로타이 2022. 10. 29. 12:10

조금만 더..

하다가 만 것이 너무 기억에 남아 간밤에 그냥 조금만 더 만져봤다. 일단 이것은 전체 인원에 대한 평점 분포를 나타낸 것. 전반적으로 8점을 많이 준 것을 확인할 수 있다.

11676번은 5520번 평점을 남겼다는데, 저게 말이 되냐..? 뭔가 이상하다 싶어 혹시 이게 유의미한 어떤 차이를 보일까 싶어서 상위 10명이 내린 평점량의 평균을 내보았다. 전체 평점 데이터의 5퍼센트에 해당하는 값이 저 10명으로부터 나왔다. 이들을 조금 유의깊게 볼 필요가 있다.

그래프 모양이 조금 다르기는 하다. 아까 11676번의 평점만 따로 찍어보기도 했는데, 비슷하긴 하지만 1점을 전체 분포보다는 많이 줬더라고.
하지만 이 정도 차이면서 전체의 5퍼센트이다. 엄청나게 이상한 값을 넣고 있지는 않으니 이 정도 차이라면 따로 전처리를 해줄 필요는 없어 보인다. 이상치에 민감한 RMSE라지만, 이 정도는 봐주지 않을까.. 하는 안일한 생각을 해본다.
사실 평점에 대해 볼 게 너무 많다. 국가별 평점은 복기 님이 봐주시기로 크게 이상한 값은 없었다.
하지만 아직 우리는 장르별 평점도 확인해야 하고, 장르별 연령대가 내린 평점도 확인해야 한다.
동건 11
인자: 임베딩 차원 64, 학습 횟수 30,
전처리: 유저 지역 결측 보완, 책 출판사, 책 범주, 유저 지역 빈도에 따른 퉁치기, 유저 나이 결측 보완(현재 분포 기준)
모델: FFM + WDN

흠. WDN보다는 DCN이 확실하게 잘 학습을 한다는 것은 알겠고, 이전 결과들과 비교해봤을 때는 이번에는 전처리가 유의미해보이지 않는다. 이를 어떻게 해석해야 할까? DCN만 전처리가 유의미하게 작용한다는 뜻일까?
사실 이 전처리도 아직 불안한데, 현욱 님 아이디어로 전체 나이 분포로 결측을 채우는 것보다 결측된 유저가 장르에 따라 주는 평점을 보고 나이대를 추측해서 주면 더 좋을 것 같다고 했었다. 나도 그것에 십분 동의하는데 어떻게 해야할지 잘 감이 잡히지 않아서 일단 나는 손을 놓으련다.
이제 내가 정말로 알아봐야 할 것은 콜드 스타트에 대비하는 방법이다.
잠깐. 그런데 그러고보니 우리는 1점부터 10점까지의 정수 값으로 사람들이 평점을 주는 것을 알고 있잖나? 그러면 다중 분류로 접근해야하지 않나? 평가는 RMSE로 받겠지만 우리의 모델은 소맥에 크엔으로 학습해도 되지 않을까?

화딱지

어제 글을 태블릿으로 쓰다가 저장이 안 돼서 다 날아갔다. 그래서 오늘 오전 시간을 들여 다시 배운 내용들을 정리하고 있었는데, 엣지가 멈추더니 방금 또 다 날아갔다. 어제 내용을 차근히 복습하고 있다가 다 날아가니까.. 조금 화가 많이 나네. 자세한 정리는 때려치우고, 간단하게만 요약하자. 

어제 다중 분류 문제로 바꾸는 시도를 했다가 포기했다. 메인이 있는데 서브퀘스트에 너무 집착할 순 없다. 희원 님의 요청으로 책 데이터에서 희소 언어를 others로 퉁치는 작업을 했다.

끽해야 2퍼센트. 날려버리는 게 더 나을 수도 있다.

그 2퍼센트에 25가지나 되는 언어가 있다. 버릴 만할지도. 어차피 나중에 전처리 코드만 지우면 원상복귀라 미리 만들어둬서 나쁠 건 없다.

계속 염두해두고 있던, 들어온 데이터를 나눠서 처리하는 것을 하루 종일 고민했지만 혼자서는 답을 얻지 못 했다.

wandb 사용법을 조금 익혔다. 도움을 준 희원님께 감사를.

멘토 미팅 때 프로젝트의 분업에 대해 더 이야기를 들었다. 이후 MLOps에 대해서도 강의를 해주셨다. 도움되는 내용이라 오늘 다시 자료를 보면서 정리하던 차에 전부 날아가버렸다..

피어세션. 팀이 분할되었다. 희원 님과 현욱 님이 모델 팀, 나머지가 데이터 팀. 모델 팀은 각종 모델들의 장단점을 비교해보기, 데이터 팀은 데이터의 특징과 문제점 캐치해보기.
새로운 범주화, 결측 메꾸기, 콜드 스타트 고려, 쓰레기값 치환하기. 내가 해야할 것. 이것은 데이터를 다루는 일을 해보고 싶은 나에게 필요한 일 같다. 이상치를 찾고, 전처리할 방법을 강구해보자.
콜드 스타트 아이템의 정보는 쉽게 확인할 수 있을 것.
쓰레기값을 치환하는 것은 새로운 범주화에 포함될 수도 있다.

이후 또 소득 없이 생각하는 시간만 흘러가다 알고리즘 스터디 참석. 

코어타임 끝난 이후에는 5조 분들과 함께 저녁을 먹었다. 사실 술을 마실 줄 알았으나, 멘토 님이 아예 술을 안 드시는 분이셔서 밥을 먹고 카페를 가는 시간을 가졌다. 그리고 카페에서 내 고민을 해결해줄 단서를 얻을 수 있었다.
그래도 이건 조금 중요하게 다룰 필요가 있겠다. 부끄럽지만 거의 야매로 오랫동안 1등을 해먹고 있었는데, 이것이 정말 별 일이 아니라고 생각했기에 5조 분들에게 내가 한 방식을 공유했다. 아무래도 다들 딥러닝 모델로 접근하는 것이 좋지 않을 것이라고 거의 잠정 결론을 낸 상태였는데 내가 딥러닝 모델을 사용했다는 것에 대해서 조금 놀라는 눈치였다. 그리고 내가 가진 인사이트가 기발한 구석이 있다고 칭찬해주셨는데, 흠. 기발한가? 잘은 모르겠다. 나는 다만 당장 내게 주어진 것들을 조합해볼 뿐이라 뭔가 새로운 모델을 써야겠다는 시도는 오히려 해보지도 못 했다. 
아무튼 이런 이야기를 나누며 내가 가지고 있는 고민사항에 대해 이야기를 했는데, 한 분이 자신의 아이디어를 제시해주셨다. 그런데 이 방법이 듣고보니 너무 말이 돼서, 어제 당장 집에 가서 코드를 뜯어보고 싶었다. 이 방법이 정말 성공한다면, 나는 이 분께 정말 큰 도움을 얻었다고 말할 수 있을 것 같다. 아니, 성공하지 않더라도 나는 캐치하지 못한 새로운 접근법을 공유해준 것만으로도 감사하지. 오늘은 데이터 분석도 분석이지만, 일단 이 방법을 한 번 시도해보고 싶다.
간단하게 그 방법이 무엇인지 말해보자면, 데이터의 특성에 따라 데이터를 나눠서 모델 학습을 시키되, 그것을 토대로 예측을 진행할 때는 배치 사이즈를 1로 둬서 해당 데이터가 어떤 모델에 들어가야 하는지 예측 단계에서 분류를 해주는 것이다. 어차피 데이터로더를 뜯어보면 알 수 있지만, 테스트셋은 셔플되지 않은 상태로 들어가게 된다. 그것을 하나씩 받아가면서 판다스로 비교해 각 데이터를 적절한 모델에 넣어 값을 내주기만 하면 되는 것이다.
또 한가지 방법이 더 제시되었다. 그렇게 나누는 데이터 별로 정렬을 해버리면 안 되는가? 나는 안 된다고 생각했다. 테스트셋에 정렬된 방식을 유지해야 리더보드에서 제대로 평가가 될 것이라고 생각했기 때문이다. 그런데, 사실 내가 그것을 확인해보지를 않았다. 만약 확인했는데 리더보드에서 내가 데이터를 정렬하는지의 여부를 신경쓰지 않고 잘 평가를 한다면? 정렬을 하는 것은 아주 매력적인 선택지가 될 것이다.

10시 쯤에서야 서로 헤어지게 됐는데, 이때 술이 고픈 소수 인원이 남아 간단하게만 술을 걸쳤다. 다들 막차 시간을 고려해야해서 많이는 못 마시고 간단하게 맥주만. 

끄적일 이야기가 많은데, 두 번이나 글이 날아가니까 귀찮아서 그냥 이 정도로만..
사람들을 대하는 것은 아직도 어렵지만, 계속 노력해나가자고.