Помощь - 100% точность с LibSVM? - PullRequest
13 голосов
/ 23 августа 2011

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

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

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

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

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

Испытано:

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

Предварительный вывод?:

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

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

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

Ответы [ 2 ]

11 голосов
/ 23 августа 2011

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

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

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

10 голосов
/ 23 августа 2011

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

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

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

...