Не могу train_test_split с test_size <0,32 - PullRequest
0 голосов
/ 27 января 2020

Я довольно новичок в python и гораздо больше в машинном обучении. В настоящее время я работаю со spacy над Pycharm и хочу обучить и протестировать пустую модель с определенным набором данных Проблема в том, что по какой-то причине я не могу понять, что я не могу тренировать train_test_split с test_size <0.32, поскольку он будет отображать ноль для всех результатов и возвращает пустой список для <code>ents_per_type, как показано в ссылке ниже, когда используется TESTING_DATA оценить модель с помощью scorer.score:

https://prnt.sc/qt9v4t

Хотя, если я разделю данные до значения test_size, равного 0,32 или больше, то получим нормальные результаты , Это не имеет никакого смысла для меня, так как я не могу понять, в чем разница с 0,32 до 0,31.

То, как я это делаю, выглядит так:

TOTAL_DATA = []

TOTAL_DATA = plac.call(main)

TRAIN_DATA, TESTING_DATA = train_test_split(TOTAL_DATA, test_size=0.3, random_state=42)

Я искал для какого-то ответа я напечатал TRAIN_DATA и TESTING_DATA, и они оба кажутся равными, но у одного больше информации, чем у другого. Из-за этого я был уверен, что внутри класса Scorer есть что-то более конкретное, метод scorer.score, который будет давать мне такие результаты, поэтому я начал печатать случайные вещи, чтобы увидеть, где они не проходили, и кажется, что в этой части Метод оценки:

if "-" not in [token[-1] for token in gold.orig_annot]:
            print("YES")
            # Find all NER labels in gold and doc
            ent_labels = set([x[0] for x in gold_ents] + [k.label_ for k in doc.ents])
            # Set up all labels for per type scoring and prepare gold per type
            gold_per_ents = {ent_label: set() for ent_label in ent_labels}
            for ent_label in ent_labels:
                if ent_label not in self.ner_per_ents:
                    self.ner_per_ents[ent_label] = PRFScore()
                gold_per_ents[ent_label].update(
                    [x for x in gold_ents if x[0] == ent_label]
                )

Таким образом, при моем тестовом наборе, равном 0,32 или более, он проходит через него и печатает «ДА», но если я установлю значение test_size меньше 0,32, как, например, 0,30, оно не будет go через который, я думаю, приведет к пустым результатам.

Так что если кто-то из вас может знать, что происходит, я был бы очень признателен!

Заранее спасибо!

PS: Моя функция оценки:

def evaluate(self, ner_model, examples):
    scorer = Scorer()
    for input_, annot in examples:
        doc_gold_text = ner_model.make_doc(input_)
        gold = GoldParse(doc_gold_text, entities=annot)
        pred_value = ner_model(input_)
        scorer.score(pred_value, gold)
    return scorer.scores

И мои версии: Keras: 2.3.1 Tensorflow: 2.0.0 Numpy: 1.17.3 Spacy: 2.2.1 Sklearn: 0.0 Python: 3.7. 2

...