Data Latihan ML: Preset Privasi untuk Kebolehulangan
Apabila melatih model pembelajaran mesin dengan data pelanggan, anda mungkin perlu:
- Buat dataset latihan v1.0 dengan 100,000 rekod yang telah dibenamkan
- Latih model
- Dalam 3 bulan, buat dataset v1.1 dengan 50,000 rekod baru + 100,000 lama
- Fine-tune model
Jika penganoniman bukan deterministik, ID pelanggan yang sama akan diubah dengan cara yang berbeda antara v1.0 dan v1.1:
v1.0: "Customer CUST_2024_5731 placed order on 2024-01-15"
v1.0 anonymized: "Customer [CUSTOMER_ABC123] placed order on [DATE_1]"
v1.1: "Customer CUST_2024_5731 placed order on 2024-02-20"
v1.1 anonymized: "Customer [CUSTOMER_XYZ789] placed order on [DATE_2]" ← **Different!**
Model tidak dapat belajar pola konsisten kerana ID yang sama dilambangkan secara berbeza.
Preset Penganoniman Deterministik
Gunakan hash fungsi deterministik untuk memetakan ID ke pengganti secara konsisten:
import hashlib
import json
def create_deterministic_preset(entity_list, seed="ml_training_v1"):
"""
Buat pemetaan konsisten dari entiti asli ke ID pengganti.
ID yang sama selalu memetakan ke pengganti yang sama.
"""
preset = {}
for entity in entity_list:
# Hash entiti + benih untuk menghasilkan ID pengganti unik
hash_input = f"{seed}_{entity['type']}_{entity['value']}"
hash_output = hashlib.sha256(hash_input.encode()).hexdigest()[:8]
preset[f"{entity['type']}_{entity['value']}"] = f"[{entity['type']}_{hash_output}]"
return preset
Aliran Latihan ML v1.0 → v1.1
v1.0: Buat Preset Awal
# Ekstrak semua entiti daripada 100,000 rekod
all_entities_v1 = extract_entities_from_dataset(dataset_v1_0)
# Buat preset deterministik
preset_v1 = create_deterministic_preset(
all_entities_v1,
seed="ml_training_v1.0"
)
# Simpan preset untuk kebolehulangan
with open("presets/ml_training_v1_0.json", "w") as f:
json.dump(preset_v1, f)
# Anonimkan semua rekod dengan preset
anonymized_v1 = anonymize_with_preset(dataset_v1_0, preset_v1)
# Latih model
model_v1 = train_model(anonymized_v1)
v1.1: Gunakan Preset Lama + Tambah Baru
# Muat preset v1.0 (untuk ID lama)
preset_v1 = json.load(open("presets/ml_training_v1_0.json"))
# Ekstrak entiti daripada 50,000 rekod baru
new_entities_v1_1 = extract_entities_from_dataset(dataset_v1_1_new)
# Untuk entiti baharu yang tidak ada dalam preset_v1:
preset_v1_1 = preset_v1.copy()
for entity in new_entities_v1_1:
key = f"{entity['type']}_{entity['value']}"
if key not in preset_v1_1:
# Gunakan benih yang sama untuk kejelasan
hash_output = hashlib.sha256(f"ml_training_v1.0_{key}".encode()).hexdigest()[:8]
preset_v1_1[key] = f"[{entity['type']}_{hash_output}]"
# Gabungkan 100k lama (sudah dibenamkan dengan preset_v1) + 50k baru (dengan preset_v1_1)
combined_dataset = dataset_v1_0_anonymized + anonymize_with_preset(dataset_v1_1_new, preset_v1_1)
# Fine-tune model dengan data gabungan
model_v1_1 = finetune_model(model_v1, combined_dataset)
Manfaat untuk Kebolehulangan ML
- Konsistensi lintas versi: "CUST_2024_5731" selalu memetakan ke "[CUSTOMER_abc123]"
- Pembelajaran yang tahan: Model belajar pola berkaitan untuk ID yang sama di semua dataset
- Audit: Preset boleh disimpan dan dicapai untuk menunjukkan bagaimana data telah dianonimkan
- Skala: Tambahkan data baru tanpa melatih semula model — gunakan preset yang ada
Pertimbangan Keamanan
Caveat: Preset hash bukan penganoniman sejati GDPR. Hash dapat diserang dengan:
- Serangan kamus: Jika penyerang mengetahui ID tersebut (contohnya "CUST_2024_5731"), mereka boleh hash dan cocokkan dengan dataset
- Kecil ruang PII: Jika hanya 100,000 pelanggan unik wujud, ruang pencarian adalah kecil
Untuk perlindungan maksimum:
- Gunakan salt yang kuat (bukan "ml_training_v1")
- Simpan preset dalam storan terenkripsi berasingan
- Jangan letak preset yang sama di GitHub atau log terpisah
- Gunakan HMAC, bukan SHA sederhana:
hmac.new(b"secret_key", entity.encode()).hexdigest()
Kesimpulan: Preset hash deterministik memastikan penganoniman konsisten di seluruh versi dataset latihan ML, memungkinkan model untuk belajar pola berkaitan untuk ID yang sama.