前回ラベル貼ったので、これを必要なデータのみをX、予測したいデータをYへ入れていきます。


Yは、当然、レースタイムですが、ここでは過去のレースタイムです。


pred_data.csvを読み込んだpred_dataの中身はこう↓


欲しいデータは青文字、計算に利用するカラムは赤文字にしてます。


これに合わせるとこう↓

#学習準備
x_cols = ["r_meter"] + df_temp_oka.columns.tolist()[9:]

X = df_temp_oka[x_cols]
y = df_temp_oka["r_time"]


で、次に色々と使う宣言と訓練データとテストデータの準備を書きます。


# ラベル付きデータをトレーニングセット (X_train, y_train)とテストセット (X_test,y_test)に分割
from sklearn import model_selection

X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=0.1, random_state=0)


# 正規化-標準化している
from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
scaler.fit(X_train)

X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)

そのまま利用です。どこも変えてません。


次は人工知能のモデルを書きます。

# Keras読込
from tensorflow.python.keras.models import Sequential
from tensorflow.python.keras.layers import Dense
from tensorflow.python.keras.wrappers.scikit_learn import KerasRegressor

# モデル生成用関数
def reg_model():

reg = Sequential()

reg.add(Dense(10, input_dim=len(x_cols), activation='relu'))
reg.add(Dense(16, activation='relu'))
reg.add(Dense(1))


reg.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])
reg.summary()

return reg

ここもそのまま、後で修正します。



学習を実行し精度を確認するコードを書く。


# モデルの取得
model = KerasRegressor(build_fn=reg_model, epochs=5000, batch_size=16, verbose=0)

# 学習
model.fit(X_train, y_train)

# スコア(参考値)
model.score(X_test, y_test)


from sklearn.metrics import mean_squared_error

# 予測値の取得
y_pred = model.predict(X_test)

# 二乗平方根で誤差を算出
mse = mean_squared_error(y_test, y_pred)
print("KERAS REG RMSE : %.2f" % (mse ** 0.5))
print("KERAS REG SCORE: %3.2f" % (1.0 - mse ** 0.5 / y_test.mean()))

一旦ここで実行すると

KERAS REG RMSE : 12.60
KERAS REG SCORE: 0.90

偏差が12.6で、90%の精度ですね。ちょっと低い気がします。


モデルをいじります。

reg.add(Dense(31, input_dim=len(x_cols), activation='relu'))
reg.add(Dense(16, activation='relu'))
reg.add(Dense(1))

10を31に増やしてみます。この増減とかは、よく分かっていないんで、勘でしてます。

31にした理由は、x_colsが31だからです。


で計算結果は
KERAS REG RMSE : 47.34
KERAS REG SCORE: 0.62

偏差が47.34。精度が62%。悪化してますね(笑)


じゃ、こうしてみます。

reg.add(Dense(31, input_dim=len(x_cols), activation='relu'))
reg.add(Dense(62, activation='relu'))
reg.add(Dense(1))


結果
KERAS REG RMSE : 48.60
KERAS REG SCORE: 0.61

改善されず。


中間層を増やしてみよう。

reg.add(Dense(31, input_dim=len(x_cols), activation='relu'))
reg.add(Dense(62, activation='relu'))
reg.add(Dense(24, activation='relu'))
reg.add(Dense(1))


結果
KERAS REG RMSE : 42.73
KERAS REG SCORE: 0.66

・・・なんかビミョ~な改善だ。


計算式を変えてみます。

reg.add(Dense(31, input_dim=len(x_cols), activation='relu'))
reg.add(Dense(62, activation='softmax'))
reg.add(Dense(24, activation='relu'))
reg.add(Dense(1))


さぁ、いかに!?

KERAS REG RMSE : 20.08
KERAS REG SCORE: 0.84


偏差20.08、精度84%。



改善してきた。


そして試行錯誤した結果、最終的には、これになった↓

reg.add(Dense(31, input_dim=len(x_cols), activation='relu'))
reg.add(Dense(62, activation='softmax'))
reg.add(Dense(128, activation='linear'))
reg.add(Dense(1))

で、スコアは

KERAS REG RMSE : 5.18
KERAS REG SCORE: 0.96

偏差5.18、精度96%だそうです。




一旦、モデルをこれにして、次回予測に。