[회귀-예측]Prediction of Wild Blueberry Yield-06-베이지안 및 KFOLD활용(부스팅모델_CatBoost)돌려보기(내가 한것중 제일 best!)
1. 부스팅 모델_CatBoost 사용하기
from sklearn.model_selection import train_test_split
#
num_train = len(train) # 훈련 데이터 개수
# 훈련 데이터와 테스트 데이터 나누기
X_train= all_data[:num_train] # 0~num_train -1 행
X_test = all_data[num_train:] # num_train ~ 마지막 행
y_train = train['yield'].values
y_test = submission['yield'].values
==> 데이터 나누기
from scipy import sparse
from sklearn.model_selection import train_test_split
from catboost import CatBoostRegressor, Pool
import catboost as cat
num_train = len(train) # 훈련 데이터 개수
# 훈련 데이터와 테스트 데이터 나누기
all_data_sprs = sparse.csr_matrix(all_data)
X= all_data_sprs[:num_train] # 0~num_train -1 행
X_test = all_data_sprs[num_train:] # num_train ~ 마지막 행
y = train['yield'].values
# 8:2 비율로 훈련 데이터, 검증 데이터 분리(베이지안 최적화 수행용)
X_train , X_valid , y_train , y_valid = train_test_split(X,y, test_size=0.2 , random_state=0)
# 베이지안 최적화용 데이터셋
bayes_dtrain = Pool(X_train, y_train)
bayes_dvalid = Pool(X_valid, y_valid)
Catboost 모듈의 Pool의 의미 :
1. Pool은 CatBoost 모델의 학습에 사용될 데이터를 저장하고 처리하기 위한 구조를 제공
2. 데이터를 메모리에 로드하고 필요한 전처리 작업을 수행합니다.
3. CatBoost의 Pool 클래스는 연속형 피처와 범주형 피처를 자동으로 처리
4. CatBoost의 효율적인 학습을 위해 데이터를 압축하여 저장합니다. 이는 학습 속도를 향상시키고 메모리 사용량을 줄인다.
5. Pool 객체를 생성할 때, 피처들을 포함하는 데이터프레임을 전달합니다. CatBoost는 자동으로 데이터프레임의 각 열을 분석하여 해당 열이 범주형인지, 연속형인지를 판단합니다.
6. 만약 피처가 연속형이라고 판단되면, CatBoost는 해당 피처를 그대로 사용하여 모델에 적용합니다. 이 경우 추가적인 처리가 필요하지 않습니다.
7. 하지만 피처가 범주형으로 판단되면, CatBoost는 내부적으로 해당 피처를 원-핫 인코딩(One-Hot Encoding)하여 처리합니다. 이를 통해 범주형 변수의 정보를 적절하게 반영하면서도 모델 학습에 적합한 형태로 변환합니다.
%%time
from bayes_opt import BayesianOptimization
param_bounds = {
'depth': (5, 8),
'learning_rate': (0.01, 0.5),
'l2_leaf_reg': (0.1, 0.2),
'colsample_bylevel': (0.6, 0.9),
'bagging_temperature': (0.6, 0.9),
'min_data_in_leaf': (8, 10),
'subsample': (0.8, 1.0),
}
fixed_params = {
'loss_function': 'MAE',
'random_state': 1991
}
def eval_function(depth, learning_rate, l2_leaf_reg, colsample_bylevel, bagging_temperature, min_data_in_leaf, subsample):
params = {
'depth': int(round(depth)),
'learning_rate': learning_rate,
'l2_leaf_reg': l2_leaf_reg,
'colsample_bylevel': colsample_bylevel,
'bagging_temperature': bagging_temperature,
'min_data_in_leaf': int(round(min_data_in_leaf)),
'subsample': subsample,
}
params.update(fixed_params)
print('하이퍼파라미터:', params)
catboost_model = CatBoostRegressor(**params)
catboost_model.fit(
X_train,
y_train,
eval_set=(X_valid, y_valid),
use_best_model=True,
early_stopping_rounds=300,
verbose=False,
)
preds = catboost_model.predict(X_valid)
mae = mean_absolute_error(y_valid, preds)
print(f'MAE: {mae}\n')
return -mae
optimizer = BayesianOptimization(f=eval_function, pbounds=param_bounds, random_state=0)
optimizer.maximize(init_points=3, n_iter=6)
==> 베이지안 최적화 수행을 위한 평가지표함수 생성 및 파라미터 범위 지정
==> 자세한 하이퍼파라미터 값은 추후에 알아보자
# 평가함수 점수가 최대일 대 하이퍼파라미터
max_params = optimizer.max['params']
max_params['depth'] = int(round(max_params['depth']))
max_params.update(fixed_params)
max_params
{'bagging_temperature': 0.6526727638049514,
'colsample_bylevel': 0.8764244601998259,
'depth': 7,
'l2_leaf_reg': 0.11584463817095934,
'learning_rate': 0.06353378043935552,
'min_data_in_leaf': 9.653074383059609,
'subsample': 0.9776458428608505,
'loss_function': 'MAE',
'random_state': 1991}
from sklearn.model_selection import KFold
import catboost as cat
import numpy as np
# K-Fold 교차 검증 수행을 위한 K 값 설정
n_splits = 5
folds = KFold(n_splits=n_splits, shuffle=True, random_state=1991)
# OOF 방식으로 훈련된 모델로 검증 데이터 타깃값을 예측한 확률을 담을 1차원 배열
oof_val_preds = np.zeros(X.shape[0])
# OOF 방식으로 훈련된 모델로 테스트 데이터 타깃값을 예측한 확률을 담을 1차원 배열
oof_test_preds = np.zeros(X_test.shape[0])
# K-Fold 교차 검증 수행
for fold_idx, (train_idx, valid_idx) in enumerate(folds.split(X)):
print('#' *40, f'폴드 {fold_idx+1} / 폴드 {folds.n_splits}' , '#'*40)
X_train, y_train = X[train_idx], y[train_idx] # 훈련용 데이터
X_valid, y_valid = X[valid_idx], y[valid_idx] # 검증용 데이터
# CatBoost 모델 생성
cat_model = cat.CatBoostRegressor(**max_params)
# CatBoost 모델 훈련
cat_model.fit(X_train, y_train, eval_set=(X_valid, y_valid), early_stopping_rounds=300, verbose_eval=100)
# 검증 데이터 예측
oof_val_preds[valid_idx] = cat_model.predict(X_valid)
# 테스트 데이터 예측
oof_test_preds += cat_model.predict(X_test) / n_splits
print(f"Fold {fold_idx+1} MAE: {mean_absolute_error(y_valid, oof_val_preds[valid_idx])}")
# 평가 결과 출력
print(f"Overall MAE: {mean_absolute_error(y, oof_val_preds)}")
==> KFOLD 활용한 교차검증을 통한 최적의 모델링 결과값 찾아보기!
y_preds = oof_test_preds
y_preds
from sklearn.model_selection import train_test_split
num_train = len(train) # 훈련 데이터 개수
# 훈련 데이터와 테스트 데이터 나누기
X= all_data[:num_train] # 0~num_train -1 행
X_test = all_data[num_train:] # num_train ~ 마지막 행
y = train['yield'].values
X_train , X_valid , y_train, y_valid = train_test_split(X,y, test_size = 0.2, random_state=0)
from sklearn.metrics import mean_absolute_error
from catboost import Pool
dvalid = Pool(X_valid, y_valid)
y_pred = cat_model.predict(dvalid)
# MAE 계산
mae = mean_absolute_error(y_valid, y_pred)
print("MAE:", mae)
MAE: 310.60456159836434
==> 335.59589
==> 588/1875 등
==> 제일 best!!!!
2. XGBoost와 CatBoost와의 차이
XGBoost와 CatBoost는 모두 부스팅 알고리즘 중 하나로, 그래디언트 부스팅 트리를 기반으로 합니다. 이들은 일반적으로 앙상블 학습 방법 중 가장 강력한 모델로 알려져 있으며, 다양한 기계 학습 작업에서 뛰어난 예측 성능을 제공합니다. 그러나 XGBoost와 CatBoost 사이에는 몇 가지 차이점이 있습니다.
1. 학습 속도: XGBoost는 다양한 최적화 기술을 사용하여 학습 속도를 향상시키는 데 중점을 두었습니다. 대용량 데이터셋이나 고차원 데이터셋에서도 빠른 학습이 가능합니다. 반면에 CatBoost는 범주형 변수를 자동으로 처리하는 등 추가적인 기능을 제공하여 데이터 전처리 과정을 간소화하는 데 주안점을 두었습니다.
2. 범주형 변수 처리: XGBoost는 범주형 변수를 처리하기 위해 원-핫 인코딩과 같은 전처리 과정이 필요합니다. 반면에 CatBoost는 범주형 변수를 자동으로 처리하고, 특성 스케일링이나 매니폴드 정규화의 필요성을 줄여줍니다.
3. 과적합 방지: XGBoost는 피처 중요도 계산 및 조기 종료 등 다양한 기능을 통해 과적합을 방지합니다. CatBoost도 피처 중요도 계산 및 과적합 방지 기능을 제공하지만, 범주형 변수의 자동 처리 및 직접적인 특성 스케일링이나 매니폴드 정규화의 필요성을 줄이는 등의 추가적인 기능을 가지고 있습니다.
4. 하이퍼파라미터 튜닝: XGBoost는 하이퍼파라미터 튜닝에 대한 자유도가 높고, 다양한 하이퍼파라미터 설정을 통해 모델 성능을 조정할 수 있습니다. CatBoost는 일부 하이퍼파라미터에 대한 범위가 제한되어 있고, 자동 튜닝 기능을 제공하여 사용자가 최적의 하이퍼파라미터를 찾는 데 도움을 줍니다.