Содержание
Машина опорных векторов для ранжирования
SVM-ранг: Машина опорных векторов для ранжирования
Автор: Thorsten Joachims Версия: 1.00 |
Обзор
SVM rank является экземпляром SVM struct для
эффективно обучать ранжирующие SVM
как определено в [Joachims, 2002c]. SVM ранг решает ту же задачу оптимизации
в качестве
SVM светлый
с опцией ‘-z p’, но это значительно
Быстрее. В наборе данных LETOR 3.0 обучение на любом из
складки и наборы данных. Алгоритм решения квадратичной программы представляет собой
прямое расширение
Алгоритм оптимизации ROC-области описан в [Joachims, 2006].
для нескольких рейтингов с использованием формулы 9 с одним провисанием0028 SVM структура .
Однако, поскольку я не хотел тратить больше дня на кодирование SVM rank ,
Я реализовал только простой оракул разделения, квадратичный по количеству
элементов в каждом ранжировании (а не разделительный оракул O[k*log k], описанный в
[Иоахимс, 2006]). Пока это делает реализацию
не очень подходит для частного случая порядковой регрессии [Herbrich et al.,
1999], это означает, что он, тем не менее, быстр для небольших рейтингов (т.е. k<1000).
и масштабируется линейно по количеству ранжирований (то есть запросов).
Если вы ищете Propensity SVM-Rank для обучения на неполных и необъективных данных, перейдите сюда.
Исходный код
Программа бесплатна для научного использования. Пожалуйста, свяжитесь со мной, если вы планируете использовать программное обеспечение в коммерческих целях. Программное обеспечение не подлежит дальнейшему распространению без предварительного разрешения автора.
Если вы используете SVM ранга в своей научной работе, пожалуйста, укажите как
- Т. Йоахимс, Обучение линейным SVM в линейном времени, Труды
Конференция ACM по обнаружению знаний и интеллектуальному анализу данных (KDD), 2006 г.
[Постскриптум
(gz)] [PDF]
Реализация разработана на
Linux с gcc, но также компилируется в Solaris, Cygwin, Windows (используя MinGW) и
Mac (после небольших доработок, см. FAQ).
Исходный код доступен по следующему адресу:
.
https://download.joachims.org/svm_rank/current/svm_rank.tar.gz
Если вам нужны только двоичные файлы, вы можете скачать их для следующих систем:
- Linux (32-разрядная версия): https://download.joachims.org/svm_rank/current/svm_rank_linux32.tar.gz
- Linux (64-разрядная версия): https://download.joachims.org/svm_rank/current/svm_rank_linux64.tar.gz
- Cygwin: https://download.joachims.org/svm_rank/current/svm_rank_cygwin. tar.gz
- Windows: https://download.joachims.org/svm_rank/current/svm_rank_windows.zip
Пожалуйста, отправьте мне электронное письмо и дайте мне знать, что вы его получили. Архив содержит исходный код самой последней версии SVM ранга , который включает в себя исходный код SVM struct и квадратичного оптимизатора SVM light . Распакуйте архив с помощью команды оболочки:
gunzip c svm_rank.tar.gz | смола xvf
Это расширяет архив в текущий каталог, который теперь содержит все соответствующие файлы. Вы можете собрать SVM ранг с помощью команды:
сделать
Это создаст исполняемые файлы svm_rank_learn и svm_rank_classify. Если система не компилируется должным образом, проверьте этот FAQ.
Как использовать
SVM rank состоит из модуля обучения (svm_rank_learn) и модуля
для прогнозирования (svm_rank_classify). SVM ранг использует те же форматы входных и выходных файлов, что и SVM-light,
и его использование идентично SVM легкий с ‘-z p’
вариант. Вы называете это как
svm_rank_learn -c 20.0 train.dat model.dat
который обучает SVM ранжирования на обучающем наборе train.dat и выводит изученное правило в model.dat, используя параметр регуляризации C, установленный на
20.0. Однако интерпретация параметра C в SVM ранга
отличается от SVM light . В частности, С свет = С ранг /н,
где n — количество обучающих запросов (т. е. количество различных
qid в тренировочном наборе). Большинство других опций исходят из SVM struct и
SVM light и описаны там.
Только перечисленные ниже «специальные параметры приложения» относятся к
SVM ранг .
Общие настройки: -? -> эта помощь -v [0. .3] -> уровень детализации (по умолчанию 1) -y [0..3] -> уровень детализации для svm_light (по умолчанию 0) Варианты обучения: -c float -> C: компромисс между ошибкой обучения и маржа (по умолчанию 0,01) -p [1,2] -> L-норма для использования в слабых переменных. Используйте 1 для L1-нормы, используйте 2 для квадратных брюк. (по умолчанию 1) -o [1,2] -> Метод масштабирования для использования при потере. 1: медленное масштабирование 2: масштабирование поля (по умолчанию 2) -l [0..] -> Функция потерь для использования. 0: ноль/одна потеря ?: см. ниже в конкретных параметрах приложения (по умолчанию 1) Варианты оптимизации (см. [2][5]): -ш [0,..,9] -> выбор алгоритма структурного обучения (по умолчанию 3): 0: n-слабый алгоритм, описанный в [2] 1: алгоритм n-slack с эвристикой сжатия 2: 1-слабый алгоритм (основной), описанный в [5] 3: 1-слабый алгоритм (двойной), описанный в [5] 4: алгоритм 1-slack (двойной) с кешем ограничений [5] 9: пользовательский алгоритм в svm_struct_learn_custom. c -e float -> epsilon: разрешить этот допуск для завершения критерий (по умолчанию 0,001000) -k [1..] -> количество новых ограничений для накопления перед пересчет решения QP (по умолчанию 100) (-w только 0 и 1) -f [5..] -> количество ограничений для кеша для каждого примера (по умолчанию 5) (используется с -w 4) -b [1..100] -> процент тренировочного набора, для которого нужно обновить кеш когда никакое эпсилон-нарушенное ограничение не может быть построено из текущего кеша (по умолчанию 100%) (используется с -w 4) Опции SVM-light для решения подзадач QP (см. [3]): -n [2..q] -> количество новых переменных, входящих в рабочий набор в каждой итерации svm-light (по умолчанию n = q). Установить размер n кэша svm-light для оценки ядра в МБ (по умолчанию 40) (используется только для -w 1 с ядрами) -h [5. 2) 3: сигмовидный танх(s a*b + c) 4: пользовательское ядро из kernel.h -d int -> параметр d в полиномиальном ядре -g float -> гамма-параметр в ядре rbf -s float -> параметр s в сигмовидном/полигональном ядре -r float -> параметр c в сигмовидном/полигональном ядре -u строка -> параметр определяемого пользователем ядра Параметры вывода: -a строка -> записать все альфы в этот файл после обучения (в том же порядке, что и в тренировочном наборе) Опции для конкретного приложения: С опцией -l можно выбрать следующие функции потерь: 1 Общее количество замененных пар, суммированное по всем запросам. 2 Доля обмененных пар, усредненная по всем запросам. ПРИМЕЧАНИЕ. SVM-light в режиме '-z p' и SVM-ранг с потерей 1 эквивалентны для c_light = c_rank/n, где n — количество тренировочных рейтингов (т.е. запросы).
SVM ранг изучает беспристрастное правило линейной классификации (т. е.
правило w*x без явного порога). Функция потерь должна быть
оптимизированный выбирается с помощью опции ‘-l’. Функция потерь «1» идентична
тот, который используется в режиме ранжирования SVM light , и оптимизирует
общее количество замененных пар. Функция потерь «2» представляет собой нормализованную версию
«1». Для каждого запроса он делит количество замененных пар на максимальное
количество возможных переставленных пар для этого запроса.
В принципе, вы можете использовать ядра в SVM ранга , используя ‘-t’
вариант как в SVM light , но уж больно медленный и вы
вероятно, лучше использовать SVM light .
Формат файла обучающих и тестовых файлов такой же, как и для SVM light
(подробнее см. здесь), за исключением того, что
строки во входных файлах должны быть отсортированы по возрастанию qid. Первые строки могут содержать комментарии и игнорируются, если они начинаются с #. Каждая из следующих строк представляет один обучающий пример и имеет следующий формат:
<строка> .=.
<функция> .=. <положительное целое>
<значение> .=. <поплавок>
<информация> .=. <строка>
Целевое значение и каждая из пар функция/значение разделены пробелом
персонаж. Пары функция/значение ДОЛЖНЫ быть упорядочены по возрастанию номера функции.
Функции с нулевым значением можно пропустить. Целевое значение определяет порядок
примеры для каждого запроса. Неявно,
целевые значения используются для создания попарных ограничений предпочтения, как
описано в
[Иоахимс, 2002c].
Ограничение предпочтения включено для всех пар примеров в example_file,
для которых целевое значение отличается. Специальная функция «qid» может быть использована для
ограничить создание ограничений. Два примера рассматриваются для
ограничение попарного предпочтения только в том случае, если значение «qid» одинаково. За
например, учитывая файл example_file
3 раза в день:1 1:1 2:1 3:0 4:0,2 5:0 # 1A
2 раза в день:1 1:0 2:0 3:1 4:0,1 5:1 # 1B
14:1 1:0 2:1 3:0 4:0,4 5:0 # 1С
1 четыре раза в день:1 1:0 2:0 3:1 4:0,3 5:0 # 1D
1 четыре раза в день:2 1:0 2:0 3:1 4:0,2 5:0 # 2A
2 раза в день:2 1:1 2:0 3:1 4:0,4 5:0 # 2B
1 четыре раза в день:2 1:0 2:0 3:1 4:0,1 5:0 # 2C
1 четыре раза в день:2 1:0 2:0 3:1 4:0,2 5:0 # 2D
2 раза в день:3 1:0 2:0 3:1 4:0,1 5:1 # 3A
3 4:3 1:1 2:1 3:0 4:0,3 5:0 # 3Б
4 раза в день:3 1:1 2:0 3:0 4:0,4 5:1 # 3C
1 четыре раза в день:3 1:0 2:1 3:1 4:0,5 5:0 # 3D
генерируется следующий набор парных ограничений (примеры см.
to по информационной строке после символа #):
1А>1В, 1А>1С, 1А>1D, 1В>1С, 1В>1D, 2В>2А, 2В>2С, 2В>2D, 3С>3А,
3C>3B, 3C>3D, 3B>3A, 3B>3D, 3A>3D
Результатом svm_rank_learn является модель, полученная из обучающих данных в
поезд. дат. Модель записывается в model.dat. Чтобы делать прогнозы на тестовых примерах, svm_rank_classify читает этот файл. svm_rank_classify вызывается следующим образом:
svm_rank_classify test.dat прогнозы model.dat
Для каждой строки в test.dat прогнозируемый ранговый балл записывается в
предсказания файлов. На каждый тестовый пример в прогнозах приходится одна строка в том же порядке, что и в
тест.дат.
По этим оценкам можно восстановить рейтинг с помощью сортировки.
Начало работы: пример проблемы
Вы найдете пример проблемы по адресу
.
https://download.joachims.org/svm_light/examples/example3.tar.gz
Он состоит из 3 рейтингов (то есть запросов) по 4 примера в каждом. Он также содержит файл с 4 тестовыми примерами.
Распаковать архив с
gunzip -c example3.tar.gz | смола xvf-
Будет создан подкаталог example3.
Для запуска примера выполните команды:
svm_rank_learn -c 3 пример3/train. dat пример3/модель
svm_rank_classify пример3/test.dat пример3/модель пример3/предсказания
Вывод в файле прогнозов можно использовать для ранжирования тестовых примеров. Если
вы сделаете это, вы увидите, что он предсказывает правильное ранжирование. Значения в
файл предсказаний не имеет значения в абсолютном смысле — они используются только
для заказа. Эквивалентный вызов для SVM-light равен
svm_learn -z p -c 1 пример3/train.dat пример3/модель
Обратите внимание на другое значение c, так как у нас есть 3 тренировочных рейтинга.
Также может быть интересно посмотреть на «ошибку обучения» ранжирующего SVM.
Эквивалентом ошибки обучения для ранжирующего SVM является количество
пары, которые неправильно упорядочены обученной моделью. Чтобы найти эти пары, можно
применить модель к обучающему файлу:
svm_rank_classify пример3/train.dat пример3/модель пример3/predictions.train
Опять же, файл прогнозов показывает порядок, предполагаемый моделью.
модель правильно ранжирует все обучающие примеры.
Обратите внимание, что ранги сравнимы только между экземплярами с одинаковым qid. Примечание
также, что целевое значение (первое значение в каждой строке файлов данных) только
используется для определения порядка примеров. Его абсолютное значение не имеет значения, т.к.
до тех пор, пока сохраняется порядок относительно других примеров с тем же qid
одинаковый.
Отказ от ответственности
Это программное обеспечение бесплатно только для некоммерческого использования. Запрещается распространять без предварительного разрешения автора. Автор не несет ответственности за последствия использования этого программного обеспечения.
Известные проблемы
- нет
История
- нет
Ссылки
[1] Т. Йоахимс, Обучение линейных SVM в линейном времени, Труды
Конференция ACM по обнаружению знаний и интеллектуальному анализу данных (KDD), 2006 г.
[Постскриптум] [PDF]
[2] Т. Йоахимс, A Поддержка
Векторный метод для многомерных показателей эффективности , Труды
Международная конференция по машинному обучению (ICML), 2005 г.
[Постскриптум] [PDF]
[3] Tsochantaridis, T. Joachims, T. Hofmann, and Y. Altun, Large Margin
Методы структурированных и взаимозависимых выходных переменных, Journal of Machine
Learning Research (JMLR), 6 (сентябрь): 1453–1484, 2005 г.
[PDF]
[4] И. Цочантаридис, Т. Хофманн, Т. Йоахимс, Ю. Алтун. Опорный вектор
Машинное обучение для взаимозависимых и структурированных выходных пространств .
Международная конференция по машинному обучению (ICML), 2004 г.
[Постскриптум] [PDF]
[5] Т. Йоахимс, Практическое применение крупномасштабного обучения SVM. Достижения в методах ядра — обучение опорным векторам, Б. Шлкопф, К. Берджес и А. Смола (ред.), MIT Press, 1999.
[Постскриптум (гз)]
[PDF]
[6] Т. Джоахимс, Т. Финли, Чун-Нам Ю, Тренировка режущей плоскости
Структурные SVM, журнал машинного обучения, 2009 г.
[PDF]
[7]
Т. Йоахимс, Оптимизация поиска
Двигатели, использующие данные о кликах , Материалы конференции ACM по
Обнаружение знаний и интеллектуальный анализ данных (KDD), ACM, 2002.
[Постскриптум] [PDF]
Глава 2: SVM (Машина опорных векторов) — Теория | Саван Патель | Машинное обучение 101
Ошибка в коде стоит двух в документации.
Добро пожаловать на второй этап контролируемого машинного обучения. Опять же, эта глава разделена на две части. Часть 1 (эта) обсуждает теорию, рабочие и настраиваемые параметры. Часть 2 (здесь) мы беремся за небольшое упражнение по программированию.
Если вы не читали Наивного Байеса, я бы посоветовал вам внимательно прочитать его здесь .
Машина опорных векторов (SVM) — это дискриминативный классификатор, формально определяемый разделяющей гиперплоскостью. Другими словами, учитывая размеченные обучающие данные ( контролируемое обучение ), алгоритм выводит оптимальную гиперплоскость, которая классифицирует новые примеры. В двумерном пространстве эта гиперплоскость представляет собой линию, делящую плоскость на две части, где в каждом классе лежат по обе стороны.
Смущает? Не волнуйтесь, мы научимся простым языком.
Предположим, вам дан график двух классов меток на графике, как показано на рисунке (A) . Можете ли вы определить разделительную линию для классов?
Изображение A: Нарисуйте линию, разделяющую черные круги и синие квадраты.
Возможно, вы придумали что-то похожее на следующее изображение ( изображение B ). Это справедливо разделяет два класса. Любая точка слева от линии попадает в класс черного круга, а справа — в класс синего квадрата. Разделение классов. Это то, что делает SVM. Находит прямую/гиперплоскость (в многомерном пространстве, разделяющем наши классы). Вскоре мы обсудим, почему я написал многомерное пространство.
s Изображение B: Образец вырезается для разделения на два класса.
Пока все хорошо. Теперь подумайте, что если бы у нас были данные, как показано на рисунке ниже? Ясно, что нет линии, которая могла бы разделить два класса в этой плоскости x-y. Так что же нам делать? Мы применяем трансформацию и добавляем еще одно измерение, которое мы называем осью Z. Допустим значение точек на плоскости z, w = x² + y². В этом случае мы можем манипулировать им как расстоянием точки от z-начала. Теперь, если мы построим по оси Z, будет видно четкое разделение, и можно будет провести линию.
Можете ли вы провести разделительную линию на этой плоскости? график оси Z. Здесь можно провести разделение.
Когда мы преобразуем эту линию обратно в исходную плоскость, она сопоставляется с круговой границей, как показано на изображении E. Эти преобразования называются ядрами .
При обратном преобразовании в плоскость x-y линия превращается в окружность.
К счастью, вам не нужно каждый раз угадывать/выводить преобразование для вашего набора данных. Реализация SVM библиотеки sklearn предоставляет ее встроенной.
Что делать, если график данных перекрывается? Или что делать, если некоторые из черных точек находятся внутри синих? Какую линию из 1 или 2 нам нарисовать?
Что в этом случае? Изображение 1 Изображение 2
Какой из них вы думаете? Что ж, оба ответа верны. Первый допускает некоторые выбросы. Второй пытается достичь нулевого допуска с идеальным разделением.
Но есть компромисс . В реальном мире поиск идеального класса для миллионов наборов обучающих данных занимает много времени. Как вы увидите в кодировании. Это называется параметром регуляризации . В следующем разделе мы определим два термина параметр регуляризации и гамма. Это параметры настройки в классификаторе SVM. Варьируя их, мы можем получить значительную нелинейную классификационную линию с большей точностью за разумное время. В упражнении по кодированию (часть 2 этой главы) мы увидим, как мы можем повысить точность SVM, настроив эти параметры.
Еще одним параметром является ядро . Определяет, хотим ли мы линейное или линейное разделение. Это также обсуждается в следующем разделе.
Когда ко мне обращаются за советом.
Изучение гиперплоскости в линейном SVM выполняется путем преобразования задачи с использованием некоторой линейной алгебры. Здесь играет роль ядро.
Для линейного ядра уравнение для предсказания нового входа с использованием скалярного произведения между входом (x) и каждым опорным вектором (xi) вычисляется следующим образом:
f(x) = B(0) + сумма (ai * (x,xi))
Это уравнение включает вычисление внутренних произведений нового входного вектора (x) со всеми опорными векторами в обучающих данных. Коэффициенты B0 и ai (для каждого входа) должны быть оценены из обучающих данных алгоритмом обучения. 9d и экспоненциальное как K(x,xi) = exp(-gamma * sum((x — xi²)). [Источник для этого отрывка: http://machinelearningmastery.com/]. а экспоненциальные ядра вычисляют линию разделения в более высоком измерении Это называется трюк ядра
Параметр регуляризации (часто называемый параметром C в библиотеке Python sklearn) сообщает оптимизации SVM, насколько вы хотите избежать неправильной классификации каждого обучающего примера.
Для больших значений C оптимизация выберет гиперплоскость с меньшим запасом, если эта гиперплоскость лучше справляется с правильной классификацией всех обучающих точек. И наоборот, очень маленькое значение C заставит оптимизатор искать разделяющую гиперплоскость с большим запасом, даже если эта гиперплоскость неправильно классифицирует большее количество точек.
Изображения ниже (такие же, как изображение 1 и изображение 2 в разделе 2) являются примерами двух разных параметров регуляризации. У левого есть некоторая неправильная классификация из-за более низкого значения регуляризации. Более высокое значение приводит к результатам, подобным правильному.
Слева: низкое значение регуляризации, справа: высокое значение регуляризации
Параметр гаммы определяет, насколько далеко простирается влияние одного обучающего примера, при этом низкие значения означают «далеко», а высокие значения означают «близость». Другими словами, при низкой гамме точки, находящиеся далеко от вероятной линии разделения, учитываются при расчете линии разделения. Поскольку высокая гамма означает, что при расчете учитываются точки, близкие к правдоподобной линии.
High GammaLow Gamma
И, наконец, последняя, но очень важная характеристика классификатора SVM. SVM to core пытается добиться хорошего запаса.
Поле — это разделение линии до ближайших точек класса.
A хорошая маржа – это та, где это разделение больше для обоих классов.