1. Data 선정 이유(기존 베이스 코드) → XG, LGBM 두 모델에서 성연이 전처리 된 데이터 보다 기존의 베이스 라인의 전처리 데이터가 성능이 조금 씩 더 좋았음 (성연이 코드 그대로 돌렸을 때 그대로 성능이 안나왔는데 몬가 깃에 올린거랑 다른 부분이 있을지도 라는 생각이듦 ,, 내가 pull을 할 때 뭘 잘못했을 지도 싶음)

    성연이 코드 그대로 돌려도 2.142가 안나왔음 2.151나옴 (베이스라인 코드: 2.154) 피어세션때 얘기할 부분! (이 부분 수정되면 더 높아질 듯?)

    → 추가적으로 EDA를 베이스라인에서 하고 있어서 이 데이터로 돌린 것도 있음!!(참고바람)

  2. XGBM, LGBM 보다 CATB가 더 좋은 이유

    1. 일단, XG, LGB 둘 다 명목형 데이터에 대해서 one-hot or label-encoding을 진행함

    2. 그러나? 우리 데이터 자체가 워낙 각 feature마다 범주가 너무 큼. 그렇다면, 뭐가 효과적일까? 당연히 차원이 엄청 크게 늘어날 차원의 저주를 피하기 위해선 label-encoding을 활용해야됌 (물론, 전처리 때 EDA를 통해서 그룹화 시키는 작업이 있다면 One-hot이 나을 수 있음. 현 상황에 빗대어서 설명하는 것임)

      -> 아래 사이트가면 둘을 언제 써야할 지 자세히 나옴.

      Label vs OneHot Encoder

    3. 그렇다면 여기서 문제 Label-Encoding이 뭐냐? label들을 모두 수치로 변환해서 진행하는 것 아닌가. 이러한 문제점에서 등장한게 CatBoost Model임**(Ordered Target Encoding) →** 아래의 예시로 들자면 weather 변수의 Cloudy에서 Sun 구하고 싶다면 (15 + 14 + 20) / 3 [이전데이터 평균] 이렇게 구함

      Untitled

      Ordered Target Encoding은 범주형 변수에 대해서 예측하려는 현재 데이터 이전의 범주형 변수들의 타겟 값을 평균으로 대체하는 식임

    4. 이러한 흐름을 봤을 때 Cat말고 다른 부스팅 모델을 건드리는게 의미가 있을까? 난 없다고 생각함. → 현재 범주형 데이터에서 전처리가 덜 된 데이터가 튜닝과 교차검증을 마친 후 다른 팀의 성능보다 월등히 좋은 이유

    3. 그렇다고 CatB만 써야할까?

    1. 그건 아니라고 생각함. 앞에서도 말했듯이 전처리만 잘 거치고 가설에 입증할 수 있는 데이터를 통해 범주를 줄여서 차원을 적당히 잘 조절한다면 다른 Model 역시 좋은 성능을 낼 수 있다고 생각함.

    2. 단, 우리가 시간이 별로 없기 때문에 Cat을 사용하는 것이 현실적으로 좋은 판단? 이라고 볼 수 있다고 생각함. 그래서, XG, LGBM 보다 바로 최적화코드도 짤겸 마무리 단계까지 한번 돌린 것임.

    3. 앞으로 해야될 건 무엇인가?

      1. 우선, 도출한 변수 중요도를 통해 전처리 작업을 다시 하는 것이 중요하다 생각함. 그리고, 현재 전처리 진행 상황이 많이 안되서 모델링에 대해서 고민하는 것 보다는 데이터를 만지는게 남은 시간에 있어서 더 현명하지 않을까? 하는 생각
      2. 어떤 모델과 CatBoost Model을 앙상블하면 좋을 지 고민을 많이 할 필요가 있을 듯. 압도적인 성능을 보아하니 무조건 쓰면 좋을 것이라는 판단이 듦.
      3. 내가 생각하기에는 튜닝이야 금방 하는건데 (이 말이 말이 안되는게 네이버 GPU 사용하니 거의 뭐 예전에 대회에서 컴터 켜놓고 자는 그런건 상상도 못함) 특정 모델에 잘 적용하도록 전처리를 열심히 해서 성능 올리는게 좋을 것 같음
    4. Tuning으로만 성능이 올라갔을까?

      1. 나는 그렇게 생각하지 않음. Tuning iter 과정에서 물론 2.12 (지금보다 약 0.01이 낮은 수치가 나오긴 했지만)라는 높은 성능이 나오긴 했지만 우리의 레이블 분포 상황을 보자.

        Untitled

        → train data의 rating(y값) 평점 분포를 확인한 것이다. 7~ 10점이 약 65% 이상 차지하고 있음을 알 수 있다. 여기서 할 수 있는 최적의 교차 검증은 Stratified-CV 이다. Label 분포를 기준으로 비율을 맞춰서 fold를 선별하는 기법인 만큼 아마 여기서 가장 성능이 질수 있는 이유가 아니였나 싶다.

        • Cat의 장점

      아래 사이트 참고!

      [CatBoost] CatBoost 알고리즘에 대한 이해

      1. Ordered Target Encoding이외의 범주형 처리방식인 Categorical feature combination(특정 수의 범주형 변수들이 동일한 것이 있으면 두 변수 모두 사용하지 않고, 하나의 변수만 사용해서 dimension줄임)역시 범주형 변수 처리에 있어서 좋은 성능을 냈다고 생각함.
      2. 일반적인 Boosting 기법이 아닌 Ordered Boosting → Overfitting 방지 (데이터 셋 순열 적용, 데이터 샘플에 Ordered Boosting 진행) 이 부분은 조금 더 공부가 필요함!
      • 성연이 피드백 참고

    (성연이 의견) → 개인적으로 데이터의 개수가 유저와 book 수에 비해 부족한 것이지 30만개면 굳이 Stratified-CV 방법을 사용하지 않고 단순 CV를 해도 Stratified에 가까울 것이라 생각. 다만 원인 파악에서에 생각이지 Stratified-CV를 하지 말자는 것은 아님. Stratified-CV를 해서 손해볼 일도 없고 risk도 없으니깐, 즉 적용해서 나쁠 것 없다고 생각. 내 주관적인 생각으로는 K-fold를 적용해 여러 모델을 만들었기 때문에 일반화된 퍼모먼스를 보장하는 앙상블효과가 날 수있었고 Tuning 또한 역할을 했다고 생각.

    → 데이터의 개수를 위해 했다기 보다는 하나의 validation fold에 대해서만 진행하는 hold-out 방식 보다는 5개의 폴드에 대해서 CV진행하면 일반화의 성능은 더 뛰어날 것이라 생각해서 진행함! 물론, 학습의 양이 증가하기 때문에 데이터의 개수가 늘어나는? 이라고도 볼 수 있지만, 학습이 많아진다고 성능이 좋아지는 것이 아니니 이 부분은 CV를 사용하는 이유에 대해서 생각해보면 될듯 (데이터의 개수와 stf-cv와의 연관성은 잘 모르겠음 어떤 측면에서 연관성이 있는것인지 설명부탁드립니다)

    → Stratified는 위의 Class 불균형이 심한 것 같아서 CV를 진행할 경우 한쪽으로 치우칠 fold가 발생하는 경우가 있을 수도 있으니까 사전에 방지하는 느낌으로 사용한 것임. 오버샘플링 역시 고려할 수 있는 부분이라고 생각함 !