sazae-buster-ai
サザエさんのじゃんけん履歴を学習し、次回の手を予測して勝ちにいくミニ機械学習プロジェクトです。
リポジトリ:
https://github.com/SioComb/sazae-buster-ai/tree/main
概要
このプロジェクトでは、サザエさんじゃんけん研究所の公開データをもとに、
サザエさんが次回出す手を予測します。
目的は、機械学習そのものの精度を極限まで高めることではなく、
以下の流れを実際に手を動かして理解することです。
- データ収集
- データ整理
- 訓練データ / テストデータ分割
- 特徴量作成
- 教師あり学習
- 分類モデルによる予測
- 評価指標の確認
使用技術
| 技術 | 用途 |
|---|---|
| Python | メイン処理 |
| uv | Python環境・依存関係管理 |
| requests | Webページ取得 |
| BeautifulSoup | HTML解析 |
| scikit-learn | 機械学習モデル |
| csv | CSV読み書き |
データについて
データ元は以下のサイトです。
- サザエさんじゃんけん研究所 公式ウェブサイト
- http://park11.wakwak.com/~hkn/
各年の結果ページは、以下のようなURL形式になっています。
http://park11.wakwak.com/~hkn/result1996.htm
http://park11.wakwak.com/~hkn/result1997.htm
...
http://park11.wakwak.com/~hkn/result2026.htm
各年のページから、以下の情報を取得しています。
| 項目 | 内容 |
|---|---|
| date | 放送日 |
| hand | サザエさんが実際に出した手 |
| source_url | 取得元URL |
データ件数
全データ件数: 1521件
訓練データ: 1005件
テストデータ: 516件
例外データ
2013年12月1日は、1日に2回じゃんけんが実施された特殊回でした。
通常のスクレイピング処理ではこの2件が取りこぼされたため、
以下の2件を手動で補正しています。(コード修正がめんどうだった・・・後悔はしていない・・・)
2013-12-01,グー
2013-12-01,チョキ
データ分割
今回は手作業で以下のように分割しました。
1996年〜2015年 → train.csv
2016年〜2026年 → test.csv
時系列データなので、ランダム分割ではなく、古いデータで学習し、新しいデータで評価しています。
学習方法
今回の初期モデルでは、直近3回のサザエさんの手から、次回の手を予測します。
入力X:
3回前の手, 2回前の手, 1回前の手
正解y:
次回の手
例:
チョキ → グー → グー → パー
この場合、学習データは以下のようになります。
| 3回前 | 2回前 | 1回前 | 正解 |
|---|---|---|---|
| チョキ | グー | グー | パー |
モデル内部では、手を以下のIDに変換しています。
| 手 | ID |
|---|---|
| グー | 0 |
| チョキ | 1 |
| パー | 2 |
使用モデル
初回モデルでは、scikit-learn の決定木を使用しました。
DecisionTreeClassifier(
max_depth=3,
random_state=42,
)
実行結果
データ確認
訓練データ
| 手 | 件数 |
|---|---|
| グー | 322 |
| チョキ | 349 |
| パー | 334 |
| 合計 | 1005 |
テストデータ
| 手 | 件数 |
|---|---|
| グー | 167 |
| チョキ | 186 |
| パー | 163 |
| 合計 | 516 |
訓練データ 先頭5件: ['チョキ', 'グー', 'グー', 'パー', 'チョキ']
訓練データ 末尾5件: ['パー', 'チョキ', 'グー', 'パー', 'パー']
テストデータ 先頭5件: ['チョキ', 'グー', 'チョキ', 'グー', 'パー']
テストデータ 末尾5件: ['チョキ', 'チョキ', 'パー', 'グー', 'パー']
学習データ確認
| データ | 件数 |
|---|---|
| X_train | 1002 |
| y_train | 1002 |
| X_test | 516 |
| y_test | 516 |
評価結果
正解率: 0.529
じゃんけんは3択なので、ランダム予測なら期待正解率は約33.3%です。
今回の初回モデルでは、テストデータに対して 52.9% の正解率となり、ランダム予測を上回りました。
分類レポート
| precision | recall | f1-score | support | |
|---|---|---|---|---|
| グー | 0.71 | 0.46 | 0.55 | 167 |
| チョキ | 0.52 | 0.49 | 0.50 | 186 |
| パー | 0.45 | 0.65 | 0.54 | 163 |
| accuracy | 0.53 | 516 | ||
| macro avg | 0.56 | 0.53 | 0.53 | 516 |
| weighted avg | 0.56 | 0.53 | 0.53 | 516 |
混同行列
[[ 76 45 46]
[ 14 91 81]
[ 17 40 106]]
行が実際の手、列が予測した手です。
実際グー → グー76 / チョキ45 / パー46
実際チョキ → グー14 / チョキ91 / パー81
実際パー → グー17 / チョキ40 / パー106
次回予測(5月3日放送分)
最新3回は以下でした。
最新3回: ['パー', 'グー', 'パー']
モデルの予測結果は以下です。
サザエさんの次回の手予測: チョキ
こちらが出すべき手: グー
・・・・・・・・あたるかな?