2013-09-30 2 views
6

Как настроить параметры гаммы и стоимости в libSVM, когда я использую несбалансированный набор данных, состоящий из 75% «истинных» меток и 25% «ложных» меток? Я получаю постоянную ошибку, когда все предсказанные метки установлены на «True» из-за дисбаланса данных.дисбаланс данных в SVM с использованием libSVM

Если проблема не связана с libSVM, но с моим набором данных, как я должен справиться с этим дисбалансом с точки зрения теоретического машинного обучения? * Количество функций, которые я использую, составляет от 4 до 10, и у меня есть небольшой набор из 250 точек данных.

+2

есть аналогичный вопрос на странице FAQ, который может помогает: Q: Мои данные несбалансированные. Может ли libsvm справиться с такими проблемами? http://www.csie.ntu.edu.tw/~cjlin/libsvm/faq.html#f410 – McKelvin

ответ

6

Классы дисбаланс не имеет ничего общего с выбором C и гамма, для решения этой проблемы вы должны использовать class weighting scheme, который доступен в, например, scikit-learn пакет (построен на libsvm)

Выбор лучшего C и gamma выполняется с использованием поиска сетки с перекрестной проверкой. Вы должны попробовать широкий диапазон значений здесь, для C разумно выбирать значения между 1 и 10^15, а простая и эффективная эвристика значений значений gamma - это вычислять попарные расстояния между всеми вашими точками данных и выбирать гамму в соответствии с процентилями этого Распределение - подумайте о том, чтобы в каждой точке было распределено гауссовское распределение с дисперсией, равным 1/gamma, - если вы выберете такое gamma, что это перекрытие распределения будет иметь много точек, вы получите очень «плавную» модель, а использование небольшой дисперсии приведет к переобучению.

+1

Схема взвешивания классов подразумевает, что 'C' изменяется в фактической проблеме обучения SVM, поэтому баланс класса * делает * имеют какое-то отношение к выбору 'C', хотя это происходит за шторами. –

+1

Это чисто лингвистическая вещь, поскольку я предполагал, что выбор C не устранит проблему дисбаланса. Решения этой проблемы, однако, меняют С, я не вижу здесь истинного противоречия – lejlot

4

Несбалансированные наборы данных могут быть решены различными способами. Баланс классов не влияет на параметры ядра, такие как gamma для ядра RBF.

Два наиболее популярные подходы:

  1. Используйте различные штрафы за ошибки классификации класса, это в основном означает изменение C. Как правило, наименьший класс взят выше, общий подход - npos * wpos = nneg * wneg. LIBSVM позволяет вам делать это, используя свои флаги -wX.
  2. Подберите перепредставленный класс, чтобы получить равное количество положительных и отрицательных эффектов и продолжить обучение, как вы традиционно использовали бы для сбалансированного набора. Обратите внимание, что вы в основном игнорируете большой кусок данных таким образом, что является интуитивно плохой идеей.
+1

Почему бы не пересмотреть ** более мелкий? Это не будет игнорировать какую-либо информацию. – lejlot

+0

@lejlot. В большинстве ситуаций, когда используется последняя стратегия, это крупномасштабные проблемы (например, от миллионов до миллиардов экземпляров), в которых игнорирование части данных фактически используется в качестве взлома для снижения сложности. Перепрофилирование меньшего набора в основном является прежним подходом неэффективным способом (передискретизация точно такая же, как перевыполнение). –

+0

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

2

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

Как уже упоминалось, вы можете рассмотреть возможность использования разных весов для классов меньшинства или с использованием разных штрафных санкций. Однако есть более умный способ борьбы с несбалансированными наборами данных.

Вы можете использовать поражали (S ynthetic M inority О вер дискретизации Те chnique) алгоритм для генерации синтезированных данных для класса меньшинства. Это простой алгоритм, который очень хорошо справляется с некоторыми наборами данных дисбаланса.

На каждой итерации алгоритма SMOTE рассматривает два случайных экземпляра класса меньшинства и добавляет искусственный пример того же класса где-то посередине. Алгоритм продолжает вводить набор данных с образцами до тех пор, пока два класса не станут сбалансированными или некоторые другие критерии (например, добавьте определенное количество примеров). Ниже вы можете найти изображение, описывающее алгоритм для простого набора данных в пространстве 2D-объектов.

Связанный вес с классом меньшинства является частным случаем этого алгоритма. Когда вы связываете вес $ w_i $ с экземпляром i, вы в основном добавляете дополнительные $ w_i - 1 $ экземпляры поверх экземпляра i!

SMOTE

  • Что вам нужно сделать, это увеличить свой первоначальный набор данных образцов, созданных этим алгоритмом, и обучить SVM с этим новым набором данных. Вы также можете найти множество реализаций онлайн на разных языках, таких как Python и Matlab.

  • Были и другие расширения этого алгоритма, я могу указать вам на большее количество материалов, если вы хотите.

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

Смежные вопросы