Вывод регрессии SpaCy-трансформаторов
Я хотел бы получить результат регрессии вместо классификации. Например: вместо n классов мне нужно выходное значение с плавающей запятой от 0 до 1.
Вот минималистичный пример со страницы пакета на github:
import spacy
from spacy.util import minibatch
import random
import torch
is_using_gpu = spacy.prefer_gpu()
if is_using_gpu:
torch.set_default_tensor_type("torch.cuda.FloatTensor")
nlp = spacy.load("en_trf_bertbaseuncased_lg")
print(nlp.pipe_names) # ["sentencizer", "trf_wordpiecer", "trf_tok2vec"]
textcat = nlp.create_pipe("trf_textcat", config={"exclusive_classes": True})
for label in ("POSITIVE", "NEGATIVE"):
textcat.add_label(label)
nlp.add_pipe(textcat)
optimizer = nlp.resume_training()
for i in range(10):
random.shuffle(TRAIN_DATA)
losses = {}
for batch in minibatch(TRAIN_DATA, size=8):
texts, cats = zip(*batch)
nlp.update(texts, cats, sgd=optimizer, losses=losses)
print(i, losses)
nlp.to_disk("/bert-textcat")
Есть ли простой способ сделать trf_textcat
работать регрессором? Или это будет означать расширение библиотеки?
1 ответ
Я нашел обходной путь: извлеките векторные представления из конвейера nlp как:
vector_repres = nlp('Test text').vector
Сделав это для всех текстовых записей, вы получите представление текстов фиксированного размера. Предполагая, что у вас есть непрерывные выходные значения, не стесняйтесь использовать любой оценщик, включая нейронную сеть с линейным выходом.
Обратите внимание, что векторное представление представляет собой среднее значение векторных встраиваний всех слов в тексте - это может быть неоптимальным решением для вашего случая.