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
Tout d'abord, merci à Kaggle and THE LEARNING AGENCY LAB pour avoir organisé ce concours, et merci à tous les membres de l'équipe pour leurs efforts. Bien que le résultat ne soit pas parfait, nous avons encore beaucoup appris et nous continuerons à avancer. Félicitations à tous les gagnants!
Voici le GitHub Repo pour ce concours, où vous pouvez trouver presque tous les codes: https://github.com/lizhecheng02/kaggle-pii_data_dection
AWP (Adversarial Weight Perturbation) Améliorez la robustesse du modèle en utilisant une classe AWP personnalisée et écrivez propre CustomTrainer . Il s'agit d'une méthode que notre équipe utilise souvent dans les compétitions PNL, et elle a de bons résultats. (Le code correspondant peut être trouvé sur mon répertoire GitHub sous models ).
Wandb Sweep Avec cet outil, nous pouvons essayer diverses combinaisons de différents hyperparamètres pour sélectionner celles qui produisent les meilleurs résultats fins. (Le code correspondant peut être trouvé sur mon répertoire GitHub sous models ).
Replace nn with | in all documentsDans ce cas, nous avons formé un ensemble de modèles avec une validation croisée 4 fois et des scores LB de 0,977. Bien qu'il y ait eu une certaine amélioration par rapport au LB, les résultats n'ont montré aucune amélioration par rapport au PB.
n apparaissant dans les adresses, qui doivent être étiquetées avec l'étiquette I.Dr. sont prédits avec l'étiquette B. ( Pas d'amélioration significative ) 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 EnsembleUtilisez la méthode pour prendre la moyenne des probabilités pour obtenir le résultat final. Étant donné que le rappel est plus important que la précision dans ce concours, j'ai fixé le seuil à 0,0 afin d'éviter de manquer tout rappel correct potentiel.
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 EnsembleDans notre soumission finale, nous avons ensemble 7 modèles et nous avons accepté une étiquette comme la bonne prédiction si au moins deux des modèles prédisaient cette même étiquette.
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 L'utilisation de GPU T4 * 2 double la vitesse d'inférence par rapport à un seul GPU. Pour ensemble 8 modèles, le maximum max_length est 896 ; Si les modèles Ensemble 7, le max_length peut être défini sur 1024 , ce qui est une valeur plus idéale. (Le code correspondant peut être trouvé sur mon GitHub sous répertoire submissions ).
Convert Non-English Characters (rédiger le LB) 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)
Nous avons annoté environ 10 000 noms non étudiants de l'ensemble de données à l'aide de l'API GPT-4 , car les noms d'étudiants sont le type d'étiquette le plus courant. Nous espérons améliorer la précision du modèle pour prédire ce type particulier d'étiquette.
J'ai essayé de régler bien le modèle Mistral-7b sur les étiquettes liées au nom, mais les scores sur la LB ont montré une diminution significative.
Par conséquent, j'ai essayé d'utiliser Mistral-7b pour l'apprentissage à quelques coups pour déterminer si le contenu prédit être le name student est en fait un nom. (Ici, nous ne pouvons pas nous attendre à ce que le modèle distingue le nom d'un étudiant ou non, mais seulement pour exclure les prédictions qui ne sont clairement pas des noms).
L'invite est dans ce qui précède, ce qui a produit une très légère amélioration par rapport au LB, moins de 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:"
| Modèles | KG | PB | Choisir |
|---|---|---|---|
Seven single models that exceed 0.974 on the LB | 0.978 | 0.964 | Oui |
Two 4-fold cross-validation models, with LB scores of 0.977 and 0.974 respectively. | 0.978 | 0.961 | Oui |
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 | Oui |
Two single models ensemble | 0.972 | 0.967 | Non |
Four single models ensemble | 0.979 | 0.967 | Non |
Lb 0,978 PB 0,964
Lb 0,978 PB 0,961
Lb 0,979 Pb 0,963
Grâce à mes coéquipiers, nous nous connaissons par Kaggle depuis plus d'un demi-an. J'ai la chance de pouvoir apprendre et progresser avec vous tous. @rdxsun, @bianshengtao, @ xuanmingzhang777, @tonyarobertson.
Aller au-delà est tout aussi mal que de ne pas aller assez loin. — - Conficius