前回、モデルを一旦決めました。


いよいよ予測ですね。



# 可視化
pd.DataFrame({"pred":y_pred, "act":y_test})[:100].reset_index(drop=True).plot(figsize=(15,4))


df_pred = pd.read_csv("pred_data.csv",encoding="UTF-8")
df_pred["r_date"] = pd.to_datetime(df_pred['r_date'])
df_pred["r_time"] = 0

df_pred["YEAR"] = df_pred.r_date.map(lambda _: _.year)
df_pred["MONTH"] = df_pred.r_date.map(lambda _: _.month)


cols = ["umaID","raceID","kishuID","r_place","r_shibada","YEAR","MONTH"]
for col in cols:
    df_pred = df_pred.join(pd.get_dummies(df_pred[col], prefix=col))


# テストデータの不足分を補完
for col in x_cols[2:]:
if not col in df_pred.columns:
df_pred[col] = 0

# 予測用データ
X = df_pred[x_cols].as_matrix().astype('float64')
y = df_pred["r_time"].as_matrix().astype('int').flatten()

# 正規化
X = scaler.transform(X)


こんな感じですね。df_predに予測のデータを入れてます。で、レースタイムが無いので、
df_pred["r_time"] = 0

こんな感じで、r_timeのカラムを作ってそこに一律にデータ0を入れなさい。という命令にしてます。



じゃ、予測を取ります。


モデルの中にXを入れるとyが帰ってきます。やり方はこう↓


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


これだけです。Xを入れると、さっきのモデルを使って計算して結果をy_predへ返します。。


精度は分かりませんが偏差は、モデルとどのくらい違うのか?は計算できるので


計算します。↓


# 二乗平方根で誤差を算出
mse = mean_squared_error(y, y_pred)
print("KERAS REG RMSE : %.2f" % (mse ** 0.5))


結果は、こう↓
KERAS REG RMSE : 13.73
KERAS REG SCORE: 0.89
KERAS REG RMSE : 133.63

学習のときは、偏差13.73で精度が88%でした。


今回の予測は、モデルとの偏差が133.63もある。


偏差が大きかったら、予測の範囲が大きいということ。


さっき、モデルを予測して調整するとよい。


一応、タイムが知りたい場合は、print(y_pred)で出てくる。


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

print(y_pred) ← これを追加

# 二乗平方根で誤差を算出
mse = mean_squared_error(y, y_pred)
print("KERAS REG RMSE : %.2f" % (mse ** 0.5))



このときは、こんな感じで。

KERAS REG RMSE : 15.05
KERAS REG SCORE: 0.88
[120.9335 142.49214] ← これ予測。
KERAS REG RMSE : 132.15


学習のときのレースタイムが、秒単位だったので、



予測で帰ってきたのが秒単位です。


1番馬が、120.93秒なので、2.00.9ですね。
2番馬が、142.49秒なので、2.22.4ですね。



まず3000mなので、2分とか無理ですね(笑)



まぁこのように精度を考えてモデルを構築して計算させ予測させるという流れです。



最後にまとめたソースコードを載せます。


import pandas as pd
import matplotlib


matplotlib.use('Agg') # -----(1)
import matplotlib.pyplot as plt



#過去データの読込
df_kw = pd.read_csv("base.csv",encoding="UTF-8")


#岡山
df_temp_oka = pd.read_csv("kako.csv",encoding="UTF-8")
df_temp_oka['r_date'] = pd.to_datetime(df_temp_oka['r_date'])

df_temp_oka["YEAR"] = df_temp_oka.r_date.map(lambda _: _.year)
df_temp_oka["MONTH"] = df_temp_oka.r_date.map(lambda _: _.month)


del df_temp_oka['r_date']

# null値の削除
df_temp_oka = df_temp_oka.dropna()

cols = ["umaID","raceID","kishuID","r_place","r_shibada","YEAR","MONTH"]
for col in cols:
df_temp_oka = df_temp_oka.join(pd.get_dummies(df_temp_oka[col], prefix=col))


#学習準備
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(31, input_dim=len(x_cols), activation='relu'))
reg.add(Dense(62, activation='softmax'))
reg.add(Dense(128, activation='linear'))
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()))


# 可視化
pd.DataFrame({"pred":y_pred, "act":y_test})[:100].reset_index(drop=True).plot(figsize=(15,4))



df_pred = pd.read_csv("pred_data.csv",encoding="UTF-8")
df_pred["r_date"] = pd.to_datetime(df_pred['r_date'])
df_pred["r_time"] = 0

df_pred["YEAR"] = df_pred.r_date.map(lambda _: _.year)
df_pred["MONTH"] = df_pred.r_date.map(lambda _: _.month)


cols = ["umaID","raceID","kishuID","r_place","r_shibada","YEAR","MONTH"]
for col in cols:
df_pred = df_pred.join(pd.get_dummies(df_pred[col], prefix=col))


# テストデータの不足分を補完
for col in x_cols[2:]:
if not col in df_pred.columns:
df_pred[col] = 0

# 予測用データ
X = df_pred[x_cols].as_matrix().astype('float64')
y = df_pred["r_time"].as_matrix().astype('int').flatten()

# 正規化
X = scaler.transform(X)

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

print(y_pred)

# 二乗平方根で誤差を算出
mse = mean_squared_error(y, y_pred)
print("KERAS REG RMSE : %.2f" % (mse ** 0.5))

quit()



電気予測と競馬予想の人工知能の説明終わり。


人工知能の回は、続きます。