AI競馬で回収率100%越えを目指して

はなむけ競馬場

python プログラム

[4日目] How I made top 0.3% on a Kaggle competition 写経

投稿日:

How I made top 0.3% on a Kaggle competitionを写経する3日目。

前回はコチラ

 

評価の準備

KFoldを作って、cross_val_scoreのcvに渡す。


#Kfold - cross valication
kf = KFold(n_splits=12,random_state=42,shuffle=True)

def rmsle(y, y_pred):
    return np.sqrt(mean_squared_error(y, y_pred))

def cv_rmse(model, X=X):
    rmse = np.sqrt(-cross_val_score(model, X, train_labels, scoring="neg_mean_squared_error", cv=kf))
    return (rmse)

rmsleで学習時の評価を行う。
cv_rmseでcross validationをする。

 

モデル構築


#lightgbm
lightgbm = LGBMRegressor(objective="regression",
                       num_leaves=6,
                       learning_rate=0.01,
                       n_estimators=7000,
                       max_bin=200,
                       bagging_fraction=0.8,
                       bagging_freq=4,
                       bagging_seed=8,
                       feature_fraction=0.2,
                       feature_fraction_seed=8,
                       min_sum_hessian_in_leaf=11,
                       verbose=-1,
                       random_state=42)

#XGBoost
xgboost = XGBRegressor(learning_rate=0.01,
                      n_estimators=6000,
                      max_depth=4,
                      min_child_weight=0,
                      gamma=0.6,
                      subsample=0.7,
                      colsample_bytree=0.7,
                      objective="reg:linear",
                      nthread=-1,
                      slace_pos_weight=1,
                      seed=27,
                      reg_alpha=0.00006,
                      random_state=42)

# Ridge Regressor
ridge_alphas = [1e-15, 1e-10, 1e-8, 9e-4, 7e-4, 5e-4, 3e-4, 1e-4, 1e-3, 5e-2, 1e-2, 0.1, 0.3, 1, 3, 5, 10, 15, 18, 20, 30, 50, 75, 100]
ridge = make_pipeline(RobustScaler(), RidgeCV(alphas=ridge_alphas, cv=kf))

# Support Vector Regressor
svr = make_pipeline(RobustScaler(), SVR(C= 20, epsilon= 0.008, gamma=0.0003))

#Gradient boosting regressor
gbr = GradientBoostingRegressor(n_estimators=6000,
                               learning_rate=0.01,
                               max_depth=4,
                               max_features="sqrt",
                               min_samples_leaf=15,
                               min_samples_split=10,
                               loss="huber",
                               random_state=42)

#random forest
rf = RandomForestRegressor(n_estimators=1200,
                          max_depth=15,
                          min_samples_split=5,
                          min_samples_leaf=5,
                          max_features=None,
                          oob_score=True,
                          random_state=42)

#stack
stack_gen = StackingCVRegressor(regressors=(xgboost,lightgbm,svr,ridge,gbr,rf),
                               meta_regressor=xgboost,
                               use_features_in_secondary=True)

 

交差検定をする

交差検定を行って、学習時の評価を保存する。

本来だとこの時にパラメータチューニングを行うと思うが、最初から決まっているので、要所は省略。

 


scores = {}

score = cv_rmse(lightgbm)
print("lightgbm: {:.4f} ({:.4f})".format(score.mean(), score.std()))
scores['lgb'] = (score.mean(), score.std())

この他複数個のモデルでも同様に計算する。

StackingCVRegressorには最初から交差検定が組み込まれているので、cv_rmseは行わない。

 

モデルをブレンドして、頑健性を高める

スタッキングモデルが一番制度が高いけど、結局さらに複数個を掛け合わせたほうが良いことが多い。

予測値の何割かを足し算することで、ブレンドしたことになる。

 


def blended_predictions(X):
    return ((0.1 * ridge_model_full_data.predict(X)) + \
            (0.2 * svr_model_full_data.predict(X)) + \
            (0.1 * gbr_model_full_data.predict(X)) + \
            (0.1 * xgb_model_full_data.predict(X)) + \
            (0.1 * lgb_model_full_data.predict(X)) + \
            (0.05 * rf_model_full_data.predict(X)) + \
            (0.35 * stack_gen_model.predict(np.array(X))))

print('stack_gen')
#データはnumpy形式でないとダメ 
stack_gen_model = stack_gen.fit(np.array(X), np.array(train_labels))

print('lightgbm')
lgb_model_full_data = lightgbm.fit(X, train_labels)

print('xgboost')
xgb_model_full_data = xgboost.fit(X, train_labels)

print('Svr')
svr_model_full_data = svr.fit(X, train_labels)

print('Ridge')
ridge_model_full_data = ridge.fit(X, train_labels)

print('RandomForest')
rf_model_full_data = rf.fit(X, train_labels)

print('GradientBoosting')
gbr_model_full_data = gbr.fit(X, train_labels)

blended_score = rmsle(train_labels,blended_predictions(X))

このノートブックをそのまま使うことで、競馬の予想にも使えそう。

-python, プログラム

Copyright© はなむけ競馬場 , 2021 All Rights Reserved Powered by AFFINGER5.