学習準備 第23回 人工知能
前回ラベル貼ったので、これを必要なデータのみを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_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)
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
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()))
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
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))
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
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))
reg.add(Dense(62, activation='relu'))
reg.add(Dense(1))
結果
KERAS REG RMSE : 48.60
KERAS REG SCORE: 0.61
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))
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
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))
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
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))
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
KERAS REG SCORE: 0.96
偏差5.18、精度96%だそうです。
一旦、モデルをこれにして、次回予測に。
コメント
0 件のコメント :
コメントを投稿