A 讀程式:資料、切分與注入
導航:← 08 誤判率與BH | 目錄 | B 特徵與模型 →
每題的解答都收合在題目下方:先自己作答,再點開「看解答」核對。
先認識這些詞
這一課新出現的詞如下(前面課程已解釋過的詞不重複,完整列表見 術語表)。
本課沒有新的專業詞;前面出現過的詞可在 術語表 查到。
目標
讀完這課,你能依序說出:資料怎麼載入、怎麼切分、假灌票在哪裡產生,並確認每一步有沒有偷看檢驗題。
前置
先讀完 00、03、04。
讀的順序
依資料流排列,不是依檔名排列:
- 資料載入(
src/data.py):原始投票讀進來,帳號換成數字代碼。 - 切分(
src/split.py):分成參照與檢驗。 - 注入(
src/attacks.py、src/tasks.py):在參照題或檢驗題上製造假灌票。
第一步:資料載入(src/data.py)
白話:原始檔案裡的錢包地址或帳號,要換成整數代碼。之後的程式只看代碼,不看原始身分。
問自己
1. 原始身分在哪一行被換掉?換完之後,原始值還會留在記憶體或檔案裡嗎?
看解答
在資料載入時,帳號會被換成整數代碼(見 src/data.py)。之後程式只看代碼。要確認原始值是否還留在檔案或記憶體中,需要找出寫入檔案的地方(見下方練習)。
2. 代碼是怎麼產生的?同一個帳號每次都會得到同一個代碼嗎?
看解答
同一個帳號應該每次都得到同一個代碼,否則帳號歷史特徵就沒有意義。實際的轉換方式要在 src/data.py 中確認。
練習:找到寫入檔案的地方(搜尋 to_csv、to_pickle、open(... "w"))。確認寫入的內容沒有原始身分。
看解答
寫入的內容應該只有代碼,不含原始帳號或錢包地址。如果找到原始值被寫入檔案,要停下來回報,不要繼續。
第二步:切分(src/split.py)
白話:依票數分層,切成約 75% 參照、25% 檢驗。切分後會再做平衡檢查。
問自己
1. 切分是隨機的嗎?隨機種子是多少?
看解答
切分應該是隨機的,並且用固定種子(分層後隨機抽取)。種子的數字要在 config.py 中查。
2. 檢驗題的標籤會不會在切分階段就被用來做其他事?
看解答
不應該。切分只看票數(用來分層),不應該用到檢驗題的標籤。要確認切分函式的輸入欄位。
練習:用一個 40 題的假資料,手動切分,確認比例大約是 30 : 10。
看解答
參照約 30 題,檢驗約 10 題(同第 04 課)。
第三步:注入(src/attacks.py、src/tasks.py)
白話:在參照題或檢驗題上製造假灌票。
看這裡
src/attacks.py第 91–92 行(set_mask):決定哪些題能被注入。src/attacks.py第 97 行(targets):決定這次實際被攻擊的題。src/tasks.py第 75 行(inject):呼叫注入的入口。src/tasks.py第 147 行(main_settings):四種主要攻擊的設定。
問自己
1. 訓練注入(set_idx = 0)只會選到參照題嗎?
看解答
是的。set_idx = 0 對應參照題(set_mask 回傳非檢驗題的遮罩)。
2. 檢驗注入(set_idx = 1)只會選到檢驗題嗎?
看解答
是的。set_idx = 1 對應檢驗題。
3. 替換時,被替換的票是否真的改成假票,總票數有沒有不變?
看解答
應該不變。替換式注入是把真票換成假票,不新增票數;可以在練習中用前後的票數比較來確認。
練習:在 set_mask 旁邊,寫下兩種 set_idx 各能選到哪些題。把答案和 src/selfinj.py 第 42 行、第 88 行對照。
看解答
set_idx = 0:參照題(非檢驗題);set_idx = 1:檢驗題。src/selfinj.py 第 42 行(訓練注入)用 0,第 88 行(檢驗注入)用 1,與這個對應一致。
檢核
1. 原始身分在哪一步被移除?
看解答
在資料載入(src/data.py)時就換成代碼,之後的程式只看代碼。
2. 參照題和檢驗題在注入時如何分開?
看解答
注入時用 set_idx 區分:0 只選參照題,1 只選檢驗題。
3. 如果你發現檢驗題的注入會影響參照題,這是洩漏還是正常?為什麼?
看解答
要看它是否進入訓練。如果檢驗注入只在評估時使用、訓練時不含它,就是正常;如果它改變了訓練用的特徵,就是洩漏。本研究的訓練用圖只注入參照題(set_idx = 0),所以是正常的(見 B 課)。
導航
引用文獻
- 資料來源:Snapshot Labs (2026) [bib: snapshot_hub];Polis [bib: compdemocracy_polis_opendata];Rayana & Akoglu (2015) [bib: rayana2015collective]。
- 切分平衡:Morgan & Rubin (2012) [bib: morgan2012rerandomization]。
- 注入與替換:Liu et al. (2022) [bib: liu2022bond]。