2010-01-14 13 views
8

Будучи студентом вычислительной лингвистики, я часто выполняю эксперименты по компьютерному обучению, где мне приходится готовить данные обучения из всех видов различных ресурсов, таких как сырые или аннотированные текстовые тела или банки синтаксических деревьев. Для каждой новой задачи и каждого нового эксперимента я пишу программы (обычно в Python, а иногда и Java), чтобы извлекать нужные мне функции и значения и преобразовывать данные из одного формата в другой. Обычно это приводит к очень большому количеству очень больших файлов и очень большому числу небольших программ, которые обрабатывают их, чтобы получить вход для некоторых рамок для машинного обучения (например, файлы arff для Weka).Общие рамки подготовки учебных данных?

Нужно быть очень хорошо организованным, чтобы справляться с этим и программировать с большой осторожностью, чтобы не пропустить какие-либо важные особенности, исключения или ошибки в тоннах данных. Многие принципы хорошего дизайна программного обеспечения, такие как шаблоны проектирования или парадигмы рефакторинга, не имеют большого значения для этих задач, поскольку такие вещи, как безопасность, ремонтопригодность или устойчивость, не имеют никакого реального значения - как только программа успешно обработала данные, она больше не нужна. Это зашло так далеко, что я даже переставал беспокоиться об использовании классов или функций вообще в моем коде и программе Python простым процедурным способом. В следующем эксперименте потребуются разные наборы данных с уникальными характеристиками и в другом формате, так что их подготовка, вероятно, будет запрограммирована с нуля в любом случае. Мой опыт до сих пор заключается в том, что нередко тратить 80-90% времени проекта на задачу подготовки учебных данных. Часы и дни идут только на размышления о том, как добраться из одного формата данных в другой. Время от времени это может стать довольно неприятным.

Ну, вы, наверное, догадались, что я преувеличиваю, но я уверен, что вы понимаете, что я пытаюсь сказать. Мой вопрос, на самом деле, таков:

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

+0

Основываясь на моем опыте в школьной школе, я не считаю это преувеличением вообще. :П – ealdent

ответ

2

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

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

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

1

Мне не известны никакие такие рамки - не означает, что они не там. Я предпочитаю использовать свой собственный, который представляет собой всего лишь набор фрагментов кода, которые я уточнил/подделал/заимствовал с течением времени, и что я могу объединиться в разных конфигурациях в зависимости от проблемы. Если вы уже знаете python, я настоятельно рекомендую обрабатывать все ваши данные в NumPy - как вы знаете, ML-наборы данных имеют тенденцию быть большими - тысячи векторов строк, упакованных с поплавками. NumPy является блестящим для такого рода вещей. Кроме того, я мог бы предположить, что для подготовки данных обучения для ML существует несколько задач, которые возникают почти во всех таких усилиях и которые не меняются в значительной степени от одной проблемы к другой. Я даю вам фрагменты для них ниже.

нормализация (масштабирование & среднее центрирования данных, чтобы избежать превышения загрузки. Как я уверен, что вы знаете, вы можете масштабировать -1 до 1 или от 0 до 1.Я обычно выбираю последнее, чтобы я мог использовать шаблоны разреженности. В Python, используя библиотеку NumPy:

import numpy as NP 
data = NP.linspace(1, 12, 12).reshape(4, 3) 
data_norm = NP.apply_along_axis(lambda x : (x - float(x.min()))/x.max(), 
              0, data) 

перекрестной проверки (здесь я уже установлен аргумент по умолчанию в «5», так что тест набор 5%, обучающее множество, 95% - это положить в функции делает к-фолд намного проще)

def divide_data(data, testset_size=5) : 
    max_ndx_val = data.shape[0] -1 
    ndx2 = NP.random.random_integers(0, max_ndx_val, testset_size) 
    TE = data_rows[ndx2] 
    TR = NP.delete(data, ndx2, axis=0) 
    return TR, TE 

Наконец, здесь отличный case study (ИМХО), как ясно и полно, показывая буквально весь процесс от сбора исходных данных через вход в алгоритм ML (MLP в этом случае). Они также предоставляют свой код.