Машинное обучение для регулировки веса

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

Подробнее:

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

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

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

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

Примечание. Я работаю на python.

Я очень благодарен за вашу помощь.

Ответ 1

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

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

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

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

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

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

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

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

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

  • Вы можете вывести (относительный) вес каждой переменной из каждого расстояния node от корня - другими словами, от быстрого визуального осмотр обученного классификатор. Напомним, что обученный классификатор является просто двоичным деревом (и часто отображается таким образом), в котором узлы соответствуют одному значению одного функция (переменная или столбец в вашем набор данных); два края, соединенные с что node, конечно, представляют собой точки данных разбиты на две группы на основе каждого значения точки для этого (например, если эта функция является категориальная переменная "Публикация Дата в заголовке HTML-страницы? ", Затем через левый край будет течь все данных, в которых дата публикации не входит в открывающие и закрывающие головки, и правый node получает другой группа). Каково значение это? Поскольку a node просто представляет состояние или значение для конкретного переменная, эта переменная важность (или вес) в классификация данных может быть выведена от его положения в дерево - то есть, тем ближе к root node, тем важнее это.


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

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

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

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

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

[Примечание: добавлен код ниже в свете комментария OP ниже этого ответа, запрашивая пояснения.]

# 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

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

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