E 讀程式:外部名單與測試
每題的解答都收合在題目下方:先自己作答,再點開「看解答」核對。
先認識這些詞
這一課新出現的詞如下(前面課程已解釋過的詞不重複,完整列表見 術語表)。
- 代理標籤:沒有真正答案時,用外部名單或規則當成「近似的答案」。例如用空投女巫名單當作可疑。
- Hop:一個區塊鏈協議。它公布過一份「空投女巫」名單,也就是用假帳號領取免費代幣的人。
- LayerZero:另一個區塊鏈協議,也公布過一份類似的女巫名單。研究用它來檢驗跨名單的結果。
- 保留店家:紐約市 YelpNYC 資料中的一批店家,在研究初期就切出來、完全不讀,只在最後的確認時使用。
- 合成資料:人工生成的假資料,用來測試程式,不是真實資料。
目標
讀完這課,你能說出外部名單如何被用來當「代理標籤」,以及測試是怎麼保護結果的。
前置
先讀完 07,以及 A、B 課。
第一步:外部名單(src/reallabel.py、src/reallabel2.py、src/confirm.py)
白話:Hop、LayerZero 的空投女巫名單,或 Yelp 的過濾結果,被當成「真實可疑行為」的代理標籤。
要注意的風險
- 名單的定義本身可能有循環性。例如名單是「哪些帳號來投票」,而特徵也包含帳號歷史,模型會直接學到定義。
- YelpNYC 有保留店家,不能在任何開發步驟中讀取。檢查
src/confirm.py是否遵守這個規則。
問自己
1. 代理標籤的定義,是否用到了模型的輸入特徵?
看解答
要看名單怎麼定義。Hop 名單是「哪些帳號來投票」,而模型的帳號歷史也用同樣的帳號資訊,所以兩者會循環:只用帳號歷史就能「猜中」名單(0.896)。這就是代理標籤的循環性。
2. 保留店家在哪一步被切出?切出之後,任何開發步驟還會碰到它嗎?
看解答
保留店家在資料準備的最開始就切出,之後任何開發步驟都不應該讀取。要確認 src/confirm.py 與所有讀取點;保留店家只在最後的確認評估中使用。
第二步:測試(tests/)
白話:測試是程式的自我檢查。它說明程式「應該」做什麼。
要注意
- 測試通過不代表程式正確,只代表程式符合測試的假設。
- 測試使用合成資料(
tests/_synth.py),不讀真實資料。這代表真實資料的問題測試抓不到。
練習:打開一個測試檔(例如 tests/test_data.py),看它檢查什麼。問自己:如果資料載入寫錯了,這個測試會失敗嗎?
看解答
打開 tests/test_data.py 看每個測試的 assert(斷言)。如果斷言是「帳號已換成代碼」「欄位型態正確」這類條件,資料載入寫錯時會失敗;如果只檢查格式或數量,就抓不到邏輯錯誤。判斷重點是斷言的內容,不是測試的名稱。
檢核
1. 代理標籤的白話意思是什麼?它可能有什麼問題?
看解答
用外部名單當作「近似的答案」,例如用空投女巫名單代表可疑帳號。問題:名單的定義可能和模型的特徵循環,而且名單本身可能有誤。
2. 保留店家應該在哪一步被切出?
看解答
在資料準備的最開始就切出,之後不讀取,直到最後的確認評估。
3. 測試通過,能保證結果正確嗎?為什麼?
看解答
不能。測試只檢查寫下的條件,而且使用合成資料(tests/_synth.py),真實資料的錯誤可能測不到。測試通過只代表程式符合測試的假設。
導航
引用文獻
- Hop Protocol (2022). Hop airdrop: Eliminated Sybil attackers list. [bib: hop_airdrop_sybil]
- Do, T., Imig, S., Phan, T. D., et al. (2026). Sybil detection on public blockchains via XGBoost and gas provision. [bib: do_layerzero_xgboost] — LayerZero 名單的來源。
- Rayana & Akoglu (2015) [bib: rayana2015collective] — YelpNYC 過濾標籤。
- Kaufman et al. (2012) [未收入 bib] — 代理標籤與洩漏的風險。
- Tang et al. (2023) [bib: tang2023gadbench] — 監督式圖異常偵測的基準。