Ответ 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).