Использование машинного обучения для определения оптимального веса - PullRequest
1 голос
/ 11 октября 2019

Я хочу сравнить разные документы на основе сходства слов и сделать вывод о вероятности их родства. Чтобы оценить, связаны ли два документа, я смотрю на слова, которые включены в оба документа. Я собрал много данных, и для 500 наиболее часто используемых слов во всех документах (за исключением очевидных слов-заполнителей, таких как «the», которые исключены), я отнес их к одной из 5 категорий на основе моего суждения. Ниже приведены категории и то, как я ожидал бы, что они будут взвешены:

  • Уровень 1 - слова, которые с большой вероятностью определяют отношения - ожидайте, что они будут иметь высокий вес.
  • Уровень 2 -слова, которые могут быть релевантными или неуместными - ожидайте, что они будут менее взвешенными.
  • Уровень 3 - слова, которые вряд ли будут релевантными - ожидают, что они будут иметь очень низкий вес.
  • Уровень 4 -все слова, которые используются менее часто, чем первые 500 (не отнесены к уровню выше) - не уверены, как высоко это будет взвешено. Если это будет взвешено выше моделью машинного обучения, чем уровень 3, это будет означать, что мне нужно выделить больше слов для первых 3 уровней.
  • Уровень X - это числа, которые на самом деле указывают на связь. Если они не передаются, крайне маловероятно, что два документа будут связаны, поэтому можно ожидать, что они будут иметь очень высокий вес.

Я подумал, что если я положу эти данные и соответствующие ответы через модель тензорного потокау которого нет скрытых слоев, как на рисунке ниже, весовые коэффициенты должны в значительной степени соответствовать ожиданиям, указанным выше, и предоставлять некоторые числа, которые могут быть полезны при оценке документов друг против друга.

screenshot; tensorflow model

Вот упрощенная версия моего кода для создания и обучения модели:

import tensorflow as tf
from tensorflow import keras
import numpy as np
from tensorflow.keras.utils import plot_model
from tensorflow.keras.models import Model
from tensorflow.keras.layers import *

def main(data):

    model = keras.models.Sequential([
        keras.layers.Dense(1, input_shape=(5,), activation='relu')
    ])

    model.compile(optimizer='adam',
                  loss='mean_squared_error',
                  metrics=['accuracy'])

    train_profiles, train_answers = data 

    model.fit(train_profiles, train_answers, epochs=1)
    print(f"Current weights are: \n{model.get_weights()}")

    return model

if __name__ == '__main__':
    data = "I load a pickled data file from my computer - data is in correct format and throws no errors"
    main(data)

Проблема в том, что фактически производимые веса не имеют смысла и кажутся более случайными, чем что-либо, меняясь всякий раз, когда модельэто запустить. Точность часто довольно высока, колеблется от 82% до 92% с потерями от 0,093 до 0,1350. Я исправил дисбаланс классов, вызванный значительно большим количеством вхождений документов, которые не связаны друг с другом, путем дублирования каждого соответствующего документа на 5000, чтобы данные, поступающие в модель, соответствовали приблизительно 50/50 / нет. Я знаю, что это не самый эффективный способ исправить дисбаланс в классе, но время тренировок не является для меня большой проблемой.

Примечание: входной балл рассчитывается следующим образом: (количество раз, которое слово в этом уровне используется в обоих документах) / (общее количество слов в обоих документах)

Любые методы для получения разумных весовдля каждого уровня будет очень высоко ценится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...