pavel_777

BERT with lightautoml

Oct 24th, 2021 (edited)
191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.24 KB | None | 0 0
  1. # Решение задачи NLP с помощью lightautoml (включить GPU!!!)
  2. # Сейчас настроен самый "тяжелый" вариант, когда дообучается BERT, можно настроить более быстрые и простые варианты. См.док.:
  3. # https://github.com/sberbank-ai-lab/LightAutoML/blob/master/lightautoml/automl/presets/text_config.yml
  4. # https://github.com/sberbank-ai-lab/LightAutoML
  5.  
  6. import pandas as pd
  7. import numpy as np
  8.  
  9. from lightautoml.automl.presets.text_presets import TabularNLPAutoML
  10. from lightautoml.tasks import Task
  11.  
  12. from sklearn.model_selection import train_test_split
  13. from sklearn.metrics import f1_score
  14.  
  15. bert_models = {
  16.     'en': 'bert-base-cased',
  17.     'ru': 'DeepPavlov/rubert-base-cased-conversational',
  18.     'multi': 'bert-base-multilingual-cased'
  19. }
  20.  
  21. class params:
  22.     random_state = 12345
  23.     timeout = 30_000 # сколько секунд на выполнение алгоритма
  24.     col_target = 'toxic'
  25.     cols_text = ['text'] # колонки с текстом, которые надо обрабатывать
  26.     n_threads = 4
  27.     test_size = 0.2
  28.     epochs = 3 # кол-во эпох обучения (но вроде важнее timeout)
  29.     batch_size = 24 # если позволяет память GPU, то увеличить до 32 и выше. Что ускорит обучение
  30.     cv = 3 # кол-во folds для кросс-валидации (лучше 5, но будет дольше обучаться)
  31.     lang = 'en'
  32.    
  33. df = pd.read_csv('toxic_comments.csv')
  34. print(df.shape)
  35.  
  36. train, test = train_test_split(df,
  37.                                test_size=params.test_size,
  38.                                random_state=params.random_state)
  39. roles = {
  40.     'target': params.col_target,
  41.     'text': params.cols_text,
  42. }
  43.  
  44. task = Task('binary')
  45.  
  46. automl = TabularNLPAutoML(
  47.     task = task,
  48.     timeout = params.timeout,
  49.     cpu_limit = params.n_threads,
  50.     general_params = {'nested_cv': False, # не срабатывает, всё равно исп.кросс-валидация
  51.                       'use_algos': [['nn']]},
  52.     text_params = {'lang': params.lang, 'bert_model': bert_models[params.lang]},
  53.     nn_params = {'opt_params': { 'lr': 1e-5},
  54.                  'max_length': 150, 'bs': params.batch_size,
  55.                  'epoch': params.epochs # не срабатывает для обучения Bert. Видимо, только для посл.сети.
  56.                 },
  57.     nested_cv_params = {'cv': params.cv}, # не срабатывает 1, всё равно исп. кросс-валидация
  58. )
  59.  
  60. oof_pred = automl.fit_predict(train, roles=roles)
  61. test_pred = automl.predict(test)
  62.  
  63. treshold = 0.56 # порог для предсказания класса 1 (нужно подбирать)
  64. f1_val = f1_score(train[params.col_target].values,
  65.                   np.where(oof_pred.data[:, 0] > treshold, 1, 0))
  66. f1_test = f1_score(test[params.col_target].values,
  67.                    np.where(test_pred.data[:, 0] > treshold, 1, 0))
  68. print(f'VAL score: {f1_val}')
  69. print(f'TEST score: {f1_test}')
  70.  
  71. # F1=0.844 - TEST получается с параметрами:timeout = 30_000; epochs = 3; treshold = 0.56
Add Comment
Please, Sign In to add comment