My pool table set for 9-ballMy pool table set for 9-ballMy pool table set for 9-ballMy pool table set for 9-ball我的台球桌適合 9 球在以前的帖子,我討論了機器學習的定義以及是否聯合管理計劃做到了(是的,確實如此),在這裡我將把機器學習應用到我收集的一些真實數據上。
我最喜歡的兩種機器學習算法是 K 最近鄰算法和朴素貝葉斯算法,因為它們很容易理解。 算法不必很複雜即可獲得良好的結果,並且對於某些問題,這兩種算法可以快速準確地執行。
K 最近鄰幾乎就是它聽起來的樣子。 該算法計算數據集中的哪些觀測值是最接近您要預測的點的“K”。 那麼預測要么是這些最近點的響應平均值(如果您的響應變量是連續的),要么是最常見的類別(如果您的響應變量是分類的)。 通常,您會擬合一系列 K,並使用交叉驗證來選擇哪個 K 可提供最佳的預測性能。
經常有人問我為什麼樸素貝葉斯被稱為“樸素”。該名稱源自這樣一個事實:使用該算法時做出的關鍵假設是所有預測變量都是相互獨立的。 在許多情況下,這是一個天真的假設。 因此,當該假設更接近真實時,該方法往往比預測變量彼此高度相關時表現更好。 為了進行預測,在給定觀察到的預測變量的情況下,根據觀察訓練數據中的這些值(其中該類別是響應)的概率來計算響應類別(例如,獲勝或失敗)的概率。 計算概率較高的類別就是預測類別。
讓我們看一下這兩種方法的實際效果。
誰更好?
我和我丈夫都是台球愛好者,幾乎每天下班回家後都會玩台球。 經過一年左右的比賽,我們認為我們的比賽相當勢均力敵,也許我稍微好一些。 我說:“這個問題我們可以回答!”
因此,從 2018 年 1 月 1 日開始,我們開始跟踪我們的結果。 我保留了一個電子表格(只是因為家裡游戲室的計算機上沒有安裝 JMP!),用於跟踪月份、星期幾、日期、我贏了多少場比賽、我們玩了多少場比賽、是否我贏得了那場比賽,以及進行了哪場台球比賽(8 球或9 球)。 因為這首先是在電子表格中,所以還有計算整體遊戲獲勝百分比以及會話獲勝百分比的列。
值得慶幸的是,我只需將 Excel 文件拖到 JMP 主窗口中,Excel 導入嚮導就會發揮其魔力來創建 JMP 數據表。 進行一些調整以使會話獲勝?指示一個名義變量和獲勝的比賽數量以及序數變量,我就準備好預測我下一個晚上的台球統治力了!
Imported dataImported dataImported dataImported data導入數據只是我還沒有完全準備好。 還記得我在 K 最近鄰中提到過交叉驗證用於確定最佳擬合 K 嗎? 我目前沒有用於培訓和驗證的專欄。 雖然 K 最近鄰法和朴素貝葉斯法都可以選擇在其平台啟動時使用一定比例的數據作為驗證,但如果我想比較這兩種方法,我應該對兩者使用相同的訓練集。 幸運的是,JMP 也為我提供了“創建驗證列”實用程序。
該實用程序中有多個選項可用於如何創建驗證列。 如果我的響應變量高度不平衡(這種情況發生在失敗不常見或尋找欺詐交易的情況下),我會想使用分層隨機選項來確保我在訓練和驗證集中都有包含響應的數據。 在這種情況下,我知道我的所有列都平衡得相當好,因此我的訓練或驗證集中不太可能完全缺少某個類別。 因此,我將使用“固定隨機”選項創建驗證列。 我可以為隨機生成設置一個種子,這樣我將來就可以再次重現這個特定的列,但我認為在這種情況下沒有必要。
分析時間!
現在,有了驗證列,我可以在“分析”>“預測建模”菜單中啟動 K 最近鄰平台。 會話獲勝?是我的響應變量以及我想要預測的內容,即我的生日,即 10 月 13 日星期六。 [注:我在生日前開始寫這篇文章;讀到最後,看看本文中的預測是否正確!] 月、日、遊戲和玩過的遊戲(玩過的遊戲數量)是我的因素。 我認為日期不會有幫助,主要是因為每個月-日組合都會出現一次(除了我們玩多個會話的幾個週末)。 我還將讓平台計算最多 25 個最近鄰居,而不是默認的 10 個。
KNN Launch DialogKNN Launch DialogKNN Launch DialogKNN Launch DialogKNN 啟動對話框
報告的模型選擇部分跟踪在具有 1 到 25 個鄰居的模型的每個訓練集和驗證集上計算的錯誤分類率。 選擇線設置為 K = 20——驗證集上的錯誤分類率最小。 下表顯示驗證集中超過 44% 的觀測值被錯誤分類。 混淆矩陣顯示,與實際獲勝或失敗大致相同數量的觀察結果被錯誤分類。 馬賽克圖給出了混淆矩陣的直觀表示。
KNN ReportKNN ReportKNN ReportKNN ReportKNN報告錯誤分類率並不高,但我不確定我的預測因子是否真的具有預測性。 如果我在 1 月 1 日就想寫這篇文章,我可能會記錄一些事情,比如這一天的壓力有多大、我們是否在玩遊戲時享受成人飲料,以及我睡了多少覺。前一天晚上有過! 所以我不會因為算法沒有給我一個非常合適的模型而責怪它。
我將把預測公式保存到數據表中,這樣我就可以在使用樸素貝葉斯擬合這些相同的數據後對我的生日進行預測。
NB Launch DialogNB Launch DialogNB Launch DialogNB Launch DialogNB 啟動對話框
我們注意到的第一件事是驗證集上的錯誤分類率稍小一些,僅超過 40%。 混淆矩陣向我們表明,與 K 最近鄰模型相比,我們使用樸素貝葉斯模型在驗證集中正確分類了 7 個觀測值。 最後,我們得到每組的 ROC 曲線。 在驗證集上,我們的曲線下面積(模型擬合質量的另一個度量)是 0.5676。 雖然這不是很好,但它仍然比隨機猜測要好,隨機猜測的 AUC ≈ 0.5。
NB ReportNB ReportNB ReportNB Report注意報告
我將再次將預測公式保存到數據表中,以對我的生日池表現進行預測。
因為我們打9球時是“9勝制”系列賽,所以我提前不知道我們會打多少場比賽。 我能在5-0大勝的情況下快速獲勝嗎? 還是需要全部9場比賽才能決出勝負? 我將為每個可能玩的遊戲數量(5 到 9)添加一行,看看我們的模型預測什麼。
Added rows for predictionAdded rows for predictionAdded rows for predictionAdded rows for prediction添加了用於預測的行
在這一天,兩個模型都認為我應該是獲勝者,除非系列賽進行到 9 場比賽。 在這種情況下,K 最近鄰預測我會輸。 這將是一個生日快樂!
幾天后,我的生日到了,帶著我會贏的信念,我走進了遊戲室。 大約一個小時後,我沮喪地退出了比賽,因為我以三比五輸掉了比賽。 至少我有蛋糕!
發生了什麼?
根據模型,事情看起來對我來說非常好! 我怎麼會輸呢? 樸素貝葉斯模型讓我有機會了解除了最終預測之外的估計獲勝概率。 看來我也應該看看這些,而不是抱有如此高的希望。 我將概率公式保存到數據表中,很明顯,雖然我被預測獲勝,但最高概率略低於 75%,最低概率略高於 60%。 這意味著我丈夫實際上有很大的獲勝機會。 通過僅查看最終預測,我錯誤地判斷了生日獲勝的實際機會。 我將以此作為警告,在下次下注之前查看我所掌握的所有信息!
Win probabilities. [Note: some data table columns hidden for space.]Win probabilities. [Note: some data table columns hidden for space.]Win probabilities. [Note: some data table columns hidden for space.]Win probabilities. [Note: some data table columns hidden for space.]獲勝概率。 [注意:一些數據表列因空間原因而隱藏。]
離別鏡頭
關於這些模型的最後幾句話:當模型中的變量不能很好地預測響應時,即使是最先進的算法也不能很好地執行。 我們通過這些數據以及它們的高錯誤分類率看到了這一點。 正如我之前所說,這不是算法的錯誤,而是我收集的數據的錯誤。 大多數具有合理預測變量的模型都比這裡的模型成功得多。 也許在 2019 年,我會在數據收集中添加更多信息,並重新審視這些模型。
此外,台球是一項體育賽事,與機器學習的許多(甚至可能是大多數)常見應用相比,人為因素在結果中發揮著更大的作用。 在秋季的大學和職業橄欖球比賽中,你幾乎可以在每個週末看到這樣的情況,弱者會爆冷。 這有時被稱為“任何給定的星期日”。 然而,從長遠來看,考慮到這些概率,經過多次試驗,我會贏我的賭注;就像大多數時候最受青睞的足球隊獲勝一樣,體育博彩玩家也能賺錢。 事實上,如果我看看生日後的接下來幾天,我確實有 60% 的機會獲勝。