• benz 데이터셋으로 하고자 하는 목적

    1. 수백 수천개의 피처를 다루는 방법 → 기술통계, 유일 값 빈도수, 왜도, 첨도, 평균, 편차 등
      1. 피처가 너무 많을 때 기술통계 어느 한쪽에 너무 치우쳐진 값이나 대부분 같은 값으로 되어있는 데이터 찾기
      2. 다 같은 값으로 되어있는 데이터 찾기
      3. 계산량을 줄이기 위해 의미없는 데이터를 제거해 주었습니다.
      4. 원핫인코딩을 할 때 범주형 변수에 대해 인코딩을 하고 기존 데이터와 합치는 방법 * 피처중요도를 구할 때 판다스의 데이터프레임으로 되어있으면 어떤 피처에 대한 중요도인지 확인하기가 수월합니다.
    2. Tree 계열 알고리즘 중에 사이킷런 외에 있는 라이브러리의 알고리즘 익혀보는 목적
    3. Hold-out-Validation 방법 : 모델이나 데이터가 클 때 빠르게 확인해 보기 위한 장점 때문에 사용합니다. 교차검증(CrossValidation)에 비해서는 신뢰가 떨어질 수있다는 단점도 있습니다.
    4. XGBoost
    5. LightGBM
    6. CatBoost
  • 데이터의 수가 매우 많을 경우의 피쳐엔지니어링 방법

    → 기술통계의 기술통계들을 구해보거나 , 왜도 첨도를 구해서 데이터의 특성을 파악할 수 있습니다.

    • 인사이트
      1. 0이나 1로 되어있으며, 대부분 0으로 채워진 데이터가 있음을 확인해볼 수 있었습니다 !
      2. 최댓값이 1인 것을 보니, 스케일링이 이미 되어있었다는 것을 확인해볼 수 있었습니다 !

    ⇒ 따라서

    • 2진 변수로 이루어져 있지만 그 중에 대부분이 같은 값으로 구성되어 있는 데이터 & 한쪽 값으로 매우 쏠린 데이터의 경우?
      • 모델이 해당 데이터를 제대로 학습하기 어렵기 때문에 변수로 사용할지 고민해봐야할 필요가 있습니다.
      • 모두 같은 값이거나 대부분 같은 값으로 되어 있는 변수를 제거하였습니다.
      • 왜도 값을 기준으로 절댓값을 씌워 특정 값 이상인 데이터를 찾아볼 수 있습니다.
  • category type으로 데이터를 변경하기

    • 문자열처럼 보이고 작동하지만 내부적으로는 정수의 배열로 표현됩니다.
    • 이를 통해 데이터를 사용자 지정 순서로 정렬하고 데이터를 보다 효율적으로 저장할 수 있습니다.
    • 일부 모델에서는 범주형 피처를 인코딩 없이 사용할 수도 있습니다.

    ⇒ object type 변수들을 category type으로 바꿔줍니다.

  • One-Hot-Encoding

    • sklearn의 원핫인코딩을 하면 numpy array 형식으로 반환됨
    • 피처정보가 없으면 나중에 순서나 헷갈릴 수가 있음
    • 또 데이터 프레임으로 바꿔줘야 나중에 원핫인코딩 안 한거랑 합칠 수 있으므로
    • 바로 pd.DataFrame 형식으로 바꿔주기
  • 데이터 학습 검증 세트 만들기

    • Valid 데이터셋을 만드는 이유 → 케글에 제출하기 전 미리 검증확인해보기
    • 검증 방식
      1. hold-out cross validation
        • train set을 다시 임의의 비율로 train set과 test set으로 분할하여 사용한다.
        • 이 때 train : test = 9 : 1 또는 7 : 3 비율이 가장 자주 사용
        • Iteration(훈련 및 검증)을 한 번만 하기 때문에 계산 시간에 대한 부담이 적은 것이 가장 큰 장점이다.
      2. Cross Validation
        • 모델 학습 시 데이터를 train set와 validation set로 교차하여 선택하는 방법
        • test set을 하나로 고정하지 않고 데이터의 모든 부분을 모델 검증에 사용하여 과적합을 방지한다.
        • 모든 데이터셋을 학습과 검증에 활용할 수 있어 평가에 사용되는 데이터 편향을 방지한다.
        • 반복 학습 횟수가 증가하는 만큼 iteration이 돌기 때문에 모델 훈련 및 평가 시간이 증가한다
  • XGBoost

    • 부스팅 계열 모델 : 순차적으로 학습하며 오차를 보완해나가며 최적의 모델을 찾아감
    • lr parameter : https://xgboost.readthedocs.io/en/stable/parameter.html
      • objective [기본 = reg : squarederror] : 지도학습의 손실 최소화 함수를 정의
      • n_estimators = 학습할 epoch 수
      • max_depth [기본 : 6] : 트리의 최대 깊이
      • n_jobs = 병렬 스레드를 몇 개 만들 것인지
  • 배깅 vs 부스팅

    • 배깅(bagging : bootstrap aggregating) ⇒ 각 트리의 결과를 집계aggregating 해서 사용합니다.
    • 부스팅 ⇒ 순차적으로 트리를 개선해 나가기 때문에 마지막 트리가 잔차를 보완해서 만든 최종 모델이 되게 됩니다.
  • Earlystoppling : 성능이 나아지지 않으면 멈춘다.

    # fit
    es = xgb.callback.EarlyStopping(
        rounds=2,
        save_best=True,
        maximize=False,
        data_name="validation_0",
        metric_name="rmse",
    )
    
    model_xgb.fit(X_train, y_train, 
                  eval_set=[(X_valid, y_valid)], callbacks=[es])
    
    • 배깅 모델에선 필요가 없음 → 왜? : 이미 병렬적으로 나타내기때문
    • 매번 쓰는게 좋을까?
      • Earlystopping을 사용하게 되면 모든 데이터를 사용하여 훈련하지 못하고 조기에 종료되는 문제가 있어, 데이터의 양이 적을 때는 피하는 게 좋다고 합니다!
  • GOSS와 EFB

    • GOSS(Gradient based One Side Sampling) : 행을 줄이는 방법. 틀린 문제 위주로 샘플을 구성

    • 트리를 시각화하면 한쪽 방향으로 트리가 생성되는 것을 확인할 수 있음

    • EFB(Exclusive Feature Bundling) : 열을 줄이는 방법. 알고리즘 내부에서 서로 배타적인 특징을 갖는 피처를 합침

      → 행과 열을 줄여 학습 시간을 줄임

  • CatBoostRegressor

    • loss_function : 회귀 측정 공식
    • iterations : 트리를 몇번 만들지
    • lerning_rate : 보폭
    • grow_policy: 트리의 모양
      • SymmetricTree 대칭 트리 - 지정된 깊이에 도달할 때까지 트리가 레벨별로 만들어집니다
      • Depthwise 깊이별 - 지정된 깊이에 도달할 때까지 트리가 레벨별로 만들어집니다.
      • Lossguide 손실 가이드 - 지정된 최대 잎 수에 도달할 때까지 잎사귀 하나씩 나무가 만들어집니다.
  • stratify : split할 때 target 변수의 class를 동일하게 나눠줍니다!

  • 에러 노트

    CatBoostError: Model was fitted before hyperparameters tuning. You can't change hyperparameters of fitted model.

    → 모델이 이미 하이퍼파라미터 튜닝 없이 학습된 상태에서 다시 하이퍼파라미터를 변경하려고 시도하면 발생

  • 시각화 결과 : 학습을 하면 할수록 train과 test 점수가 점점 벌어지고 있는 부분을 확인할 수 있었습니다 !