부스팅: 여러 개의 약한 학습기를 순차적으로 학습, 예측하면서 잘못 예측한 데이터에 가중치 부여를 통해 오류를 개선해 나가면서 학습하는 방식
Step 1: 분류 기준 1로 +/- 구분. 동그라미는 잘못 분류된 데이터.
Step 2: 동그라미에 가중치 부여
Step 3: 분류 기준 2로 +/- 구분. 동그라미 잘못 분류된 데이터.
Step 4: 동그라미에 더 큰 가중치 부여
Step 5: 분류 기준 3으로 +/- 구분.
Final: 분류 기준 1, 2, 3을 결합한 예측 결과
: 가중치 업데이트를 경사 하강법을 이용
from sklearn.model_selection import GridSearchCV
params = {
'n_estimators':[100, 500],
'learning_rate' : [ 0.05, 0.1]
}
grid_cv = GridSearchCV(gb_clf , param_grid=params , cv=2 ,verbose=1)
grid_cv.fit(X_train , y_train)
일반 파라미터: 일반적으로 실행 시 스레드 개수, silent 모드 등의 선택을 위한 파라미터(거의 디폴트값 그대로 사용)
부스터 파라미터: 트리 최적화, 부스팅, regularization 등
학습 태스크 파라미터: 학습 수행 시의 객체 함수, 평가를 위한 지표 등을 설정하는 파라미터
@
: num_leaves의 개수를 중심으로 min_child_samples(min_data_in_leaf), max_depth를 함께 조정하면서 모델의 복잡도를 줄이는 것이 기본
@
@
@
: 개별 알고리즘의 예측 결과 데이터 세트를 최종적인 메타 데이터 세트로 만들어 별도의 머신러닝 알고리즘으로 최종 학습을 수행하고 테스트 데이터를 기반으로 다시 최종 예측을 수행하는 방식
** 메타모델: 개별 모델의 예측된 데이터 세트를 다시 기반으로 하여 학습, 예측하는 방식
개별적인 기반 모델 + 개별 기반 모델의 예측 데이터를 학습 데이터로 만들어서 학습하는 최종 메타 모델
M개의 로우, N개의 피처, 3개의 ML 알고리즘 모델
: 각각 M개의 로우를 가진 1개의 레이블 값을 도출 -> 다시 합해서(스태킹) 새로운 데이터 세트 -> 최종 모델 적용 -> 최종 예측
# 개별 ML 모델을 위한 Classifier 생성
knn_clf = KNeighborsClassifier(n_neighbors=4)
rf_clf = RandomForestClassifier(n_estimators=100, random_state=0)
dt_clf = DecisionTreeClassifier()
ada_clf = AdaBoostClassifier(n_estimators=100)
# 최종 스태킹 모델을 위한 Classifier생성
lr_final = LogisticRegression(C=10)
# 개별 모델 학습
knn_clf.fit(X_train, y_train)
rf_clf.fit(X_train , y_train)
dt_clf.fit(X_train , y_train)
ada_clf.fit(X_train, y_train)
# 개별 데이터 예측
knn_pred = knn_clf.predict(X_test)
rf_pred = rf_clf.predict(X_test)
dt_pred = dt_clf.predict(X_test)
ada_pred = ada_clf.predict(X_test)
# 예측 데이터 병합
pred = np.array([knn_pred, rf_pred, dt_pred, ada_pred])
pred = np.transpose(pred)
# 최종 모델 학습 및 예측
lr_final.fit(pred, y_test)
final = lr_final.predict(pred)
=>3번째 반복에서 개별 모델의 예측값으로 학습 데이터와 테스트 데이터를 생성
1. Step 1에서 생성한 학습/테스트 데이터를 모두 합쳐서 최종적으로 메타 모델이 사용할 학습/테스트 데이터 생성
2. 메타 모델 학습
3. 최종 테스트 데이터로 예측
4. 최종 예측 결과를 원본 테스트 데이터의 레이블과 비교, 평가
from sklearn.model_selection import KFold
from sklearn.metrics import mean_absolute_error
################### Step 1 ###################
# 개별 기반 모델에서 최종 메타 모델이 사용할 학습/테스트 데이터를 생성하는 함수
def get_stacking_base_datasets(model, X_train_n, y_train_n, X_test_n, n_folds):
# 지정된 n_folds값으로 KFold 생성.
kf = KFold(n_splits=n_folds, shuffle=False, random_state=0)
# 추후에 메타 모델이 사용할 학습 데이터 반환을 위한 넘파이 배열 초기화
train_fold_pred = np.zeros((X_train_n.shape[0], 1))
test_pred = np.zeros((X_test_n.shape[0],n_folds))
print(model.__class__.__name__ , 'model 시작')
for folder_counter , (train_index, valid_index) in enumerate(kf.split(X_train_n)):
# 입력된 학습 데이터에서 기반 모델이 학습/예측할 폴드 데이터 셋 추출
print('\t 폴드 세트: ',folder_counter,' 시작 ')
X_tr = X_train_n[train_index]
y_tr = y_train_n[train_index]
X_te = X_train_n[valid_index]
# 폴드 세트 내부에서 다시 만들어진 학습 데이터로 기반 모델의 학습 수행
model.fit(X_tr , y_tr)
# 폴드 세트 내부에서 다시 만들어진 검증 데이터로 기반 모델 예측 후 데이터 저장
train_fold_pred[valid_index, :] = model.predict(X_te).reshape(-1,1)
# 입력된 원본 테스트 데이터를 폴드 세트내 학습된 기반 모델에서 예측 후 데이터 저장.
test_pred[:, folder_counter] = model.predict(X_test_n)
# 폴드 세트 내에서 원본 테스트 데이터를 예측한 데이터를 평균하여 테스트 데이터로 생성
test_pred_mean = np.mean(test_pred, axis=1).reshape(-1,1)
# train_fold_pred는 최종 메타 모델이 사용하는 학습 데이터, test_pred_mean은 테스트 데이터
return train_fold_pred , test_pred_mean
# 각각 메타 모델이 추후에 사용할 학습/테스트용 데이터 세트 반환
knn_train, knn_test = get_stacking_base_datasets(knn_clf, X_train, y_train, X_test, 7)
rf_train, rf_test = get_stacking_base_datasets(rf_clf, X_train, y_train, X_test, 7)
dt_train, dt_test = get_stacking_base_datasets(dt_clf, X_train, y_train, X_test, 7)
ada_train, ada_test = get_stacking_base_datasets(ada_clf, X_train, y_train, X_test, 7)
################### Step 2 ###################
# 반환된 각 모델별 학습/테스트용 데이터 병합
# 메타 모델이 학습할 학습용 피처 데이터 세트
Stack_final_X_train = np.concatenate((knn_train, rf_train, dt_train, ada_train), axis=1)
# 메타 모델이 예측할 테스트용 피처 데이터 세트
Stack_final_X_test = np.concatenate((knn_test, rf_test, dt_test, ada_test), axis=1)
# 최종 메타 모델을 스태킹된 학습용 피처 데이터 세트와 원본 학습 레이블 데이터로 학습
lr_final.fit(Stack_final_X_train, y_train)
# 스태킹된 테스트 데이터 세트로 예측
stack_final = lr_final.predict(Stack_final_X_test)
print('최종 메타 모델의 예측 정확도: {0:.4f}'.format(accuracy_score(y_test, stack_final)))
# 정확도: 0.9737
** 스태킹을 이루는 모델은 최적으로 파라미터를 튜닝한 상태에서 스태킹 모델을 만드는 것이 일반적