Библиотека LIBSVM

Из предыдущего раздела вам, наверное, ясно, как и почему работают машины опорных векторов, но в их обучении задействованы математические методы, требующие огромного объема вычислений и выходящие далеко за рамки этой статьи. Поэтому мы воспользуемся библиотекой LIBSVM с открытыми исходными текстами, которая позволяет обучить SVM-модель, делать прогнозы и проверять их на том же наборе данных. В нее даже встроена поддержка функции радиального базиса и других ядерных методов.

Получение LIBSVM

Скачать библиотеку LIBSVM можно со страницы http://www.csie.ntu. edu.tw/~cjlin/libsvm.

Она написана на языке C++, но имеется также версия на Java. В дистрибутив входит обертка svm.py для вызова из программ на Python. Чтобы ею воспользоваться, необходима версия LIBSVM, откомпилированная под вашу платформу. Для Windows в дистрибутиве имеется готовая DLL – svmc.dll. (Для версии Python 2.5 этот файл нужно переименовать в svmc.pyd, так как она не умеет импортировать библиотеки с расширением DLL.) В документации, поставляемой вместе с LIBSVM, описывается, как откомпилировать ее на других платформах.

Пример сеанса

Поместите откомпилированную версию LIBSVM и пакет svm.py в свою рабочую папку или в папку, где интерпретатор Python ищет библиотеки. Теперь можно импортировать ее и попытаться решить простую задачку:

>>> from svm import * Первым делом создадим простой набор данных. LIBSVM читает данные из кортежа, содержащего два списка. Первый список содержит классы, второй – исходные данные. Попробуем создать набор данных всего с двумя классами:

>>> prob = svm_problem([1,-1],[[1,0,1],[-1,0,-1]]) Еще нужно с помощью функции svm_parameter задать ядро, которым вы собираетесь пользоваться:

>>> param = svm_parameter(kernel_type = LINEAR, C = 10) Далее следует обучить модель: >>> m = svm_model(prob, param)

optimization finished, #iter = 1 nu = 0.025000

ob] = -0.250000, rho = 0.000000 nSV = 2, nBSV = 0 Total nSV = 2

И наконец воспользуемся ею для прогнозирования принадлежности классам:

>>> m.predict([1, 1, 1])

1.0

Это вся функциональность LIBSVM, которая вам нужна для создания модели по обучающим данным и последующего прогнозирования.

У библиотеки LIBSVM есть еще одна полезная особенность – возможность сохранять и загружать обученные модели:

>>> m.save(test.model) >>> m=svm_model(test.model)

Применение метода опорных векторов к набору данных для подбора пар

Чтобы применить библиотеку LIBSVM к набору данных для подбора пар, следует преобразовать его в кортеж списков, необходимый функции svm_ model. Это простое преобразование можно записать в одной строке:

>>> answers,inputs=[r.match for r in scaledset],[r.data for r in scaledset] Мы снова применили масштабирование, чтобы избежать приписывания переменным чрезмерно большого веса, поскольку это улучшает результаты работы алгоритма. Воспользуемся описанными выше функциями для генерирования нового набора данных и построения модели, взяв в качестве ядра функцию радиального базиса:

>>> param = svm_parameter(kernel_type = RBF) >>> prob = svm_problem(answers,inputs)

>>> m=svm_model(prob,param)

*

optimization finished, #iter = 319 nu = 0.777538

ob] = -289.477708, rho = -0.853058 nSV = 396, nBSV = 380 Total nSV = 396

Теперь можно делать прогнозы относительно того, составят ли пару два человека с заданными атрибутами. Необходимо вызывать функцию scale для масштабирования оцениваемых данных, чтобы переменные были выражены в том же масштабе, что и построенная модель:

>>> newrow=[28.0,-1,-1,26.0,-1,1,2,0.8] # Мужчина не хочет иметь детей, а женщина хочет

>>> m.predict(scalef(newrow)) 0.0

>>> newrow=[28.0,-1,1,26.0,-1,1,2,0.8] # Оба хотят иметь детей >>> m.predict(scalef(newrow))

1.0

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

Проверим качество модели с помощью перекрестного контроля. Функция принимает параметр n и разбивает набор данных на n частей. Затем

каждая часть последовательно используется в качестве тестового набора, в то время как остальные служат для обучения. Функция возвращает список ответов, который вы можете сравнить с исходным списком. >>> guesses = cross_validation(prob, param, 4)

>>> guesses

[0.0, 0.0, 0.0, 0.0, 1.0, 0.0,… 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,… 1.0, 1.0, 0.0, 0.0, 0.0, 0.0,… … ]

>>> sum([abs(answers[i]-guesses[i]) for i in range(len(guesses))])

116.0

Количество расхождений между ответами и прогнозами равно 116. Поскольку в исходном наборе всего 500 строк, то 384 прогноза оказались правильными. Если хотите, можете прочитать в документации по LIBSVM про другие ядра и параметры и посмотреть, удастся ли добиться улучшения путем изменения param.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100