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
Прежде всего, спасибо Kaggle и THE LEARNING AGENCY LAB за проведение этого конкурса, и благодаря всем в команде за их усилия. Хотя результат не был идеальным, мы все еще многому научились, и мы будем продолжать двигаться вперед. Поздравляем всех победителей!
Вот GitHub Repo для этого соревнований, где вы можете найти почти все коды: https://github.com/liachecheng02/kaggle-pii_data_detection
AWP (Adversarial Weight Perturbation) Повысьте надежность модели, используя пользовательский класс AWP и напишите собственный CustomTrainer . Это метод, которую наша команда часто использует в соревнованиях NLP, и он имеет некоторые хорошие результаты. (Соответствующий код можно найти в моем каталоге GitHub в соответствии с каталогом models ).
Wandb Sweep С помощью этого инструмента мы можем попробовать различные комбинации различных гиперпараметров, чтобы выбрать те, которые дают наилучшие результаты тонкой настройки. (Соответствующий код можно найти в моем каталоге GitHub в соответствии с каталогом models ).
Replace nn with | in all documentsВ этом случае мы обучили набор моделей с 4-кратной перекрестной проверкой, так и с баллов LB 0,977. Хотя на LB произошло некоторое улучшение, результаты не показали улучшения на PB.
n появляющийся в адресах, которые должны быть помечены меткой I.Dr. прогнозируются с меткой B. ( Нет значительного улучшения ) 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 EnsembleИспользуйте метод принятия среднего значения вероятностей, чтобы получить конечный результат. Поскольку отзыв более важен, чем точность в этом конкуренте, я установил порог на 0,0, чтобы избежать отсутствия потенциального правильного отзыва.
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 EnsembleВ нашем окончательном представлении мы ансамментировали 7 моделей, и мы приняли метку в качестве правильного прогноза, если по крайней мере две модели предсказали ту же этикетку.
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 Использование T4*2 графических процессоров удваивает скорость вывода по сравнению с одним графическим процессором. В ансамбле 8 моделей максимальный max_length составляет 896 ; Если ансамбль 7 моделей, MAX_LENGHT может быть установлен на 1024 , что является более идеальным значением. (Соответствующий код можно найти в моем каталоге GitHub в разделе submissions »).
Convert Non-English Characters (сделать 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)
Мы аннотировали приблизительно 10 000 не ученических имен из набора данных, используя API GPT-4 , поскольку имена студентов являются наиболее распространенным типом метки. Мы надеемся повысить точность модели в прогнозировании этого конкретного типа метки.
Я попробовал точную настройку модели Mistral-7b на меток, связанных с именами, но оценки на LB показали значительное снижение.
Поэтому я попытался использовать Mistral-7b для нескольких выстрелов, чтобы определить, предсказано ли контент, который, name student на самом деле является именем. (Здесь мы не можем ожидать, что модель будет различать, является ли это именем студента или нет, но только для того, чтобы исключить прогнозы, которые явно не являются именами).
Подсказка находится в приведенной ниже, что принесло это очень небольшое улучшение на LB, менее 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:"
| Модели | ФУНТ | Пб | Выбирать |
|---|---|---|---|
Seven single models that exceed 0.974 on the LB | 0.978 | 0.964 | Да |
Two 4-fold cross-validation models, with LB scores of 0.977 and 0.974 respectively. | 0.978 | 0.961 | Да |
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 | Да |
Two single models ensemble | 0.972 | 0.967 | Нет |
Four single models ensemble | 0.979 | 0.967 | Нет |
Фунт 0,978 PB 0,964
Фунт 0,978 PB 0,961
Фунт 0,979 PB 0,963
Благодаря моим товарищам по команде, мы знали друг друга через Kaggle более полугода. Мне повезло, что я могу учиться и прогрессировать вместе со всеми вами. @rdxsun, @bianshengtao, @xuanmingzhang777, @tonyarobertson.
Выходить за рамки так же неправильно, как и недостаточно далеко. --Конфуций