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

20221202금-dkt15, 레벨1멘토 회식

제로타이 2022. 12. 3. 23:38

간밤에

좋은 방법이 더 있을 것 같지만, 당장 생각나는 게 없어 대충 이렇게 해봤다. 다돌려. 일단 다 돌리고 보자고. 내 서버가 놀게 하지 말자. 아마도? 이러면 조금이나마 피쳐 간의 연관성이나 중요도를 파악하는데 도움을 받을 수 있을 것 같다.

에에잇 나는 잘 테니까 너 알아서 잘 해봐라. 끽해야 이번에는 200번 정도로 걸리게 돌렸으니 괜찮겠지.

데일리 스크럼

이제 오늘로 고양이는 졸업. 뭔가 아직 더 짚지 못하고 있는 부분이 있을 수 있지만, 슬슬 다른 모델을 시도해볼 시기도 됐다. 이번 대회만이 대회만이 아니고, 다음 대회에서 더 발전시켜보자고.
고양이 모든 수치형을 범주형으로 바꿔보기.

오늘 제출은 고양이로 8개 쓰기. 

혼자 공부하는 SQL

3-1. SELECT ~ FROM ~ WHERE

select 문은 만들어진 테이블에서 데이터를 추출하는 기능을 한다. 이는 데이터를 변경시키지 않는다.

select 열 이름 from 테이블 이름 where 조건식

이번 내용을 위해 책에서는 나름의 예제 데이터베이스를 구축하는 코드를 준비해놓았다.
위에서부터 순서대로 코드들을 보면서 얼추 감을 익혀보자. --을 쓰고 띄어쓰기를 하면 주석처리를 할 수 있다. 
buy를 만드는 부분에서 auto_increment는 번호를 매기는 코드. 이렇게 해두고 , 나중에 insert할 때는 해당 자리를 null로 넣어주면 된다. 그러면 알아서 번호가 매겨진다.

select select_expr
	[from table_references]
    [where where_condition]
    [group by {col-name | expr | position}]
    [having where_condition]
    [order by {col_name | expr | position}]
    [limit {[offest,] row_count | row_count offset offset}]

이게 select를 통해 만들 수 있는 구문. 하위 인자들이 있다고 보면 편하겠다.
이 중에서 가장 많이 쓰이고 기본적인 게 .select from where인 것.

select from

use를 통해 사용할 데이터베이스를 특정한다. 안 한다면, select * from market_db.member를 쓰면 되기는 한다.

특정 열만 보고 싶다면? ,을 이용해서 쓴다. 순서는 내가 원하는대로! 여기에서 특정 열에 별칭을 붙여줄 수도 있다. 사용법은 간단하게 바로 뒤에 큰따옴표를 써서 나타낸다.

where

이제 where 절을 써보자. 특정 조건을 걸면 된다! 이때 등호는 하나만 넣는다는 것을 유의하자.

논리 연산자는 사용법이 똑같다.

 근데 유용한 게 있다. 우리는 1부터 5의 범위를 나타낼 때 통상 두 개의 식을 세워야만 하는데, 여기에서는 between이란 것을 쓰면 된다! 범주형에 대해서는 in을 써서 범위를 나타낸다.
between으로 키의 범위를 잡고, 주소는 in으로 묶어서 and를 통해 교집합에 해당하는 행을 찾았다.

like를 통해 매칭되는 이름을 검색하는 방법도 있다. %는 얼마나 많은 글자가 올지 상관하지 않겠다는 뜻이다. _는 글자의 개수를 특정해준다. 후자의 그림은 언더바를 3개를 주어서 총 4글자면서 끝이 '크'인 그룹을 찾은 격이다.

서브 쿼리라고 부르는 것도 있다. 쿼리 속 쿼리, 잘 보면 안 속에 select문이 들어간 것을 확인할 수 있다. 내부 select문의 결과는 height 164이고, 이를 곧이곧대로 where문에 사용하여 나타내는 것이 가능하다!

  • select
  • from
  • where
    between, in
  • 서브 쿼리

3-2. 좀 더 깊게 알아보는 select 문

이번에는 위에서 본 더 심화된 구절들을 사용해보자.

 order by

order by는 해당 열에 맞춰 정렬을 하는 기능이다. 나는 내 맘대로 별칭을 넣어서 해봤는데, 별칭을 사용할 경우 정렬이 되지 않는 것을 확인할 수 있었다. 기본적으로는 오름차순인 asc로 정렬이 되는데, 뒤에 desc를 넣어 내림차순으로 정렬하는 것도 가능하다.

놀랍게도 where문과 함께 쓸 때는 where이 먼저 나오도록 해야 한다. 정렬하고 내가 원하는 놈 고르나, 원하는 놈 고르고 정렬하나 결국 결과는 같지 않나 싶은데, 그래도 효율적인 방향으로 코드가 작동되도록 제동이라고 걸어둔 것일까?
일단 아무튼 select의 절들은 되도록 순서를 지켜줘야한다고 한다.

order by에는 조건을 더 걸 수 있다. 단순하게 쉼표로 구분해서 넣어주면 된다.

부스팅 모델이란

부스팅 모델. 배깅과 대비된다. 기본적인 방식은 분류 모델을 만들고 정답과 차이가 나는 예측을 한 값들에 대해 가중치를 얹어 데이터셋을 만들어 새로운 분류 모델을 만들어 학습, 이 과정을 계속 반복한 후에 만들어진 모델들을 앙상블하는 adaboost가 그 시초이다. 이때의 분류모델은 통상적으로 결정트리를 사용한다. 
이 다음 나온 Gradient Boosting Machine은 뭘까. 잔차, residual을 활용한다. 그 잔차를 학습하도록 한다. 위 아이디어와 어느 정도는 일맥상통하는 것. 이름에 기울기가 들어가는 것은 잔차의 제곱을 미분하여 학습할 데이터를 움직이는 정도를 정하기 때문. 역시나 이때도 분류 모델은 결정 트리. 또 결국 앙상블을 진행하는 것도 마찬가지.

lgbm은 결정 트리를 만들 때 leaf-wise 방식을 취한다. 옆으로 늘리기보다 잎을 더 깊게 파는 것을 선호하는 것이다. 이는 과적합의 가능성을 높이는 방식이지만, 한편으로 빠른 학습 속도를 자랑한다고 한다. 
또한 기존의 모델들은 범주형 변수를 원핫인코딩을 하는 방식으로 사용했으나 lgbm은 그러지 않는다.

대신 라벨 인코딩은 해줘야 하는 모양이다. 하지만 데이터셋에서 굳이 라벨인코딩을 하지 않고 명시해서 넣어주기만 하면 알아서 인코딩을 해주는 듯하다. 음수값은 결측으로, 0부터 시작해서 인덱싱한다는 듯. 

혹시 predict의 베스트 이터레이션을 걸어두지 않으면 최고의 상태로 예측을 진행하지 않는 것인가? catboost는 찾아봤을 때 그러한 인자는 보이지 않는다.
데이터셋 객체는 데이터로 만들 때 넣어주는 인자가 많고, 그것을 추후 추가시키는 방식의 메소드들이 많다. 반대로 말하면 그냥 인자만 잘 알아도 다른 메소드들을 몰라도 충분하다는 것이다.

lightgbm.Sequence는 뭘까? 설명도 짧고, 무슨 역할을 하는지도 모르겠다. 검색을 해도 마땅한 정리글은 나오진 않는 듯하다. 미완성 기능일 수도?

일단 우리는 대체로 sklearn api를 사용하게 될 예정이니 이제 이쪽으로 들어가보자.

부스팅 타입. gbdt는 일반 결정 트리. dart는 중간중간 드롭아웃을 하는 방식인 듯? 정확도를 높일 때 사용한다고. rf는 랜덤 포레스트인데, 내가 랜포를 잘 이해한 게 맞다면 부스팅이길 포기하고 무작위 트리 만들어서 보팅하는 방식이지 않을까. goss는 one side sampling을 사용하는 방법으로 이게 lgbm이 가지는 하나의 차이점 중 하나라고 알고 있다. 아마 lgbm만의 장점을 누리기 위해서는 goss를 적극적으로 활용하는 것이 좋지 않을까 한다. 이게 무엇인가 하니, 학습 속도를 빠르게 하기 위해 잔차가 큰 데이터는 남기지만 작은 데이터는 랜덤하게 드롭을 하는 방식. 이는 데이터 분포의 왜곡을 야기하며 이를 위해 버린 샘플만치 잔차 적은 데이터를 복붙을 하는 작업도 있다고 한다. 학습 속도를 높이는 방법이지만, 버리는 값도 있기에 오히려 일반화의 측면에서 우위를 점하기도 한다고 한다. 

lightGBM의 핵심이해 goss를 보기 위해 찾은 글인데, 다른 팁들도 있다. 라벨 인코딩을 명시적으로 해주는 게 상대적으로 좋다고 한다. 
efb라는 방법을 통해 원래는 원핫 인코딩됐어야 할 놈을 차원축소시켜서 진행한다. 차원을 축소시키다 보면 어느 행은 전부 0인 값이 있을 수도 있다(원핫에서는 없다). 이 경우에 대해서만 이 방법이 유효하지 않으며 이외의 모든 경우에 대해 잘 작동한다는 듯. 라벨 인코딩과 관련되려나?

학습률. fit에서 컬백 형식으로도 넣을 수 있다는 듯. 

더 다양한 목적함수를 설정할 수 있는가? 분류는 단순히 binary와 multiclass가 전부인가? 이건 그냥 logloss를 쓰겠다는 뜻으로 보인다.

얘네는 예제나 다른 사람의 코드를 보면서 따라하는 것이 좋아보인다.

impotance_type 기본은 split. split을 주면 모델에서 쓰인 횟수도 표시. gain일 시에는 총합으로 나온다.

계속 보면서 느끼는 건데, 고양이보다 설명이 더 잘 돼있는 것 같다. 근본..
목적 함수를 커스텀할 것이라면 어떻게 만들어야 하는지에 대한 정보가 나와있다.

fit을 할 때. 목적함수는 init할 때인데, 평가지표는 여기에서 하는 듯하다. 리스트 형태로 빌트인을 넣을 수 있다.
callback을 통해 iter마다 실행할 함수를 지정해줄 수도 있다.

predict를 진행할 때 이것은 무슨 역할을 할까?

validate_features 학습에 사용된 피쳐를 예측에 사용한다?

dask는 무엇인가? distributed learning. 한 모델에서 복합적인 기계의 사용이 가능하다?

콜백 함수. 당연히 커스텀도 가능할 것이다. 얼리스타핑과 로그 정도가 쓰이지 않을까 싶다. 
얼리스타핑은 iter가 기준이다.

기록을 남기는 함수. 이거는 있다는 것만 알아두고 나중에 쓰면서 보는 게 좋을 것 같다.

나중에 튜닝할 요소들이 무엇이 있을까? XGBoost와 LightGBM 하이퍼파라미터 튜닝 가이드 (tistory.com)

학습률.

그래도 웬만해서 max depth는 -1로 두는 게 가장 낫다네. leaf wise에서는 상대적으로 영향이 덜 하다는 듯.
num leaves는 depth의 제곱  -1 만큼을 최대치로 둘 수 있다.
goss를 쓸때는 subsample은 사용되지 않는다.

좋은 팁이 있어보인다. 순서는 데이터를 돌리면서 나올 만한 최대 깊이를 먼저 파악한다. 그 이후 그보다 작은 값으로 잎의 수를 튜닝한다. 이후 이에 맞춰서 min in leaf를 튜닝.

피어세션

예측의 분포가 의미하는 것. auc에서 중요한 것은 실제 정답과 오답을 잘 나누는게 중요한 것. 

인터랙션은 유저id로만 그룹바이해서 넣어보기
유저 별 여태 몇 문제 풀었는지, 얼마나 맞췄는지 알아보기.

누적합, 누적평균 넣어보기.

인터랙션 차이. 인터랙션 여부로 피쳐를 넣고 빼고 정도. 이번 lb를 활용할 방식.

과연?

자고 일어나면 끝나있을 줄 알았지만 정작 보니 피어세션 때가 돼서야 끝난 피쳐 간 영향 파악. 일단 valid auc를 기준으로 정렬을 해보았다. 무얼 유의미하게 봐야 하는가? 일단 에폭이 너무 적고 이상하게 움직인다 싶으면 무시를 하는 게 좋을 것 같다. 그럼 그것만 남기고 각각의 피쳐 별 중요도를 봐야하는 것일까? 이건 조금 더 고민해볼 필요가 있을 것 같다.

회고 및 다짐

레벨 1 때 멘토님이 한국에 들어오셔서 당시 멘티였던 우리 조와 11조가 한꺼번에 모여서 회식을 하는 자리를 가졌다. 덕에 한번 만나보고 싶었던 11조 분들과 오랜만에 레벨 1 팀과 만나 회포를 풀 수 있었다! 아무래도 대회 중이기도 하고 당장 12시에 축구도 예정되어 있고 집가는 시간이 애매한 인원들이 많아서 2차까지는 가지 않고 그냥 쫑냈다. 
살짝 버튼이 눌리기 직전의 상태였던지라 조금 아쉬웠는데, 엄마랑 집에 드가기 전 노래방 가서 노래나 부르고 왔다. 집에 들어올 때쯤에 아파트 단지 곳곳에서 환호성과 비명 소리가 들렸는데, 그때가 마침 우리나라가 후반 추가 시간에 역전골을 터뜨리던 타이밍이었다. 직접 못 본 게 아쉬울 따름. 

공부에 대한 이야기 없이 있었던 일들만 적고 있네. 오늘은 그냥 정말 각잡고 내가 여태 잘 모르고 사용법만 얼추 익힌 채로 써왔던 부스팅 모델 사용법을 익히는 시간을 보냈다. nohup을 돌려둔 게 있어서 코드로 바로바로 써보지는 못했는데, 생각해보니 그럼 그냥 주피터 파일로 만들어서라도 써보면 되는 걸 또 그 생각을 못했다 에휴.. 아무튼 단순하게 잔차를 학습한다느니, leaf-wise니 할 때는 무슨 말인지 잘 몰랐는데, 조금 더 앞선 영역에 대한 공부가 이뤄지니 무슨 말인지 알아듣겠더라고. 
내가 lgbm을 통해 무엇을 얻어낼 수 있을까 하는 물음도 든다. 일단 첫번째, 많은 글들에서 lgbm이 수치형에, catboost가 범주형에 강하다고 말한다(나는 이것이 단순히 속도에 대한 말로 들리기도 한다). 내 스스로는 이 모델들의 차이가 gru와 lstm 정도의 차이로 생각되기에 비단 catboost만이 아니라 lgbm도 우리가 활용을 해볼 수 있으면 충분히 도움이 될 것 같다. 두번째. 현재 lb에 얼라인이 잘 되지 않는 catboost는 매번 정확한 성능 확인을 해내기가 매우 까다롭다. 이것은 부스팅 모델 전체의 문제인 것인가? 정말 catboost가 잘못됐다던가, 아니면 우리가 잘못 쓰고 있는 것은 아닌가? 사실 잘못 쓰고 있다 보기엔 지금 이거 해결하려고 들인 시간이 얼마냐.. 아무튼 이 고양이쉑에서 발생하는 문제가 무엇인지 파악하는데 도움이 되지 않을까도 생각해보고 있다. 
그러니 일단 해보자. 이것을 잘 만들어두면 다음 대회에서도 분명 활용하는 것이 가능할 것이다.

'일지 > 네부캠 AI 4기(22.09.19~23.02.14)' 카테고리의 다른 글

20221205월-dkt16  (0) 2022.12.06
20221204일-lgbm졸업  (2) 2022.12.04
20221201목-dkt14  (0) 2022.12.02
20221130수-dkt13  (0) 2022.12.01
20221129화-dkt12, 오프라인  (0) 2022.11.30