目的:使用多種模型比較效果優劣。

目前使用了 隨機森林,邏輯迴歸,SVC,MLP 模型,收集了 44 局遊戲數據。

特徵矩陣 X 形狀: (5195, 4032)
標籤分佈: {向左走: np.int64(1419), 向右走: np.int64(1017), 發射子彈: np.int64(2759)}

隨機森林效果很差,一直往左走。猜測是數據不夠,以及訓練數據中左右標籤不均勻對投票影響較大。訓練集準確率:99.65%。嚴重過擬合,泛化能力極差。

邏輯迴歸會有左右擺頭,但是閃避和打擊效果都很差,更像是隨機的。訓練集準確率: 66.22%。
由於特徵質量差,無法理解何時需要閃避(移動)或打擊(射擊),所以表現像隨機的。

SVC 的訓練時間很長,而且效果很差,只會一直髮射子彈,不會動。訓練集準確率: 59.35%。
多數類偏見的經典表現。SVC 在高維特徵空間中訓練困難,最終找到的決策邊界最安全的選擇就是預測“發射子彈”(53% 的樣本),從而犧牲了少數類的準確性。

MLP 的訓練時間較長,似乎存在一定的閃避效果,但是閃避次數太少。時間太長了就不計算準確率了。


目的:調整隨機森林的參數以期解決過擬合問題。

特徵矩陣 X 形狀: (5195, 4032)
標籤分佈: {向左走: np.int64(1419), 向右走: np.int64(1017), 發射子彈: np.int64(2759)}

調整隨機森林參數為 max_depth=10, min_samples_split=5,訓練集準確率: 55.82%。
調整隨機森林參數為 max_depth=15, min_samples_split=5,訓練集準確率: 69.62%。
都有非常薄弱的閃避意識,但是表現出來更像是面對一個炸彈時會隨機向左向右。


目的:改進特徵質量

現有問題:

  • 維度災難: 將特徵維度從 \(4032\)
  • 語義缺失: 提取更有意義的相對位置和威脅緊急程度信息,從而解決模型在測試時無法泛化和躲避子彈的問題。

新的提取策略:
飛船與目標定位: 提取飛船當前的精確 \(X\) 座標作為自身定位特徵;同時,提取怪物所在行的列級獨熱編碼(每列 \(1/0\))作為射擊目標特徵。
威脅量化與閃避決策: 放棄原始像素,轉而提取飛船周圍三列(當前列和左右相鄰列)中,最靠近飛船的炸彈的 \(Y\) 座標。這個 \(Y\) 座標值直接量化了威脅的緊急程度,有效指導模型進行精準閃避。
邊界處理: 對超出遊戲邊界的列,賦予最大的 \(Y\)

解決了訓練速度問題: 維度從 \(4032\) 降至幾十維,SVC 和 MLP 的訓練時間得到數量級的提升。
解決了“緊急程度”問題: “炸彈的 Y 座標”(即離飛船有多近)。模型現在可以學習:“如果左右側的 Y 座標值很高(距離近),則需要緊急向另一側移動。”
解決了“邊界處理”問題: 對於邊界外的列,特徵默認返回最大值 (len(grid)-1)。這個設計相當於告訴模型牆是不能走的。

特徵矩陣 X 形狀: (5195, 36)

四個模型的躲避能力都有顯著提升,總體排序大致為:

邏輯迴歸= SVC(完美躲過所有炸彈) > MLP(投彈率0.2, lvl4下400步) > 隨機森林(投彈率0.2, lvl4下300步)

但是,射擊的精準度都很差,推測為訓練數據設計準度太低導致的。


目的:提高設計精準度

問題:原來的特徵提取函數都不包含射擊時機的顯式信息。

新的提取策略:
記錄相對距離 (新增關鍵特徵): 計算飛船與怪物在 \(X\) 軸上的相對距離(\(\Delta X = X_{\text{alien}} - X_{\text{avatar}}\))。

效果:SR 和 MLP 原本閃避就不行,所以先不管了。而 LR 閃避能力降低,設計精度提高;而 SVC 閃避能力還是很強,但是設計精度還是不行

通過改變 LR 的動作權重,閃避能力重新提高。

但是當只剩 1/2 個敵人時,兩者的射擊能力都不行。可以輕鬆度過前期,但很難終結遊戲。問題在於目前的射擊特徵是所有怪物的相對距離。推測是當怪物稀疏時,大量的 \(0\)