Машинное обучение для регулировки веса - PullRequest
10 голосов
/ 05 июля 2011

Я пытаюсь понять, как реализовать какую-то библиотеку машинного обучения, чтобы помочь мне определить, какой правильный вес для каждого параметра используется для принятия правильного решения.

Более подробно:

Контекст: попытка реализовать экстрактор даты публикации для html-файлов. Это для новостных сайтов, поэтому у меня нет общего формата даты, который я мог бы использовать. Я использую парсер в dateutil в python, который делает довольно хорошую работу. Я получаю список возможных дат публикации (все даты в html-файле).

Из набора параметров, таких как закрывающие теги, слова, близкие к подстроке даты, и т. Д. Я сортирую список по вероятности того, что это будет дата публикации. Весовые коэффициенты для каждого параметра являются как-то образованными догадками.

Я хотел бы реализовать алгоритм машинного обучения, который после обучения период (в котором указана фактическая дата публикации) определяет, какой должен быть весовой коэффициент для каждого параметра.

Я читал документацию по различным библиотекам машинного обучения на python (pyML, scikit-learn, pybrain), но я не нашел ничего полезного. Я также прочитал this , и есть близкий пример с определением, является ли гриб съедобным или нет.

Примечание: я работаю в Python.

Буду очень признателен за вашу помощь.

Ответы [ 2 ]

11 голосов
/ 06 июля 2011

Учитывая ваше описание проблемы, характеристики ваших данных, ваш опыт работы с ML и личные предпочтения, я бы порекомендовал Orange .

Orange - это зрелый, бесплатный и открытый проект сбольшой выбор алгоритмов ML и отличная документация и учебные материалы.Большинство пользователей, вероятно, используют графический интерфейс, поставляемый с Orange, но среда поддерживает сценарии с Python.

Следовательно, использование этой среды, конечно, позволит вам быстро экспериментировать с различными классификаторами, потому что (i) все они в одном месте;и (ii) каждый получает доступ к общему синтаксису конфигурации GUI.Все методы ML в среде Orange могут быть запущены в «демонстрационном» режиме с одним или несколькими примерами наборов данных, поставляемых с установкой Orange.Документация, поставляемая в Orange Install, превосходна.Кроме того, домашняя страница содержит ссылки на многочисленные учебные пособия, которые охватывают, вероятно, все техники ML, включенные в каркас.

Учитывая вашу проблему, возможно, начните с Дерево решений алгоритм (либо C4.5 , либо ID3 реализация).Довольно недавнее издание Dr. Dobbs Journal (онлайн) включает отличную статью об использовании деревьев решений;вариант использования - данные веб-сервера (из журнала доступа к серверу).

Orange имеет реализацию C4.5 , доступную в графическом интерфейсе (в виде «виджета»).Если это слишком просто, то для того, чтобы закодировать одну в Python, нужно около 100 строк. Здесь - источник работающей реализации на этом языке

Я рекомендую начинать с дерева решений по нескольким причинам.

  1. Если он работает с вашими данными, у вас будет не только обученный классификатор, но и визуальное представление всей схемы классификации (представленное в видедвоичное дерево).Деревья решений (вероятно) являются уникальными среди методов ML в этом отношении.

  2. Характеристики ваших данных соответствуют сценарию оптимальной производительности C4.5;данные могут быть категориальными или непрерывными переменными (хотя этот метод работает лучше, если больше функций (столбцов / полей) дискретнее, чем непрерывно, что, по-видимому, описывает ваши данные);также алгоритмы дерева решений могут принимать, без какой-либо предварительной обработки, неполные точки данных

  3. простая предварительная обработка данных. данные, поступающие в алгоритм дерева решений, нетребует столько предварительной обработки данных, сколько и большинство других методов ОД;предварительная обработка часто (обычно?) является самой трудоемкой задачей во всем рабочем процессе ML.Это также редко документировано, поэтому, вероятно, это также наиболее вероятный источник ошибок.

  4. Вы можете вывести (относительный) вес каждой переменной на расстоянии каждого узла от корня.Другими словами, из быстрого визуального осмотра обученного классификатора .Напомним, что обученный классификатор представляет собой просто двоичное дерево (и часто отображается таким образом), в котором узлы соответствуют одному значению одного объекта (переменной или столбцу в вашем наборе данных);два ребра, соединенные с этим узлом, конечно, представляют точки данных, разделенные на две группы на основе значения каждой точки для этого объекта (например, если объект является категориальной переменной «Дата публикации в HTML-заголовке страницы?», то через левый крайбудут передаваться все точки данных, в которых дата публикации не входит в открывающую и закрывающую метки заголовка, а правый узел получает другую группу).Каково значение этого?Поскольку узел просто представляет состояние или значение для конкретной переменной, важность (или вес) этой переменной в классификации данных можно определить по ее положению в дереве, т. Е. Чем ближе она находится к корневому узлу, тем важнееэто.

Судя по вашему Вопросу, вам кажется, что вам нужно выполнить две задачи, прежде чем вы сможете передать свои данные тренировок в классификатор ML.

I. определить правдоподобные метки классов

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

Учитывая, что ваша переменная ответа является датой, простой подход состоит в том, чтобы установить самую раннюю дату в качестве базовой линии, 0, а затем представить все другие даты в виде целочисленного значения, которое представляет расстояние от этой базовой линии. Затем, дискретизируйте все даты в небольшое число диапазонов . Один из очень простых способов сделать это - вычислить пять сводных описательных статистик для вашей переменной ответа (мин. 1-й квартиль, среднее значение, 3-й квартиль и максимум). Из этих пяти статистических данных вы получаете четыре разумно выбранных диапазона дат (хотя, вероятно, не одинакового диапазона или одинакового размера членства.

Эти четыре диапазона значений даты представляют ваши метки классов - так, например, classI может быть всеми точками данных (веб-страницами, я полагаю), чья переменная ответа (дата публикации) составляет от 0 до 10 дней после 0; Класс II - 11 дней после 0-25 дней после 0 и т. д.

[Примечание: добавлен код ниже в свете комментария ФП под этим ответом с просьбой пояснить.]

# suppose these are publication dates
>>> pd0 = "04-09-2011"      
>>> pd1 = "17-05-2010"
# convert them to python datetime instances, e.g., 
>>> pd0 = datetime.strptime(pd0, "%d-%m-%Y")
# gather them in a python list and then call sort on that list:
>>> pd_all = [pd0, pd1, pd2, pd3, ...]
>>> pd_all.sort()
# 'sort' will perform an in-place sort on the list of datetime objects,
# such that the eariest date is at index 0, etc.
# now the first item in that list is of course the earliest publication date
>>> pd_all[0]
datetime.datetime(2010, 5, 17, 0, 0)
# express all dates except the earliest one as the absolute differenece in days
# from that earliest date
>>> td0 = pd_all[1] - pd_all[0]           # t0 is a timedelta object
>>> td0
datetime.timedelta(475)     
# convert the time deltas to integers:
>>> fnx = lambda v : int(str(v).split()[0])
>>> time_deltas = [td0,....]
# d is jsut a python list of integers representing number of days from a common baseline date
>>> d = map(fnx, time_deltas)    

II. преобразуйте ваши необработанные данные в форму "ML-useable".

Для классификатора C4.5 эта задача гораздо проще и требует меньше шагов, чем, вероятно, для любого другого алгоритма ML. какой здесь предпочтительным является дискретизация относительно небольшого числа значений, как можно больше ваших параметров, например, если один из ваших параметров / переменных «расстояние строки даты публикации от закрывающего тега тела», то я бы предложить разделить эти значения на диапазоны, так как маркетинговые опросы часто спрашивают участники должны сообщить свой возраст в одном из указанных диапазонов (18 - 35; 36 - 50 и т. д.) а не как одно целое число (41).

2 голосов
/ 06 июля 2011

Предполагается, что вам нужно машинное обучение (набор документов достаточно большой, количество новостных сайтов достаточно велико, что написание анализаторов для каждого сайта является громоздким, URL-адреса не содержат каких-либо очевидных маркеров даты публикации, заголовки HTTP Last-Modified ненадежны и т. д.) - вы можете рассмотреть такой подход, как:

  • используйте деревья решений, байесовское обучение или что-то еще, чтобы превратить ваши текстовые особенности в особенности сортировки типа «как я думаю, вероятность того, что эта дата будет датой публикации…»;
  • использовать максимальное обучение для вычисления весов (для которых, например, http://www -i6.informatik.rwth-aachen.de / web / Software / YASMET.html полезно.)
...