2010-01-14 12 views
8

Como estudiante de lingüística computacional, con frecuencia hago experimentos de aprendizaje automático donde tengo que preparar los datos de entrenamiento de todo tipo de recursos diferentes, como los corpus de texto sin formato o anotados o los bancos de árbol sintáctico. Para cada nueva tarea y cada nuevo experimento, escribo programas (normalmente en Python y, a veces, en Java) para extraer las características y valores que necesito y transformar los datos de un formato a otro. Esto generalmente da como resultado una gran cantidad de archivos muy grandes y una gran cantidad de programas pequeños que los procesan para obtener la entrada de algún marco de aprendizaje automático (como los archivos arff para Weka).Marcos generales para preparar los datos de entrenamiento?

Uno necesita estar muy bien organizado para tratar con eso y programar con gran cuidado para no perder ninguna peculiaridad importante, excepciones o errores en las toneladas de datos. Muchos principios de un buen diseño de software como patrones de diseño o paradigmas de refactorización no son un gran uso para estas tareas porque cosas como la seguridad, la mantenibilidad o la sostenibilidad no tienen importancia real: una vez que el programa procesó los datos con éxito ya no los necesita. Esto ha llegado tan lejos que incluso dejé de molestarme en utilizar clases o funciones en absoluto en mi código y programa de Python de una manera sencilla de procedimiento. El próximo experimento requerirá diferentes conjuntos de datos con características únicas y en un formato diferente para que su preparación tenga que ser programada desde cero de todos modos. Mi experiencia hasta ahora es que no es inusual gastar entre el 80% y el 90% del tiempo de un proyecto en la tarea de preparar datos de capacitación. Las horas y los días solo pasan cuando se piensa en cómo pasar de un formato de datos a otro. En ocasiones, esto puede ser bastante frustrante.

Bueno, probablemente has adivinado que estoy exagerando un poco, incluso a propósito, pero estoy seguro de que entiendes lo que estoy tratando de decir. Mi pregunta, en realidad, es esta:

¿Existen marcos generales, arquitecturas, mejores prácticas para abordar estas tareas? ¿Cuánto del código que escribo puedo esperar ser reutilizable si tengo un diseño óptimo?

+0

De acuerdo con mi experiencia en la escuela de posgrado, no considero que sea una exageración en absoluto. :PAG – ealdent

Respuesta

2

me encuentro utilizando principalmente las textutils de GNU coreutils y Flex para la preparación corpus, el encadenamiento de las cosas en las secuencias de comandos simples, al menos cuando las preparaciones Necesito hacer son lo suficientemente simple para expresiones regulares y el filtrado trivial etc.

Todavía es posible hacer cosas reutilizables, las reglas generales también se aplican aquí. Si está programando sin tener en cuenta las mejores prácticas y similares y simplemente programa de forma procedimental, en mi humilde opinión realmente no es de extrañar que tenga que hacer todo desde el principio al comenzar un nuevo proyecto.

Aunque los requisitos de formato variarán mucho, todavía hay muchas tareas comunes, es decir. tag-stripping, tag-translation, selection, tabulation, algunos datos triviales de recolección como el número de tokens, oraciones y similares. Programar estas tareas para una alta reutilización dará sus frutos, aunque al principio lleve más tiempo.

1

No conozco ninguno de esos marcos, no significa que no estén ahí. Prefiero usar el mío, que es solo una colección de fragmentos de código que he refinado/modificado/prestado con el tiempo y que puedo encadenar en varias configuraciones dependiendo del problema. Si ya conoces a Python, te recomiendo encarecidamente manejar toda tu preparación de datos en NumPy, como sabes, los conjuntos de datos ML suelen ser grandes, miles de vectores fila llenos de flotadores. NumPy es brillante para ese tipo de cosas. Además, podría sugerir que para preparar los datos de entrenamiento para ML, hay un par de tareas que surgen en casi todos los esfuerzos y que no varían mucho de un problema al siguiente. Te he dado fragmentos de estos a continuación.

normalización (escalamiento & sus datos para evitar sobreponderar. Como estoy seguro de que sabes, puede escalar -1 a 1 o 0 a 1-centrado media.Por lo general, elijo este último para que pueda aprovechar los patrones de dispersión. En Python, utilizando la biblioteca 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) 

validación cruzada (en este caso es que me he puesto el argumento por defecto en '5', de modo de prueba es de 5%, conjunto de entrenamiento, el 95% - poner este en una función hace k veces mucho más simple)

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 

por último, aquí es una excelente case study (en mi humilde opinión), a la vez clara y completa, mostrando, literalmente, todo el proceso desde la recolección de los datos en bruto a través de entrada al algoritmo ML (un MLP en este caso). También proporcionan su código.

Cuestiones relacionadas