Несколько деталей реализации машины опорных векторов (SVM).

В каком-то конкретном приложении я нуждался в машинном обучении (я знаю то, что изучал на курсе бакалавриата). Я использовал машины опорных векторов и решил проблему. Работает нормально.

Теперь мне нужно улучшить систему. Проблемы здесь:

  1. Я получаю дополнительные учебные примеры каждую неделю. Прямо сейчас система начинает обучение заново с обновленными примерами (старые примеры + новые примеры). Я хочу сделать это инкрементным обучением. Использование предыдущих знаний (вместо предыдущих примеров) с новыми примерами для получения новой модели (знаний)

  2. Правильно, мои тренировочные примеры состоят из 3 классов. Итак, каждый пример обучения вписывается в один из этих 3 классов. Я хочу функционал класса "Неизвестно". Все, что не соответствует этим 3 классам, должно быть помечено как «неизвестное». Но я не могу трактовать «Неизвестный» как новый класс и приводить примеры для этого.

  3. Предполагается, что «неизвестный» класс реализован. Когда класс «неизвестен», пользователь приложения вводит то, что, по его мнению, может быть классом. Теперь мне нужно включить пользовательский ввод в обучение. Я понятия не имею, как это сделать. Будет ли это иметь какое-то значение, если пользователь вводит новый класс (т.е. класс, которого еще нет в обучающем наборе)?

Нужно ли выбирать новый алгоритм, или машины опорных векторов могут это сделать?

PS: я использую реализацию libsvm для SVM.

26
задан doug 11 August 2010 в 04:17
поделиться

3 ответа

Я только что написал свой Ответ, используя ту же организацию, что и ваш Вопрос (1., 2., 3).

  1. Могут ли SVM это делать, т. Е. Инкрементное обучение? Многослойные персептроны, конечно, могут - поскольку последующие обучающие экземпляры не влияют на базовую архитектуру сети, они просто вызывают корректировку значений весовых матриц. Но SVM? Мне кажется, что (теоретически) один дополнительный обучающий пример может изменить выбор опорных векторов. Но опять же, я не знаю.

  2. Я думаю, что вы можете решить эту проблему довольно легко, настроив LIBSVM по принципу «один против многих», то есть как одноклассный классификатор . SVM являются одноклассными классификаторами; Применение SVM для мультиклассов означает, что он был закодирован для выполнения нескольких пошаговых классификаций «один против многих», но, опять же, алгоритм обучается (и тестируется) по одному классу за раз. Если вы сделаете это, то то, что останется после пошагового выполнения в отношении тестового набора, станет «неизвестным» - другими словами, любые данные, не классифицированные после выполнения нескольких последовательных классификаций одного класса, по определению находятся в этом «неизвестном» ' класс.

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

8
ответ дан 28 November 2019 в 17:24
поделиться
  1. Существуют алгоритмы для постепенного обучения SVM, но я не думаю, что в libSVM это реализовано. Я думаю, вам следует подумать, действительно ли вам нужна эта функция. Я не вижу проблем с вашим текущим подходом, если только процесс обучения не слишком медленный. Если это так, не могли бы вы проводить повторное обучение партиями (т.е. после каждых 100 новых примеров)?
  2. Вы можете заставить libSVM вырабатывать вероятности принадлежности к классу. Я думаю, что это можно сделать для многоклассовой классификации, но я не совсем уверен в этом. Вам нужно будет определить некоторый порог, при котором классификация не является достаточно определенной, а затем вывести 'Unknown'. Я полагаю, что для этого можно использовать что-то вроде установки порога для разницы между наиболее вероятным и вторым наиболее вероятным классом.
  3. Я думаю, что libSVM масштабируется на любое количество новых классов. Однако точность вашей модели может пострадать при добавлении новых классов.
3
ответ дан 28 November 2019 в 17:24
поделиться

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

Несколько месяцев назад я также исследовал онлайн или инкрементные алгоритмы SVM. К сожалению, текущее состояние реализаций довольно скудное. Все, что я нашел, это пример Matlab, OnlineSVR (дипломный проект, реализующий только поддержку регрессии) и SVMHeavy (только поддержка бинарных классов).

Я лично не использовал ни одну из них. Похоже, что все они находятся на стадии "исследовательской игрушки". Я даже не смог заставить SVMHeavy компилироваться.

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

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

Например, если у вас есть атрибут "цвет", который имеет минимальное значение 4 и максимальное 123, то вы можете добавить их в обучающее множество

[({'color':3},'unknown'),({'color':125},'unknown')]

, чтобы дать вашей SVM представление о том, что означает "неизвестный" цвет.

5
ответ дан 28 November 2019 в 17:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: