Подтвердить что ты не робот

Помощь - 100% -ная точность с LibSVM?

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

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

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

Подробности:

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

Проверенные вещи:

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

Предварительное заключение?:

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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