Вопрос или проблема
У меня есть две базы данных с около 60,000 примеров каждая. Обе имеют одинаковые характеристики (одинаковые названия столбцов), которые представляют собой определенные вещи с текстом или категориями (превращенными в числа). Каждый пример в базе данных предполагается, что относится к разным конкретным объектам. Но есть несколько объектов, которые представлены в обеих базах данных, но с несколько разными значениями в столбце с одинаковым названием (например, разные открытые описания или классифицированные как другая категория).
Цель состоит в том, чтобы обучить модель машинного обучения, которая распознает, когда два «описания» относятся к одному и тому же объекту.
Мы вручную выделили несколько тысяч «дублированных» случаев, которые мы соответствующим образом пометили. Эта метка является целевой переменной для обучения. Однако примеры контролируемой классификации, которые я видел, работают с одним датафреймом и/или предсказывают что-то о одной строке признаков.
Как это работает, когда мы не пытаемся предсказать, что представляет собой образец, а взаимоотношение между двумя образцами (в частности, сейчас, если они относятся к одному и тому же объекту или нет)?
Я даже не знаю, как подать два датафрейма в scikit-learn или даже auto scikit-learn (или аналогичные), чтобы он мог справиться с задачей распознавания, представляет ли один образец то же самое, что и другой образец в другом датафрейме… Может быть, мне стоит объединить их, чтобы получился один датафрейм, но тогда ему придется сравнивать все с остальными… Или это не имеет большого значения?
Есть ли идеи или подсказки о том, как здесь двигаться дальше или как лучше сформулировать проблему?
Если я правильно понимаю, это похоже на проблему обработки естественного языка. Для каждой строки и каждого столбца вы будете вычислять сходство между записями в разных датафреймах, например:
Ваши два датафрейма:
Строка182, СтолбецA, Датафрейм1 = XYZ_ABC_123
Строка182, СтолбецA, Датафрейм2 = XYZ_ABC_152
Новый датафрейм:
Строка182, СтолбецA = 0.8
Повторите для всех строк и столбцов. Затем вы установите некоторый порог на приемлемой степени сходства / точности вашей матрицы метрик сходства. Чтобы выделить самые серьезные перекрестные связи.
Вы можете взглянуть на https://www.nltk.org/, но в зависимости от данных вы также можете сделать чисто питоновское решение, например, 80% совпадение между строковыми записями.
Я предполагаю, как выглядят ваши данные, поэтому примеры могут помочь.
Если вы хотите использовать контролируемый подход, вы можете рассматривать это как задачу бинарной классификации, где входными данными будут две строки которые были объединены в одну, а целевым выходом будет метка, указывающая, являются ли они дубликатами или нет.
Вы можете построить этот набор данных:
- Используя строки, которые вы вручную идентифицировали как дубликаты, как положительный класс. Вы упомянули, что у вас есть “вручную распознанные несколько тысяч дублированных случаев, которые мы соответствующим образом пометили”, так что я предполагаю, что у вас есть способ находить пары строк, которые являются дубликатами.
- Используя строки, которые вы знаете, что не являются дубликатами, как отрицательный класс. Вы можете идентифицировать пары строк, которые не являются дубликатами, например, случайным образом выбирая строку из одной группы и строку из другой группы.
Затем вы можете вернуться к обучению бинарного классификатора.
Если вы хотите использовать неконтролируемый подход, вам потребуется функция сходства, которую вы можете использовать для сравнения двух строк (например, их евклидово расстояние). Затем, если две строки имеют сходство выше определенного порога, их можно отметить как возможные дубликаты.
Ответ или решение
Для решения задачи предсказания того, относятся ли две выборки к одному и тому же объекту, существует несколько подходов. Давайте рассмотрим, как можно организовать процесс как с использованием методов машинного обучения, так и без них.
Подход 1: Супервизированное обучение
-
Подготовка данных:
- Вы уже имеете аннотированные данные: выборки, которые были вручную обозначены как дубликаты. Эти данные необходимо использовать для создания обучающего набора данных.
- Создайте пары выборок из двух ваших баз данных. Каждая пара будет представлять собой одну запись из первой базы и одну запись из второй. Вы можете включить как положительные примеры (пары которые соответствуют дубликатам), так и отрицательные (пары, которые не являются дубликатами).
-
Создание обучающего набора:
- Для положительных примеров используйте уже аннотированные пары дубликатов.
- Для отрицательных примеров случайным образом выбирайте образцы из разных баз данных, которые знаете, что не являются дубликатами.
- В результате, у вас должна получиться таблица с такими колонками:
- Характеристики первой выборки (например,
ColumnA
,ColumnB
и т.д.) - Характеристики второй выборки
- Целевая переменная, указывающая, являются ли они дубликатами (1 — да, 0 — нет).
- Характеристики первой выборки (например,
-
Обучение модели:
-
Вы можете использовать популярные алгоритмы классификации, такие как логистическая регрессия, случайный лес или XGBoost. Например:
from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score # Загрузите и подготовьте ваши данные X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size=0.2, random_state=42) model = RandomForestClassifier() model.fit(X_train, y_train) predictions = model.predict(X_test) accuracy = accuracy_score(y_test, predictions) print(f"Точность модели: {accuracy}")
-
Подход 2: Ненаблюдаемое обучение (поиск сходства)
Если вы хотите использовать ненаблюдаемое обучение, вы можете рассмотреть использование функций сходства:
-
Определение функции сходства:
- Используйте метрики сходства, такие как косинусное расстояние, Евклидово расстояние или метрики строкового сходства, такие как Jaccard или Levenshtein.
-
Пример использования Жаккара для строк:
from sklearn.metrics import jaccard_score # Предположим, что у вас есть векторы для строк score = jaccard_score(str_vector1, str_vector2)
-
Пороговое значение:
- Установите порог для функции сходства. Если значение сходства превышает этот порог, то вы можете рассматривать пары как потенциальные дубликаты.
-
Классификация:
- Создайте и обрабатывайте пары выборок из двух наборов, вычисляя для каждой пары значение сходства. Флагируйте те, которые превышают установленный порог.
Заключение
Выбор подхода зависит от структуры ваших данных и доступных ресурсов. Супервизированный подход требует наличия аннотированных данных, однако он может быть более точным после обучения. Ненаблюдаемое обучение требует создания функции сходства, но, как правило, менее точно. Выбор за вами, исходя из вашего случая.
Не забудьте провести тщательную валидацию модели или оценку порогового значения, чтобы убедиться, что ваш метод дает обоснованные результаты.