Мой тренировочный набор содержит около 50 тысяч записей, с которыми я делаю начальное обучение. На еженедельной основе добавляется ~ 5 тыс. Записей; но такое же количество «исчезает» (так как это пользовательские данные, которые должны быть удалены через некоторое время).
Поэтому я использую онлайн-обучение, потому что у меня нет доступа к полному набору данных позднее. В настоящее время я использую SGDClassifier
метод, который работает, но моя большая проблема: появляются новые категории, и теперь я больше не могу использовать свою модель, поскольку их не было в исходной fit
.
Есть ли способ с SGDClassifier
какой-либо другой моделью? Глубокое обучение?
Неважно, нужно ли мне начинать с нуля СЕЙЧАС (т.е. использовать что-то другое SGDClassifier
), но мне нужно что-то, что позволяет онлайн-обучение с новыми лейблами.
Ответы:
Похоже, вы не хотите начинать переподготовку модели каждый раз, когда появляется новая категория ярлыков. Самый простой способ сохранить максимальную информацию о прошлых данных - это подготовить один классификатор для каждой категории.
Таким образом, вы можете продолжать обучать каждый классификатор постепенно («онлайн»),
SGDClassifier
не прибегая к переподготовке. Всякий раз, когда появляется новая категория, вы добавляете новый двоичный классификатор только для этой категории. Затем вы выбираете класс с наибольшей вероятностью / баллом среди множества классификаторов.Это также не сильно отличается от того, что вы делаете сегодня, потому что
scikit's SDGClassifier
уже обрабатывает мультиклассовый сценарий, помещая под капот несколько классификаторов «Один против всех».Конечно, если появиться много новых категорий, такой подход может стать немного сложным для управления.
источник
warm_start
опция.Если новые категории появляются очень редко, я сам предпочитаю решение «один против всех», предоставляемое @oW_ . Для каждой новой категории вы обучаете новую модель X количеству выборок из новой категории (класс 1) и X количеству выборок из остальных категорий (класс 0).
Однако, если новые категории появляются часто и вы хотите использовать одну общую модель, есть способ сделать это с помощью нейронных сетей.
Таким образом, по прибытии новой категории, мы добавляем соответствующий новый узел к слою softmax с нулевыми (или случайными) весами и сохраняем старые весы нетронутыми, затем мы обучаем расширенную модель новым данным. Вот визуальный набросок для идеи (нарисованный мной):
Вот реализация для полного сценария:
Модель обучается по двум категориям,
Новая категория прибывает,
Модельные и целевые форматы обновляются соответственно,
Модель обучается на новых данных.
Код:
какие выводы:
Я должен объяснить два момента относительно этого вывода:
Модель производительность снижается с
0.9275
до0.8925
, просто добавляя новый узел. Это потому, что вывод нового узла также включен для выбора категории. На практике выходные данные нового узла должны включаться только после обучения модели на значительном образце. Например,[0.15, 0.30, 0.55]
на этом этапе мы должны достичь максимума из первых двух записей , то есть 2-го класса.Производительность расширенной модели по двум (старым) категориям
0.88
меньше, чем у старой модели0.9275
. Это нормально, потому что теперь расширенная модель хочет назначить вход одной из трех категорий вместо двух. Это снижение также ожидается, когда мы выбираем из трех двоичных классификаторов по сравнению с двумя двоичными классификаторами в подходе «один против всех».источник
Я должен сказать, что я не нашел никакой литературы по этой теме. Насколько я знаю, то, что вы спрашиваете, невозможно. Вы должны знать об этом, и владелец продукта должен быть тоже. Причина в том, что любая функция потерь опирается на известные метки, поэтому нет способа предсказать метку, которой нет в обучающих данных. Кроме того, научная фантастика заключается в том, что алгоритм машинного обучения может предсказать то, к чему он не был обучен
Сказав это, я думаю, что может быть обходной путь (позвольте мне отметить, что это мнение не основано на формальной литературе). Если классификатор является вероятностным, то выходным значением является вероятность для каждого класса быть истинным, а решение - более высокой вероятностью. Возможно, вы можете установить порог для этой вероятности, такой, чтобы модель предсказывала «неизвестно», если все вероятности ниже этого порога. Позвольте привести пример.
Что вы будете делать с этими неизвестными , зависит от логики бизнеса. Если они важны, вы можете создать их пул и переучить модель, используя доступные данные. Я думаю, что вы можете сделать своего рода «трансфер обучения» из обученной модели, изменив размерность результата. Но с этим я не сталкивался, поэтому просто говорю
Возьмите на подсчет, который
SGDClassifier
используетSVM
под, который не является вероятностным алгоритмом. В следующейSGDClassifier
документации вы можете изменитьloss
аргумент наmodified_huber
илиlog
для получения вероятностных результатов.источник
Есть два варианта:
Предсказать вероятность того, что точка данных принадлежит неизвестному или
unk
категории. Любые новые категории, которые появляются в потоке, должны быть предсказаны какunk
. Это часто встречается в Natural Language Processing (NLP), потому что в текстовых потоках всегда появляются новые токены.Повторяйте модель каждый раз, когда появляется новая категория.
Поскольку вы упоминаете
SGDClassifier
, я предполагаю, что вы используете scikit-learn. Scikit-learn не очень хорошо поддерживает онлайн-обучение. Было бы лучше переключить среду, которая лучше поддерживает потоковое и онлайн-обучение, например, Spark .источник