見出し画像

Pythonでナンバーズ3予想(ランダムフォレスト編)

ランダムフォレストを使ってナンバーズ3の回帰と予想をしてみます。
(予想方法は一番下)

ランダムフォレストによるナンバーズ3の回帰

#以下のコードすべてをGoogle Colaboratoryに貼り付けてください。


import pandas as pd
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split

# データを取得する
df = pd.read_csv("/content/drive/MyDrive/numbers3_result.csv")

# ラベルを変える
df.columns = ['round', '100digit', '10digit', '1digit']

# 訓練データを過去データを作る
target_columns = []
 
for i in range(1,10): # 過去1~9回前のデータを作成する 過去の回数を変えたい場合は 10の部分を変えてください
  tmp = df[['100digit','10digit','1digit']].shift(-i)
  tmp_columns = ['before' + str(i) +'-100','before' + str(i) +'-10','before' + str(i) + '-1']
  tmp.columns = tmp_columns
  df = pd.concat([df,tmp],axis=1)
  target_columns += tmp_columns #説明変数用 

# ランダムフォレストではnullがあるとダメなのでnull削除
df.dropna(inplace=True)

# 説明変数と目的変数に分ける
X = df[target_columns].values  # 説明変数
y = df[['100digit','10digit','1digit']].values     # 目的変数

# データ分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.7, random_state=2)

# ランダムフォレスト回帰
forest = RandomForestRegressor(n_estimators=100,
                            criterion='friedman_mse', 
                            max_depth=None, 
                            min_samples_split=5, 
                            min_samples_leaf=5, 
                            min_weight_fraction_leaf=0.0, 
                            max_features='auto', 
                            max_leaf_nodes=None, 
                            min_impurity_decrease=0.0, 
                            bootstrap=True, 
                            oob_score=False, 
                            n_jobs=None, 
                            random_state=None, 
                            verbose=0, 
                            warm_start=False, 
                            ccp_alpha=0.0, 
                            max_samples=None
                          )
# モデル学習
forest.fit(X_train, y_train)

# 推論
y_train_pred = forest.predict(X_train)
y_test_pred  = forest.predict(X_test)

from sklearn.metrics import r2_score            # 決定係数
from sklearn.metrics import mean_squared_error  # RMSE

# 予測値(Train)
y_train_pred = forest.predict(X_train)

# 予測値(Test)
y_test_pred = forest.predict(X_test)

# 平均平方二乗誤差(RMSE)
print('RMSE 学習: %.2f, テスト: %.2f' % (
        mean_squared_error(y_train, y_train_pred, squared=False), # 学習
        mean_squared_error(y_test, y_test_pred, squared=False)    # テスト
    ))

# 決定係数(R^2)
print('R^2 学習: %.2f, テスト: %.2f' % (
        r2_score(y_train, y_train_pred), # 学習
        r2_score(y_test, y_test_pred)    # テスト
    ))

回帰の結果

計算した結果、こうなりました。

RMSE 学習: 2.38, テスト: 2.89 R^2 学習: 0.33, テスト: -0.01

R^2の数値が0.33 ということで、このモデルでは予想は難しそうです。(基本的には0.7以上が好ましいのでデータを変えるか、予想方法を変える必要がありますね。例としては以下が考えられます。

  • 予想に使用するデータを増やす

    • 過去10回のデータでなく過去100回にする

    • 曜日や日付も予想のデータに使用する

  • ランダムフォレスト以外の回帰方法にする



ランダムフォレストによるナンバーズ3の予想

予想になるほどの精度は無いと思いますが、予想したい場合は上記のサンプルコードの一番下に以下のコードを追加してください。

# forest.predict({直近の数字}}
forest.predict([
   1,2,1, # 直近の数字
   2,2,2, # 2回前の数字
  # あとは必要に応じて数字を追加してください
)


この記事が気に入ったらサポートをしてみませんか?