스태킹 코드 - Step1

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)

스태킹 코드 - Step2

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)