Как вывести непрерывную косинусо-тета-оценку на дискретный (0/1) вывод? - PullRequest
0 голосов
/ 05 июня 2019

Я реализовал функцию косинус-тета, которая вычисляет соотношение между двумя статьями. Если две статьи очень похожи, то слова должны содержать довольно много совпадений. Однако косинус-тета-оценка 0,54 не означает «связанный» или «не связанный». Я должен получить окончательный ответ, который равен 0 для «не связан» или 1 для «связан».

Я знаю, что существуют сигмоидные и софтмакс-функции, но я должен найти оптимальные параметры для таких функций, и я не знаю, являются ли эти функции удовлетворительными решениями. Я думал, что у меня есть тэта-оценка косинуса, я могу вычислить процент совпадений между двумя предложениями (например, количество перекрывающихся слов, деленное на количество слов в статье) и, возможно, некоторые более интересные вещи. Затем, используя данные, я мог бы написать функцию (какой тип функции я не знаю и является частью вопроса!), После чего я могу минимизировать ошибку с помощью библиотеки SciPy. Это означает, что я должен провести какое-то контролируемое обучение, и я хочу пометить пары статей метками (0/1) для обучения сети. Стоит ли это усилий?

        # Count words of two strings.
        v1, v2 = self.word_count(s1), self.word_count(s2)
        # Calculate the intersection of the words in both strings.
        v3 = set(v1.keys()) & set(v2.keys())

        # Calculate some sort of ratio between the overlap and the
        # article length (since 1 overlapping word on 2 words is more important
        # then 4 overlapping words on articles of 492 words).
        p = min(len(v1), len(v2)) / len(v3)

        numerator = sum([v1[w] * v2[w] for w in v3])

        w1 = sum([v1[w]**2 for w in v1.keys()])
        w2 = sum([v2[w]**2 for w in v2.keys()])

        denominator = math.sqrt(w1) * math.sqrt(w2)

        # Calculate the cosine similarity
        if not denominator:
            return 0.0
        else:
            return (float(numerator) / denominator)

Как уже говорилось, я хотел бы использовать такие переменные, как p и косинус-тета, чтобы получить точную дискретную двоичную метку: 0 или 1.

1 Ответ

2 голосов
/ 05 июня 2019

Как уже говорилось, я хотел бы использовать такие переменные, как p и косинус-тета, чтобы получить точную дискретную двоичную метку: 0 или 1.

Вот онодействительно сводится к тому, что вы подразумеваете под точностью.Вам решать, как перекрытие влияет на то, совпадают ли две строки, если у вас нет маркированного набора данных.Если у вас есть помеченный набор данных (т. Е. Набор пар строк вместе с меткой 0 или 1), то вы можете обучить алгоритм двоичной классификации и попытаться оптимизировать на его основе.Я бы порекомендовал что-то вроде нейронной сети или SVM из-за потенциально многомерного, категоричного характера вашей проблемы.

Однако даже оптимизация является субъективной мерой.Например, теоретически давайте представим, что у вас есть модель, которая из 100 выборок предсказывает только 1 ответ (давая 99 неизвестных).Технически, если этот один ответ правильный, то это модель со 100% точностью, но с очень низкой отзыв .Обычно в машинном обучении вы найдете компромисс между отзывом и точностью.

Некоторым людям нравится выбирать определенные метрики, которые объединяют два (наиболее известным из которых является F1 балл ), но, честно говоря, это зависит от приложения.Если у меня маркетинговая кампания с фиксированным бюджетом, то я больше беспокоюсь о точности - я бы хотел ориентироваться только на потребителей, которые могут купить мой продукт.Однако, если мы ищем тест на смертельную болезнь или маркеры мошенничества в банке, то этот тест может быть точным только в 10% случаев - если его отзыв о реальных положительных результатах где-то близок к 100%.

Наконец, если у вас нет помеченных данных, тогда вам лучше всего определить какое-то предельное значение, которое, по вашему мнению, указывает на хорошее совпадение.Тогда это будет более аналогично проблеме бинарной кластеризации, и вы можете использовать более абстрактную меру, например расстояние до центроида, чтобы проверить, к какому кластеру («связанному» или «не связанному» кластеру) принадлежит точка.Однако обратите внимание, что здесь ваши функции чувствуются так, что их было бы невероятно сложно определить.

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