独学でプログラミングを学んでみた

python初心者がテックブログを書いてみた

python初学者が競馬予測をしてみたpart2(モデルの作成編)

皆さんこんにちは、KHnodeです。
今回も「python初学者が競馬予測をしてみた」です。

前回の記事はこちら
kashiwapro.hatenablog.com
まだ見ていない方は見ていただけると幸いです。

それでは早速やっていこうと思います。

##################################################################

モデル作成

訓練用のデータとテスト用のデータを分割します。
これは、機械学習お馴染みの手法なので覚えておくといいと思います。

from sklearn.model_selection import train_test_split

X = df.drop(['フラグ', '日付'], axis=1)
y = df['フラグ']

X_train, X_test, y_train, y_test = train_test_split(X, y,
                                                    test_size=0.31,
                                                    random_state=0)

次にモデルの作成なのですが、今回はLightGBMのoptunaを利用して自動設定にしてみました。

from optuna.integration import lightgbm as lgb

lgb_train = lgb.Dataset(X_train, y_train)
lgb_eval = lgb.Dataset(X_test, y_test)

params = {
        'objective': 'binary',
        'metric': 'auc'
     }

best_opt = lgb.train(
        params, lgb_train, valid_sets=[lgb_train, lgb_eval],
        verbose_eval=False,
        num_boost_round=10,
        early_stopping_rounds=10,
    )

レーニングしたデータのパラメータと重要度を出力します。

    y_pred = best_opt.predict(X_test)
    df.drop(columns=['フラグ', '日付'], inplace=True)

    importance = pd.DataFrame(best_opt.feature_importance(),
                  index=df.columns, columns=['importance'])
    importance = importance.sort_values(by="importance", ascending=False)

    return best_opt.params, importance

モデル組み込み

次に、予想モデルに組み込みなのですが、先ほど出力したbest_opt.paramsをbest_paramsに入れます。
もちろん下のように

best_params = best_opt.params

こんな感じにして入れるのも一つの方法ですが、これをすると乱数の影響?によって重要度がコロコロ変わってしまい正確な予想ができないのでしていません。

import lightgbm as lgb

    best_params = {
        'objective': 'binary', 'metric': 'auc', 'feature_pre_filter': False, 'lambda_l1': 0.0009216345468743798,
        'lambda_l2': 5.971595511972418e-08, 'num_leaves': 80, 'feature_fraction': 0.5, 'bagging_fraction': 1.0,
        'bagging_freq': 0, 'min_child_samples': 20
    }
    model = lgb.train(
        best_params,
        lgb_train,
        valid_sets=lgb_eval,
        num_boost_round=100,
        early_stopping_rounds=10
    )

とりあえずモデルの組み込みができたので、スコアを見ていくと、
大体68%なのですが、無茶苦茶低いです。

理由なのですが、オッズや人気といった素人が見ても重要だとわかる変数を入れていないという事が挙げられます。
入れてもいいとは思いますが、入れてしまうとかなりオッズや人気によってしまい1番人気にしか予想しなくなるからです。

とは言っても68%はかなり低いので対策を考えていく必要があると思います。

次は、実際にどういう感じで予想していくのかについて書いていこうと思います。