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

20221124목-dkt9

제로타이 2022. 11. 25. 00:49

노헙

노헙을 쓰면 내 명령이 정말 백그라운드에서 잘 실행되고 있는 것일까? ps만 찍어봤을 때는 나오지 않길래, 추가 인자를 넣어서 찍어봤다. output파일에서 제대로 실행이 되고 있는 것은 이미 확인했지만, 그래도 프로세스가 확인되지 않으니 영 불안해서.. wandb가 실행되는 것도 보이고, 대놓고 아랫부분에는 내 명령어들이 들어간 것이 보인다. 콘솔에 찍히는 로그를 봤을 때는 sweep은 내가 직접 써내야 할 명령어을 직접 stdin에 넣어주는 것 같다. 이후에 추가적으로 상관관계 등의 것들을 분석해주기도 하지만, 기본적인 동작자체는 만들 수 있는 인자 조합을 짜서 나 대신 쳐준다는 것. 
그런데 왜 파이썬 실행이 이렇게 많지? 하고 봤는데, 받는 인자가 전부 같은 것으로 보인다.

이런 식으로 말이다.

추가적으로 ppid도 같다는 것을 확인할 수 있는데, 이는 부모 프로세스라고 하네. 결국 프로세스로는 분리되어 있어도 한 파일 실행하고 있다는 것이다. 확인. 결국 nohup은 내가 원하는 명령을 잘 수행해주고 있다.

와우.. 가짓수를 너무 많이했나? 288개 째인데 아직도 멈추질 않는다.

한 그래프에서 최대로 표현할 수 있는 수가 100개던데, 일단 기본 값인 10개만 표시되도록 해두었다. 아직 확실하지 않은 것이, 최근 10개를 표현해주는 것인가? 그렇다면 어떻게 최대의 값을 뽑은 녀석들만 비교할 수 있을까? 아무래도 sort를 따로 하는 기능이 있는 듯.

데일리 스크럼

모델을 새로 만들었는데, 모델의 검증과 실제 리더보드와의 괴리가 있다. 이를 확인하는 과정이 필요함.

데이터 수가 적을 때, 랜덤 시드를 어떻게 설정하냐에 따라 값이 달라지는 경우도 존재한다. 학습 로스봐 검증 로스가 더 적은 경우가 생긴다.

유저 풀이 7천여명인 이상, 시계열을 활용한 모델이 힘을 쓰기가 힘들다. 특히 트랜스포머를 위해서는 데이터가 많이 필요한데 그에 비해서 데이터가 너무 적다. 
어텐션과 트랜스포머는 공부만 하고 이만 졸업하기. 
fe도 정리가 필요하다. 

catboost 모델파일 만들어서 적용해보기.

무슨 문제가 일어나고 있는 것인가? 대충 파악한 바로는, cat_features는 말 그대로 범주형 컬럼이 무엇인지를 알려주는 부분이다. 그리고 그것은 리스트 형태로, 인덱스를 정확하게 전달해야 한다. 일단 처음 해보는 것이니까, 간단하게 나는 하드 코딩하여 정확한 인덱스 번호들을 전달했다.
더 찾아보니까 범주 컬럼들의 이름으로 전달해도 상관은 없는 듯하다. 다만 수치형이 끼지 않게 해주는 것이 핵심이다. 

순순히 결과가 나오고 있다. 그러나 내 기억보다 학습 속도가 과하게 느리다. 값이 잘 나오지도 않는다. 이전과 달라진 데이터와 인자 값들로 인한 결과일 수도 있다.

그 사이에 sweep한 것도 끝이 난 듯 싶다.

정확하게는 중간서부터 fail이 뜨기 시작했다. 다른 모델을 같이 돌리다가 생긴 문제인가? 어쩌면 출력파일을 내가 건드리면서 에러가 발생하고 결국 이 사단이 난 것일지도 모르겠다.

아직 running 상태라고 나오기도 하고 실제로 프로세스로도 뭔가 돌아가고 있는 것 같기는 한데, 업데이트가 되고 있는 것인지 확실히 확인이 안 된다. git 브랜치를 옮기면서 발생한 문제일지도 모르겠다. 일단 어제와 다르게 이름도 바뀌어서 나오고 있는데, 이 이름 바꾼 것은 내가 오늘 아침 git pull을 한 이후의 일이니까. 왜인지는 모르겠지만 뭔가 데이터가 업데이트 되고 있다는 표시도 나오고 있는 것 같아서 확실하게 확인이 안 되는 상태.

승렬이와 이야기를 나누면서 부스팅 모델을 사용하는 디렉을 따로 파서 코드를 짜기로 이야기가 됐다. 모델을 객체로 만들고 싶었는데, 투머치하다는 승렬이의 의견도 그럴 듯해서 일단 함수형 프로그래밍으로. 근데 여러모로 활용을 편하게 하려면 객체 프로그래밍이 훨씬 좋다고 생각한다. 특히 다양한 모델을 사용하고자 할 때가 그렇다. 다양한 모델이어도 그 속의 메소드 행동을 다르게 지정하면 같은 메소드로 사용이 가능하니까.
나이브하게 성훈이 형 코드를 베껴서 돌아가게 만들어뒀던 것은 잠시 보류하는 것으로..

피어세션

들을 때마다 생소했던 용어 정리. 

원래 아이디어는 부스팅 모델을 쓸 수 있도로 파일을 만들고, 이들의 인자를 관리할 수 있도록 hydra를 써보는 것이었다. 그러나 catboost도 wandb로 나타낼 수 있을 가능성이 있다는 말을 들어서 그것을 알아보려고 한다.

캣부스트를 실행하면 json파일이 만들어진다. 이것만 활용하면 어쩌면 쉽게  wandb에 표현할 수 있을 것 같다. 비단 이것만이 아니더라도, tsv파일이란 것이 만들어지는데 여기에 기록되는 값을 바탕으로 이 json파일이 만들어지는 듯. [Enhancement] CatBoost support in W&B · Issue #965 · wandb/wandb (github.com)

승렬이와 의사 코드를 만들었던 것을 실제로 돌릴 수 있게 수정하는 작업.

일단 간단하게나마 다시 돌아가게 만들어뒀다.

auc와 관련된 것은 없는 걸까?

regressor말고 classifier로 가니 그럴싸한 것들이 나오기 시작한다. 당장은 하나도 모르겠다. 일단 크엔으로 간다!

eval_metric을 사용하면 평가 지표를 정할 수 있다! 이걸 어떻게 할까를 잘 몰랐는데 역시 같이 하는 팀원의 도움을 받으니 빠르게 해결할 수 있었다. 위에는 objective라고 적었다가 문제가 일어난 케이스.

Catboost 주요 개념과 특징 이해하기 (tistory.com) 캣부스트에 대해서 정리가 잘 된 듯한 글.
부스팅 모델은 기본적으로 실제 값과 예측값의 잔차를 이용해 학습을 진행한다. 그것을 기반으로 학습을 진행한다. 그리고 이러한 방식은 오버피팅을 쉽게 일으킨다고 한다. 전반적인 부스팅 모델의 방식이기에 이건 캣부스트에만 한정되는 이야기가 아니다. XG부스트의 경우 인자를 어떻게 넣는지에 따라 오버피팅이 쉽게 걸리기도 한다고 한다.
아무튼 XG부스트와 더불어 캣부스트는 level-wise 형식의 모델이라고 한다. 저번에 잠시 봤지만, leaf-wise는 잎을 먼저 만들어나가는 방식. 
근데 이것을 알기 위해서는 아무래도 먼저 결정 트리를 알아야 할 것 같다. 결정 트리란? 지도 분류 학습 기법 중 하나로 트리를 만들어 나가면서 변수의 값을 예측하는 모델을 만들어 나간다.

생각보다 굉장히 직관적인 설명이다. 아무튼 이것이 결정 트리이고, 이때 캣부스트는 같은 층의 트리들을 먼저 형성해나간다는 것. 

그럼 캣부스트는 뭐가 다른가? 한꺼번에 데이터를 받아 잔차를 따지는 여타 부스팅 모델과 달리 데이터를 순서대로 점차적으로 모델을 만들어 예측을 진행한다. 이를 ordered boosting이라 한다. 순서를 통해 학습한다고 하여 그 순서를 같게 하면 쉽게 오버피팅이 난다. 그러니 랜덤으로 순서를 정하는 요소가 당연히 들어가게 된다. 
또한 평균 인코딩을 취하는데, 이때 자신 이전의 값들만을 활용하여 라벨에 대한 leakage에 대항한다. 또 다른 하나에 종속되는 피쳐는 알아서 걸러준다는 듯. 거기에다가 알아서 파라미터 튜닝까지 해준다. 그냥 미친 놈이다. 
다만, categorical boost인만큼 수치형 변수가 많을 때는 학습 속도가 느리다고 한다.

이거 잘 나오고 있는 게 맞는 걸까? 기회가 생기면 한 번 제출해서 확인해보는 것도 괜찮겠다. 아직 여기에 적용해볼 것은 많다. catboost 자체의 튜닝도 가능하고, cv를 해보는 것도 방법. 둘 다 추가적으로 공부를 더 해야 알 것 같다. 

회고 및 다짐

스윕에 대하여.. 이 놈 아까는 fail 뜨길래 멈췄나 했는데, 멈춘 건 아니고 계속 돌고 있다. 지금도 계속 업데이트 되는 중. 아까 아침에 내가 걸었던 경우의 수가 곱의 법칙으로 얼마나 나오나 해봤더니 2백만 가지가 나왔다. 설마 이것들을 전부 할 건 아니겠지..? 여차하면 그냥 그만두도록 하자. 
오늘 또 아무거나 피어세션을 가졌다. 오늘은 nlp 한 분과, cv 한 분도 오셨다! 특히 데이브 운영진 님도 오셔서 프리 톡 시간을 가졌다. 다른 도메인들의 대회가 어떤지 들었는데, 추천시스템과는 사뭇 다르게 대회가 진행되는 모양이다. 다른 분들의 이야기를 들을 수 있어서 굉장히 특별한 시간을 보냈다. 앞으로도 사람들과 이야기를 하면서 더 많은 것을 흡수하고 싶다.

고향에 돌아가도 그리던 고향은 아니러뇨. 언젠가 돌아갈 것이라 생각했던 길드 소식을 접했는데, 나와 함께 하던 사람들은 어느새 다들 떠나간 모양이다. 하긴, 내가 떠날 때 같은 시기에 주축 멤버들이 빠져나가기는 했으니. 솔직히 지금으로서는 다시 돌아갈지도 모르겠다. 취업 전까지는 아마 할 생각이 안 들지 않을까. 떠날 때는 세상 아쉬웠지만, 막상 떠나고나서는 별 것 아니다. 그 시절에 소중한 추억들도 그 자리에 고이 묻고 나왔으니, 이제는 남 일이 되어버린 것만 같다. 

이제는 더 이상 스페셜 미션을 등한시할 수 없다 생각하여 진도를 조금 나가고, 캣부스트에 얼리스타핑을 적용하는 것을 알아보자. 그리고 다른 부스팅 모델을 적용할 수 있도록 코드를 짜고, wandb에 연결하는 작업까지(이건 수헌이 형이 해준다고 말했으니 기다려보자). 해야 할 건 많다. 내게 어느 정도의 도전을 요구하는 일이지만, 못할 건 또 뭐냐. 이름과 묺항 id, 정답코드만 사용해서 모델 돌려보기.
역시 그놈의 깃이 문제였나, 깃에 취약한 걸 인정하고 들어가니 마음이 오늘은 확실히 안정된다.

와 드디어 0.8의 벽을 넘었다! 모델을 바꾸지 않고도 이 정도로 할 수 있다는 게 새삼 놀랍다.