-
benz 데이터셋으로 하고자 하는 목적
- 수백 수천개의 피처를 다루는 방법 → 기술통계, 유일 값 빈도수, 왜도, 첨도, 평균, 편차 등
- 피처가 너무 많을 때 기술통계 어느 한쪽에 너무 치우쳐진 값이나 대부분 같은 값으로 되어있는 데이터 찾기
- 다 같은 값으로 되어있는 데이터 찾기
- 계산량을 줄이기 위해 의미없는 데이터를 제거해 주었습니다.
- 원핫인코딩을 할 때 범주형 변수에 대해 인코딩을 하고 기존 데이터와 합치는 방법 * 피처중요도를 구할 때 판다스의 데이터프레임으로 되어있으면 어떤 피처에 대한 중요도인지 확인하기가 수월합니다.
- Tree 계열 알고리즘 중에 사이킷런 외에 있는 라이브러리의 알고리즘 익혀보는 목적
- Hold-out-Validation 방법 : 모델이나 데이터가 클 때 빠르게 확인해 보기 위한 장점 때문에 사용합니다. 교차검증(CrossValidation)에 비해서는 신뢰가 떨어질 수있다는 단점도 있습니다.
- XGBoost
- LightGBM
- CatBoost
-
데이터의 수가 매우 많을 경우의 피쳐엔지니어링 방법
→ 기술통계의 기술통계들을 구해보거나 , 왜도 첨도를 구해서 데이터의 특성을 파악할 수 있습니다.
- 인사이트
- 0이나 1로 되어있으며, 대부분 0으로 채워진 데이터가 있음을 확인해볼 수 있었습니다 !
- 최댓값이 1인 것을 보니, 스케일링이 이미 되어있었다는 것을 확인해볼 수 있었습니다 !
⇒ 따라서
- 2진 변수로 이루어져 있지만 그 중에 대부분이 같은 값으로 구성되어 있는 데이터 & 한쪽 값으로 매우 쏠린 데이터의 경우?
- 모델이 해당 데이터를 제대로 학습하기 어렵기 때문에 변수로 사용할지 고민해봐야할 필요가 있습니다.
- 모두 같은 값이거나 대부분 같은 값으로 되어 있는 변수를 제거하였습니다.
- 왜도 값을 기준으로 절댓값을 씌워 특정 값 이상인 데이터를 찾아볼 수 있습니다.
-
category type으로 데이터를 변경하기
- 문자열처럼 보이고 작동하지만 내부적으로는 정수의 배열로 표현됩니다.
- 이를 통해 데이터를 사용자 지정 순서로 정렬하고 데이터를 보다 효율적으로 저장할 수 있습니다.
- 일부 모델에서는 범주형 피처를 인코딩 없이 사용할 수도 있습니다.
⇒ object type 변수들을 category type으로 바꿔줍니다.
-
One-Hot-Encoding
- sklearn의 원핫인코딩을 하면 numpy array 형식으로 반환됨
- 피처정보가 없으면 나중에 순서나 헷갈릴 수가 있음
- 또 데이터 프레임으로 바꿔줘야 나중에 원핫인코딩 안 한거랑 합칠 수 있으므로
- 바로 pd.DataFrame 형식으로 바꿔주기
-
데이터 학습 검증 세트 만들기
- Valid 데이터셋을 만드는 이유 → 케글에 제출하기 전 미리 검증확인해보기
- 검증 방식
- hold-out cross validation
- train set을 다시 임의의 비율로 train set과 test set으로 분할하여 사용한다.
- 이 때 train : test = 9 : 1 또는 7 : 3 비율이 가장 자주 사용
- Iteration(훈련 및 검증)을 한 번만 하기 때문에 계산 시간에 대한 부담이 적은 것이 가장 큰 장점이다.
- Cross Validation
- 모델 학습 시 데이터를 train set와 validation set로 교차하여 선택하는 방법
- test set을 하나로 고정하지 않고 데이터의 모든 부분을 모델 검증에 사용하여 과적합을 방지한다.
- 모든 데이터셋을 학습과 검증에 활용할 수 있어 평가에 사용되는 데이터 편향을 방지한다.
- 반복 학습 횟수가 증가하는 만큼 iteration이 돌기 때문에 모델 훈련 및 평가 시간이 증가한다
-
XGBoost
-
배깅 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 점수가 점점 벌어지고 있는 부분을 확인할 수 있었습니다 !