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
Vielen Dank an Kaggle und THE LEARNING AGENCY LAB für die Gastgeber dieses Wettbewerbs und bei allen im Team für ihre Bemühungen. Obwohl das Ergebnis nicht perfekt war, haben wir immer noch viel gelernt und werden weiter vorwärts gehen. Herzlichen Glückwunsch an alle Gewinner!
Hier ist das GitHub Repo für diesen Wettbewerb, in dem Sie fast alle Codes finden: https://github.com/lizhecheng02/kaggle-pii_data_detektion
AWP (Adversarial Weight Perturbation) Verbessern Sie die Robustheit des Modells, indem Sie eine benutzerdefinierte AWP -Klasse verwenden und eigenes CustomTrainer schreiben. Dies ist eine Methode, die unser Team in NLP -Wettbewerben häufig verwendet, und es hat einige gute Ergebnisse. (Der entsprechende Code befindet sich in meinem GitHub im Verzeichnis models ).
Wandb Sweep Mit diesem Tool können wir verschiedene Kombinationen verschiedener Hyperparameter ausprobieren, um diejenigen auszuwählen, die die besten Feinabstimmungsergebnisse erzielen. (Der entsprechende Code befindet sich in meinem GitHub im Verzeichnis models ).
Replace nn with | in all documentsIn diesem Fall haben wir eine Reihe von Modellen mit sowohl 4-fach Kreuzvalidation als auch LB-Werten von 0,977 ausgebildet. Obwohl die LB eine gewisse Verbesserung gab, zeigten die Ergebnisse keine Verbesserung der PB.
n in Adressen angezeigt wird, die mit dem I -Etikett gekennzeichnet werden sollten.Dr. mit dem B -Etikett vorhergesagt werden. ( Keine signifikante Verbesserung ) 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 EnsembleVerwenden Sie die Methode zur Einnahme des Durchschnitts der Wahrscheinlichkeiten, um das Endergebnis zu erhalten. Da der Rückruf in diesem Wettbewerb wichtiger als Präzision ist, habe ich den Schwellenwert auf 0,0 festgelegt, um zu vermeiden, dass ein potenzieller korrekter Rückruf fehlt.
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 EnsembleIn unserer endgültigen Einreichung haben wir 7 Modelle eingelegt und ein Etikett als korrekte Vorhersage akzeptiert, wenn mindestens zwei der Modelle dieselbe Etikette vorhergesagt haben.
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 Die Verwendung von T4*2 GPUs verdoppelt die Inferenzgeschwindigkeit im Vergleich zu einer einzelnen GPU. Zum Ensemble 8 -Modelle beträgt die maximale Max_Length 896 ; Wenn Ensemble 7 -Modelle, kann die max_length auf 1024 eingestellt werden, was ein idealere Wert ist. (Der entsprechende Code kann in meinem GitHub im submissions gefunden werden).
Convert Non-English Characters (machen Sie den LB niedriger) 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)
Mit der GPT-4 API haben wir ungefähr 10.000 nicht-studierende Namen aus dem Datensatz kommentiert, da die Schülernamen der häufigste Etikettentyp sind. Wir hoffen, die Genauigkeit des Modells bei der Vorhersage dieser bestimmten Art von Etikett zu verbessern.
Ich habe versucht, das Mistral-7b -Modell auf Namensbezeichnungen zu federn, aber die Punktzahlen auf der LB zeigten eine signifikante Abnahme.
Daher habe ich versucht, Mistral-7b für wenige Schüsse zu verwenden, um festzustellen, ob der Inhalt, der voraussichtlich der Label name student tatsächlich ein Name ist. (Hier können wir nicht erwarten, dass das Modell unterscheidet, ob es sich um den Namen eines Schülers handelt oder nicht, sondern nur Vorhersagen, die eindeutig keine Namen sind.)
Die Eingabeaufforderung befindet sich im Folgenden und führte zu einer sehr geringen Verbesserung der LB von weniger als 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:"
| Modelle | Lb | Pb | Wählen |
|---|---|---|---|
Seven single models that exceed 0.974 on the LB | 0.978 | 0.964 | Ja |
Two 4-fold cross-validation models, with LB scores of 0.977 and 0.974 respectively. | 0.978 | 0.961 | Ja |
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 | Ja |
Two single models ensemble | 0.972 | 0.967 | NEIN |
Four single models ensemble | 0.979 | 0.967 | NEIN |
LB 0,978 PB 0,964
LB 0,978 PB 0,961
LB 0,979 PB 0,963
Dank meiner Teamkollegen kennen wir uns seit über einem halben Jahr durch Kaggle. Ich fühle mich glücklich, zusammen mit euch allen lernen und voranbringen zu können. @rdxsun, @bianshengtao, @xuanmingzhang777, @tonyarobertson.
Über das hinauszugehen ist genauso falsch wie nicht weit genug zu gehen. --Konfuzius