3日目 モデルの選定・学習

ドラクエ3リメイクが発売されましたね
私はSFCのドラクエ3が好きで、あの記憶を更新したくない思いが強いので、今作は恐らくプレイしません。SNSではワードミュートしています。

さて今日は、前日までに作成したデータセットを用いて
モデルの生成を行い、訓練に入りました。

まずどのモデルを生成するか、ですが
今回のような生か死か(DQ4: 通常戦闘曲名となります)、の二値を測定するようなケースではロジスティック回帰が適しているようなので
こちらを利用していきたいと思います。
インスタンス生成時には学習の反復回数(max_iter)を500に指定しました。
(指定しないまま実行すると、学習がまともに行われず、/opt/conda/lib/python3.10/site-packages/sklearn/linear_model/_logistic.py:458: ConvergenceWarning: lbfgs failed to converge (status=1): STOP: TOTAL NO. of ITERATIONS REACHED LIMIT….といったエラーが出てしまいます)

その後、X_train(特徴量)とy_train(ターゲット)を使って、モデルに学習させています。

# 1. ロジスティック回帰による訓練
from sklearn.linear_model import LogisticRegression

# モデルのインスタンス化 反復回数を500とした
model = LogisticRegression(max_iter=500)

# モデルの訓練
model.fit(X_train, Y_train)

完了すると、訓練後のモデルが出力されます。(なんかうれしいね)

LogisticRegression
LogisticRegression(max_iter=500)

次に、訓練したモデルがどれだけの精度を持っているのか試すべく
predictメソッドにテストデータを渡して予測させてみます。
ここでは、予測結果と目的変数を比較させてaccuracyを出します。

# 2. 作成したモデルで、テストデータに対する予測を行わせる

# 作成したモデルに、テストデータの説明変数(X_test)を渡して、目的変数の値を予測させる(predict)。
y_pred = model.predict(X_test)

# 前手順で用意していたテストデータの目的変数(Y_test)と比較して、正答率を算出する
from sklearn.metrics import accuracy_score
accuracy = accuracy_score(y_pred, Y_test)
print(f"正答率: {accuracy: 2f}")

正答率は 0.81でした。まあまあ高いのか?

正答率:  0.810056

ここで終わっても良いか・・・と思いきや
モデルにさらなる飛躍を遂げるためのライブラリがsklearnに用意されていました。
それがF1スコア、混同行列です。

F1スコアや混同行列(Confusion Matrix)を使った評価:

F1スコアは精度(Precision)と再現率(Recall)のバランスをとった指標です。データに偏りがある場合に役立ちます。
混同行列を使うことで、どれくらいの割合で生存者を正しく、あるいは誤って分類したかを詳しく確認できます。

gpt様
# 3. さらなるモデルの改善
# F1スコア、混同行列を使った評価

# F1スコアとは、モデルの精度と再現性のバランスを示す指標。
from sklearn.metrics import confusion_matrix, f1_score
f1 = f1_score(Y_test, y_pred)
print(f"F1スコア: {f1:.2f}")

# 混同行列とは、どれくらいの割合で生存者を正しく、あるいは誤って分類したか。
cm = confusion_matrix(Y_test, y_pred)
print("混同行列")
print(cm)

この結果、以下の通りになった。

F1スコア: 0.76
混同行列
[[90 15]
 [19 55]]

行列の意味については

  • 90: 正例(生存者)を正しく「生存」と予測した数(True Negative: TN)

  • 15: 正例を誤って「非生存」と予測した数(False Positive: FP)

  • 19: 負例(非生存者)を誤って「生存」と予測した数(False Negative: FN)

  • 55: 負例を正しく「非生存」と予測した数(True Positive: TP)

という事だそう。生存者の予測は大方当たっているが、非生存者については微妙、といったところか。

ただ、F1スコアの意味があまり理解できなかったので
もう少し詳しく掘り下げてもらった。

F1スコアは、精度(Precision)と再現率(Recall)のバランスを取った指標です。
精度(Precision): モデルが「生存すると予測した人の中で、実際に生存した人の割合」を示します。要するに、誤ったポジティブな予測(False Positive)が少ないかどうかを評価します。
再現率(Recall): 実際に「生存した人の中で、モデルが正しく生存と予測した人の割合」を示します。実際に生存した人をどれだけ見逃さずに予測できたかを評価します。

例で考えると分かりやすいです

例えば、Titanicのデータでモデルを訓練し、「生存するかどうか」を予測するとき、精度が高いと、モデルは誤って「生存」と予測することが少ない、つまり間違ったポジティブ(False Positive)が少ないことを意味します。
再現率が高いと、実際に生存していた人を見逃すことが少ない、つまり実際の生存者をほぼ全てキャッチしていることを意味します。

しかし、精度が高くても再現率が低ければ、多くの人を見逃す可能性があります。また、その逆もあります。F1スコアは、精度と再現率のバランスを取り、どちらも高い値にすることを目指した指標です。

われらがgpt様

つまり、あてずっぽうで全部生存!とかでも当たっちゃうときは当たっちゃうから、そのまぐれを少しでも減らしていこうよってのがF1スコアの目的だと勝手に解釈しました。

この調和が0.76という事なので、まずまず学習されていることが分かりました。

次回は、このモデルをさらにチューニングしていく手法を学びたいと思います!

いいなと思ったら応援しよう!