from sklearn.model_selection import KFold
# 개별 기반 모델에서 최종 메타 모델이 사용할 학습 및 테스트용 데이터를 생성하기 위한 함수
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 = True, 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))
for folder_counter, (train_index, valid_index) in enumerate(kf.split(X_train_n)):
# 입력된 학습 데이터에서 기반 모델이 학습/예측할 폴드 데이터셋 추출
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
xg_train, xg_test = get_stacking_base_datasets(xgb, X_train, y_train, X_test, 5)
lgb_train, lgb_test = get_stacking_base_datasets(lgb, X_train, y_train, X_test, 5)
rf_train, rf_test = get_stacking_base_datasets(rf, X_train, y_train, X_test, 5)
Stack_final_X_train = np.concatenate((xg_train, lgb_train, rf_train), axis = 1)
Stack_final_X_test = np.concatenate((xg_test, lgb_test,rf_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)))
score 함수
def gini_stability(base, w_fallingrate=88.0, w_resstd=-0.5):
gini_in_time = base.loc[:, ["WEEK_NUM", "target", "score"]]\\
.sort_values("WEEK_NUM")\\
.groupby("WEEK_NUM")[["target", "score"]]\\
.apply(lambda x: 2*roc_auc_score(x["target"], x["score"])-1).tolist()
x = np.arange(len(gini_in_time))
y = gini_in_time
a, b = np.polyfit(x, y, 1)
y_hat = a*x + b
residuals = y - y_hat
res_std = np.std(residuals)
avg_gini = np.mean(gini_in_time)
return avg_gini + w_fallingrate * min(0, a) + w_resstd * res_std
stability_score_train = gini_stability(base_train)
stability_score_valid = gini_stability(base_valid)
stability_score_test = gini_stability(base_test)