13

Номинально неплохая проблема, но я уверен, что это происходит потому, что происходит что-то смешное ...Помощь - 100% -ная точность с LibSVM?

В качестве контекста я работаю над проблемой в области выражения лица/распознавания, поэтому Точность 100% кажется невероятно неправдоподобной (не то, что это было бы правдоподобно в большинстве приложений ...). Я предполагаю, что в наборе данных есть либо некоторая согласованная предвзятость, что он делает слишком легко для SVM, чтобы вытащить ответ, = или =, скорее, я сделал что-то неправильно на стороне SVM.

Я ищу предложения, чтобы помочь понять, что происходит - это я (= мое использование LibSVM)? Или это данные?

Деталь:

  • О ~ 2500 меченых векторов данных/экземпляры (преобразованные видеокадры individuals-- < 20 отдельных лиц всего), бинарной проблемы классификации. ~ 900 функций/экземпляров. Несбалансированные данные устанавливаются примерно в соотношении 1: 4.
  • Ran subset.py для разделения данных на тест (500 экземпляров) и на поезд (оставшийся).
  • Ran "svm-train -t 0". (Примечание: видимо, нет необходимости в «-w1 1 -w-1 4» ...)
  • Ran svm-pred в тестовом файле. Точность = 100%!

Вещь пробовала:

  • Проверена около 10 раз за что я не обучение & тестирования на один и те же файлы данные, через какую-то непреднамеренной аргумент командной строки ошибки
  • повторно RAN подмножество. py (даже с -s 1) несколько раз и выполнял/тестировал только несколько разных наборов данных (в случае, если я случайным образом на самом магическом поезде/тесте pa
  • провел простую проверку типа diff, чтобы подтвердить, что тестовый файл не подмножество данных обучения
  • svm-scale по данным не влияет на точность (точность = 100%). (Хотя число поддерживающих векторов действительно падает с nSV = 127, bSV = 64 на nBSV = 72, bSV = 0.)
  • ((странно)) с использованием ядра RBF по умолчанию (вице-линейный - то есть удаление - t 0 ') приводит к точности, исходящей от мусора (?!)
  • (проверка работоспособности), выполняемая svm-pred, с использованием модели, подготовленной по масштабированному набору данных против немасштабированного набора данных, приводит к точности = 80% (т. е. всегда угадывает доминирующий класс). Это строго проверка здравомыслия, чтобы убедиться, что каким-то образом svm-predict номинально действует прямо на моей машине.

Ориентировочное вывод ?:

Что-то с данных wacked - каким-то образом, в наборе данных, есть тонкий экспериментатор управляемый эффект, что SVM набирает на.

(Это не на первом проходе, объяснить, почему RBF ядро ​​дает результаты для мусора, однако.)

бы очень признателен за любые предложения по а), как исправить мое использование LibSVM (если это на самом деле проблема) или b) определить, какой тонкий экспериментальный смещение в данных LibSVM набирает обороты.

+0

Mmmm, данные и анализ модели на расстоянии вытянутой руки. Операция, но действительно, очень медленная. Это может быть довольно сложно. Есть ли вероятность опубликовать данные? Это почти наверняка данные, но если кто-то другой воспроизвести, это может быть полезно. Кроме того, если вы владеете R, это может облегчить консультирование. – Iterator

+0

«slow», я имею в виду, что можно рекомендовать различные тесты, шаги, чтобы попробовать, что нужно исследовать и т. Д., Но весь процесс может занять некоторое время. Если вы видели эпизод «Дом» «Замороженный» - идея похожа. В противном случае проблема может быть «слишком локальной». – Iterator

+1

наиболее вероятно -) заключается в том, что вы включили свои тестовые данные в учебный комплект. Я знаю, что вы проверили, но проверьте еще кое-что. – bmargulies

ответ

11

Две другие идеи:

Убедитесь, что вы не тренируетесь и тестирование на одних и тех же данных. Это звучит глупо, но в приложениях для компьютерного зрения вы должны позаботиться о том, чтобы: вы не повторяли данные (скажем, два кадра одного и того же видео падают на разные складки), вы не тренируетесь и не тестируете одного и того же человека и т. д. Это более тонко, чем кажется.

Убедитесь, что вы ищете параметры гамма и С для ядра RBF. Имеются хорошие теоретические (асимптотические) результаты, которые оправдывают, что линейный классификатор является просто вырожденным классификатором RBF. Поэтому вы должны просто искать хорошую пару (C, гамма).

+0

для RBF, спасибо за сообщение (что должно было быть!) Очевидное - я забыл найти хорошие параметры. Получил чрезмерность, когда 100% -ная точность начала возвращаться (и, следовательно, потому что я знал, с вероятностью, что что-то плохое с тем, что я делал или как настроены данные). – severian

+0

+1 Хорошая уловка при интерполяции! – Iterator

10

несмотря на то, что дьявол кроется в деталях, вот три простых тестов вы могли бы попробовать:

  1. Quickie (~ 2 мин): Запуск данных через алгоритм дерева решений. Это доступно в Matlab через classregtree, или вы можете загрузить в R и использовать rpart. Это может сказать вам, если один или несколько функций, возможно, дадут идеальное разделение.
  2. Not-so-quickie (~ 10-60 минут, в зависимости от вашей инфраструктуры): Итеративно разделить функции (то есть от 900 до 2 комплектов по 450), поезд и тест. Если одно из подмножеств дает вам совершенную классификацию, разделите его снова. Для определения переменных задачи потребуется менее 10 таких разделов. Если происходит «разрыв» со многими оставшимися переменными (или даже в первом расколе), выберите другой случайный поднабор функций, сбривайте меньше переменных за раз и т. Д. Возможно, не понадобится все 900 для разделения данных ,
  3. Более глубокий анализ (от нескольких минут до нескольких часов): попробуйте перестановки меток. Если вы можете перенести все из них и по-прежнему получать идеальное разделение, у вас возникнут проблемы в настройке вашего поезда/теста. Если вы выберете все более крупные подмножества для перестановки (или, если вы собираетесь в другом направлении, чтобы оставить статичным), вы можете увидеть, где вы начинаете терять разделимость. В качестве альтернативы, рассмотрите возможность уменьшения размера вашего тренировочного набора, и если вы получите отделимость даже с очень небольшим набором тренировок, то что-то странно.

Метод № 1 быстро & должен быть проницательным. Есть некоторые другие методы, которые я мог бы порекомендовать, но # 1 и # 2 просты, и было бы странно, если бы они не давали никаких сведений.

+0

Я не уверен, что вы имеете в виду, переставляя метки, но если вы имеете в виду перестановку векторов переменных, это никогда не должно влиять на результаты SVM! – ldog

+0

@Ite: вы можете уточнить инструкцию «переместить» (№ 3)? Вы имеете в виду случайную перестановку некоторого количества переменных в каждом экземпляре/точке данных? (Так что разные экземпляры переставляются немного по-другому?) Re: # 1 & # 2, начнется с них в ближайшее время ... действительно ценят предложения. – severian

+0

Метка - это переменная ответа. Другими словами, вы вводите шум. В двоичной классификации это не приводит к ошибочной классификации как таковой, поскольку она передискретируется из распределения ответов. Ключ в том, что в какой-то момент происходит сбой. Вы можете преднамеренно ошибочно использовать, но повторная выборка из распределения ответов или перестановка меток - полезные методы для исследования данных и моделей. – Iterator