![見出し画像](https://assets.st-note.com/production/uploads/images/100671034/rectangle_large_type_2_a40e70862c1f1d79d0c5b3b0e946c0eb.png?width=1200)
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回前の数字
# あとは必要に応じて数字を追加してください
)