先把預測問題寫清楚
監督式機器學習用輸入特徵與已知目標學習預測規則。例如以一段合成感測值預測設備狀態,特徵是可在預測當下取得的資訊,目標是要預測的狀態。若把事後才知道的維修結論放進輸入,就改變了原本問題。
先聲明未來要面對的是同一設備的新時段,還是從未看過的設備。這個差異會影響切分單位、指標與可主張的泛化範圍;沒有一個比例能代替這個問題定義。
三個資料集各自回答什麼
訓練集用來擬合模型;驗證集支援開發選擇;測試集留給最後的評估。若反覆看測試分數再改模型,測試資訊已參與選擇,不能再把它當成完全獨立的最後驗證。
重複樣本或高度相關的同來源樣本可能跨越切分邊界。前處理若需要從資料估計參數,也應只在訓練部分擬合,再套用相同轉換。切分與前處理必須一起規劃。
用群組切分對齊你的問題
若要評估未見設備,來自同一設備的資料應避免同時出現在訓練與測試。若問題是預測未來時段,時間順序也需保留。群組切分並非任何問題的唯一正解;它是針對特定泛化問題的設計。
以下六列資料只示範交集檢查,沒有訓練模型,也不足以估計真實效果。實際研究還要確認樣本數、代表性、標記品質與指標的不確定性。
例子:三台設備,各有兩筆資料
資料依序為 A1、A2、B1、B2、C1、C2。若把奇數位置放 train、偶數位置放 test,三台設備都同時出現在兩邊。
這個切分可能測到已知設備的新紀錄,但不能直接回答未見設備的問題。把 A 放 train、B 放 validation、C 放 test,能示範群組分離;只有一台測試設備仍不足以主張廣泛泛化。
判斷:先讓切分對準問題,再討論分數。
離線練習:找出群組交集
只需 Python 3 與六個寫在程式中的合成 ID,不下載資料、不使用個資、不訓練模型。
- 閱讀程式,先預測 naive_overlap 與 grouped_overlap。
- 執行 python3 split_demo.py,核對兩行輸出。
- 寫明若部署對象改為「同設備的未來時段」,還需要哪個切分條件。
rows = [(device, sample) for device in "ABC" for sample in (1, 2)]
naive_train = {d for d, _ in rows[::2]}
naive_test = {d for d, _ in rows[1::2]}
train, validation, test = {"A"}, {"B"}, {"C"}
print("naive_overlap=" + repr(sorted(naive_train & naive_test)))
print("grouped_overlap=" + repr(sorted((train & validation) | (train & test) | (validation & test))))預期結果
naive_overlap=['A', 'B', 'C'];grouped_overlap=[]。第二行只證明本例群組無交集。
自行檢核
為什麼無交集還不能證明模型準確?請指出本練習根本沒有執行哪個步驟。
結束與清理
程式不建立資料檔;保留輸出與自己的解釋即可。