pip install - r requirements . txt export KAGGLE_USERNAME= " your_kaggle_username "
export KAGGLE_KEY= " your_api_key " cd kaggle_dataset
kaggle datasets download -d lizhecheng/pii-data-detection-dataset
unzip pii-data-detection-dataset.zip
kaggle datasets download -d lizhecheng/piidd-reliable-cv
unzip piidd-reliable-cv.zip cd kaggle_dataset
cd competition
kaggle competitions download -c pii-detection-removal-from-educational-data
unzip pii-detection-removal-from-educational-data.zip cd kaggle_notebook
run train-0.3-validation.ipynb cd models
wandb sweep --project PII config.yamlwandb agent xxx/PII/xxxxxxxx cd kfold
wandb login --relogin
(input your wandb api key)
wandb init -e (input your wandb username)
export KFOLD=0/1/2/3
wandb sweep --project PII hypertuning_kfold.yaml
wandb agent xxx/PII/xxxxxxxx
Pertama -tama, terima kasih kepada Kaggle dan THE LEARNING AGENCY LAB yang telah menjadi tuan rumah kompetisi ini, dan terima kasih kepada semua orang di tim atas upaya mereka. Meskipun hasilnya tidak sempurna, kami masih belajar banyak, dan kami akan terus bergerak maju. Selamat untuk semua pemenang!
Berikut adalah GitHub Repo untuk kompetisi ini, di mana Anda dapat menemukan hampir semua kode: https://github.com/lizhecheng02/kaggle-pii_data_detection
AWP (Adversarial Weight Perturbation) Tingkatkan kekokohan model dengan menggunakan kelas AWP khusus dan tulis CustomTrainer sendiri. Ini adalah metode yang sering digunakan tim kami dalam kompetisi NLP, dan memang memiliki beberapa hasil yang baik. (Kode yang sesuai dapat ditemukan di direktori GitHub Under models saya).
Wandb Sweep Dengan alat ini, kami dapat mencoba berbagai kombinasi hyperparameters yang berbeda untuk memilih yang menghasilkan hasil penyesuaian terbaik. (Kode yang sesuai dapat ditemukan di direktori GitHub Under models saya).
Replace nn with | in all documentsDalam hal ini, kami melatih satu set model dengan validasi silang 4 kali lipat dan skor LB 0,977. Meskipun ada beberapa peningkatan pada LB, hasilnya menunjukkan tidak ada peningkatan pada PB.
n yang muncul di alamat, yang harus diberi label dengan label I.Dr. diprediksi dengan label B. ( Tidak ada peningkatan yang signifikan ) def pp(new_pred_df):
df = new_pred_df.copy()
i = 0
while i < len(df):
st = i
doc = df.loc[st, "document"]
tok = df.loc[st, "token"]
pred_tok = df.loc[st, "label"]
if pred_tok == 'O':
i += 1
continue
lab = pred_tok.split('-')[1]
cur_doc = doc
cur_lab = lab
last_tok = tok
cur_tok = last_tok
while i < len(df) and cur_doc == doc and cur_lab == lab and last_tok == cur_tok:
last_tok = cur_tok + 1
i += 1
cur_doc = df.loc[i, "document"]
cur_tok = df.loc[i, "token"]
if i >= len(df) or df.loc[i, "label"] == 'O':
break
cur_lab = df.loc[i, "label"].split('-')[1]
if st - 2 >= 0 and df.loc[st - 2, "document"] == df.loc[st, "document"] and df.loc[st - 1, "token_str"] == 'n' and df.loc[st - 2, "label"] != 'O' and df.loc[st - 2, "label"].split('-')[1] == lab:
df.loc[st - 1, "label"] = 'I-' + lab
df.loc[st - 1, "score"] = 1
for j in range(st, i):
if df.loc[j, "label"] != 'I-' + lab:
df.loc[j, "score"] = 1
df.loc[j, "label"] = 'I-' + lab
continue
for j in range(st, i):
if j == st:
if df.loc[j, "label"] != 'B-' + lab:
df.loc[j, "score"] = 1
df.loc[j, "label"] = 'B-' + lab
else:
if df.loc[j, "label"] != 'I-' + lab:
df.loc[j, "score"] = 1
df.loc[j, "label"] = 'I-' + lab
if lab == 'NAME_STUDENT' and any(len(item) == 2 and item[0].isupper() and item[1] == "." for item in df.loc[st:i-1, 'token_str']):
for j in range(st, i):
df.loc[j, "score"] = 0
df.loc[j, "label"] = 'O'
return df
Average EnsembleGunakan metode mengambil rata -rata probabilitas untuk mendapatkan hasil akhir. Karena ingat lebih penting daripada presisi dalam kompetisi ini, saya menetapkan ambang batas menjadi 0,0 untuk menghindari kehilangan penarikan yang benar potensial.
for text_id in final_token_pred:
for word_idx in final_token_pred[text_id]:
pred = final_token_pred[text_id][word_idx].argmax(-1)
pred_without_O = final_token_pred[text_id][word_idx][:12].argmax(-1)
if final_token_pred[text_id][word_idx][12] < 0.0:
final_pred = pred_without_O
tmp_score = final_token_pred[text_id][word_idx][final_pred]
else:
final_pred = pred
tmp_score = final_token_pred[text_id][word_idx][final_pred]
Vote EnsembleDalam pengajuan terakhir kami, kami membuat 7 model, dan kami menerima label sebagai prediksi yang benar jika setidaknya dua model memperkirakan label yang sama.
for tmp_pred in single_pred:
for text_id in tmp_pred:
max_id = 0
for word_idx in tmp_pred[text_id]:
max_id = tmp_pred[text_id][word_idx].argmax(-1)
tmp_pred[text_id][word_idx] = np.zeros(tmp_pred[text_id][word_idx].shape)
tmp_pred[text_id][word_idx][max_id] = 1.0
for word_idx in tmp_pred[text_id]:
final_token_pred[text_id][word_idx] += tmp_pred[text_id][word_idx]
for text_id in final_token_pred:
for word_idx in final_token_pred[text_id]:
pred = final_token_pred[text_id][word_idx].argmax(-1)
pred_without_O = final_token_pred[text_id][word_idx][:12].argmax(-1)
if final_token_pred[text_id][word_idx][pred] >= 2:
final_pred = pred
tmp_score = final_token_pred[text_id][word_idx][final_pred]
else:
final_pred = 12
tmp_score = final_token_pred[text_id][word_idx][final_pred]
Two GPU Inference Menggunakan T4*2 GPU menggandakan kecepatan inferensi dibandingkan dengan GPU tunggal. Untuk membuat model 8, maksimum max_length adalah 896 ; Jika Ensemble 7 model, max_length dapat diatur ke 1024 , yang merupakan nilai yang lebih ideal. (Kode yang sesuai dapat ditemukan di GitHub saya di bawah Direktori submissions ).
Convert Non-English Characters (buat LB lebih rendah) def replace_non_english_chars(text):
mapping = {
'à': 'a', 'á': 'a', 'â': 'a', 'ã': 'a', 'ä': 'a', 'å': 'a',
'è': 'e', 'é': 'e', 'ê': 'e', 'ë': 'e',
'ì': 'i', 'í': 'i', 'î': 'i', 'ï': 'i',
'ò': 'o', 'ó': 'o', 'ô': 'o', 'õ': 'o', 'ö': 'o', 'ø': 'o',
'ù': 'u', 'ú': 'u', 'û': 'u', 'ü': 'u',
'ÿ': 'y',
'ç': 'c',
'ñ': 'n',
'ß': 'ss'
}
result = []
for char in text:
if char not in string.ascii_letters:
replacement = mapping.get(char.lower())
if replacement:
result.append(replacement)
else:
result.append(char)
else:
result.append(char)
return ''.join(result)
Kami telah beranotasi sekitar 10.000 nama yang tidak memiliki siswa dari dataset menggunakan GPT-4 API, karena nama siswa adalah jenis label yang paling umum. Kami berharap dapat meningkatkan akurasi model dalam memprediksi jenis label ini.
Saya mencoba menyempurnakan model Mistral-7b pada label yang berhubungan dengan nama, tetapi skor pada LB menunjukkan penurunan yang signifikan.
Oleh karena itu, saya mencoba menggunakan Mistral-7b untuk pembelajaran beberapa tembakan untuk menentukan apakah konten yang diprediksi sebagai name student sebenarnya adalah nama. (Di sini kita tidak dapat mengharapkan model untuk membedakan apakah itu nama siswa atau tidak, tetapi hanya untuk mengecualikan prediksi yang jelas bukan nama).
Prompt ini ada di bawah ini, melakukan ini menghasilkan sedikit peningkatan pada LB, kurang dari 0,001.
f"I'll give you a name, and you need to tell me if it's a normal person name, cited name or even not a name. Do not consider other factors.nExample:n- Is Matt Johnson a normal person name? Answer: Yesn- Is Johnson. T a normal person name? Answer: No, this is likely a cited name.n- Is Andsgjdu a normal person name? Answer: No, it is even not a name.nNow the question is:n- Is {name} a normal person name? Answer:"
| Model | Lb | Pb | Memilih |
|---|---|---|---|
Seven single models that exceed 0.974 on the LB | 0.978 | 0.964 | Ya |
Two 4-fold cross-validation models, with LB scores of 0.977 and 0.974 respectively. | 0.978 | 0.961 | Ya |
Three single models with ensemble LB score of 0.979, plus one set of 4-fold cross-validation models with an LB score of 0.977. (Use vote ensemble) | 0.979 | 0.963 | Ya |
Two single models ensemble | 0.972 | 0.967 | TIDAK |
Four single models ensemble | 0.979 | 0.967 | TIDAK |
LB 0,978 PB 0,964
LB 0,978 PB 0,961
LB 0,979 PB 0,963
Berkat rekan satu tim saya, kami telah saling kenal melalui Kaggle selama lebih dari setengah tahun. Saya merasa beruntung bisa belajar dan maju bersama dengan Anda semua. @rdxsun, @bianshengtao, @xuanmingzhang777, @tononyobertson.
Melampaui itu sama salahnya dengan tidak cukup jauh. — - Confucius