Cuando implementa algoritmos de aprendizaje automático, ¿cómo puede saber si su algoritmo es el enfoque incorrecto, si necesita ajustar los parámetros o si hay un error en su código?

@ Errores
Utilice varios conjuntos de datos de evaluación comparativa (por ejemplo, el Depósito de aprendizaje automático UCI ) para determinar si su algoritmo funciona mejor o peor en comparación con el estado actual de la técnica . Si su algoritmo funciona mal en todos los conjuntos de datos, es probable que su código contenga errores.

@ Ajuste de parámetros
Usando un único conjunto de datos de evaluación comparativa , mide el efecto del cambio de parámetros en el rendimiento. Si solo obtiene un buen rendimiento después de un ajuste extensivo de sus parámetros, esto podría ser una indicación de que su enfoque no es adecuado para la tarea en cuestión. Además, la inestabilidad numérica o la capacidad de respuesta no lineal dentro de los parámetros pueden ser buenos indicadores de dónde mejorar su algoritmo.

@ Enfoque incorrecto
Al resolver un problema práctico (es decir, minería de datos) es importante utilizar una biblioteca de aprendizaje automático . Esto descarta completamente cualquier error y debería aclarar cualquier problema con los parámetros . Solo después de saber qué enfoque (es decir, algoritmo, parámetros, atributos, etc.) funciona mejor para la tarea en cuestión, es posible que desee implementar este enfoque en su propio código.

Muestra aleatoriamente el 20% de los datos y capacítelos en ellos. Tome el otro 80% y ejecute el algoritmo en él. Juzgue su eficacia con respecto a un punto de referencia conocido (algoritmo simple de la biblioteca existente / lanzamiento de monedas / datos etiquetados). Si no funciona tan bien o mejor que el punto de referencia, hiciste algo mal. Si lo hizo, y cambia la implementación, use la última ejecución como punto de referencia.

Determinar lo que hiciste mal específicamente es altamente sensible al contexto. Pero en el orden de la investigación, debe elegir el algoritmo incorrecto, su implementación tiene errores y, por último, sus parámetros están equivocados (puede quedarse atrapado en el infierno de parámetros, por eso es el último).

Para error en el código:
Cree un conjunto de datos de juguete con puntos dispersos en el espacio dimensional N, separados por un clasificador lineal (con cero ruido). Casi todos los algoritmos deberían poder aprender el clasificador con bastante precisión, y debería obtener un tren y una precisión de prueba de aproximadamente el 95%. De lo contrario, hay una probabilidad muy alta de que haya un error o un error numérico / inestabilidad.
Pruebe esto en muchos de estos conjuntos de datos separables linealmente. Sus resultados deben ser consistentemente buenos.

Para el conjunto correcto de parámetros:
Para esto, la técnica más común es la validación cruzada. Divida el conjunto de datos en 2 partes: 80% y 20%. Sigue variando los parámetros y entrena con el 80%. Luego prueba con el 20%. Los buenos valores de los parámetros deben proporcionar aproximadamente la misma precisión tanto para el tren como para el conjunto de prueba, y deben tener una alta (probablemente la más alta) precisión de prueba.

Para el algoritmo correcto:
Entonces, hay dos partes en esto: (i) si la optimización dio un mínimo local razonablemente bueno (es decir, el algoritmo de optimización es adecuado), y (ii) si el clasificador aprendido después de que el problema de optimización se resolvió correctamente es lo suficientemente bueno o no .
Para (i), trace la función objetivo con respecto al número de iteraciones. Esto debería caer bruscamente al principio y luego saturarse.
Para (ii), trace la precisión del entrenamiento con respecto al número de iteraciones. Esto debería aumentar bruscamente y luego saturarse.
Además, debe verificar la solidez de su algoritmo. Para esto, nuevamente genere algunos conjuntos de datos simples para ver cómo funciona su algoritmo. Por ejemplo, debería ser capaz de aprender límites de decisión circulares y poligonales (tomar conjuntos de datos 2D y trazar los puntos y el límite de decisión aprendido para ver si se ve bien). Y luego intente algunos conjuntos de datos de referencia.

Utilice algunas medidas dinámicas que cambian en el tiempo de ejecución del algoritmo. Por ejemplo, si está utilizando algunos de los algoritmos basados ​​en la optimización, es posible que desee graficar el costo de la función objetivo en el transcurso del tiempo. Si se está moviendo, eso significa que algo está mal. La respuesta de Sam también es un buen ejemplo.

El ajuste de parámetros es la última consideración. Debe estar seguro de su implementación por adelantado. La mejor manera, pero que consume poco, es realizar una búsqueda en la cuadrícula en un rango de valores de parámetros razonables para diferentes ejecuciones del algoritmo y comparar los resultados para elegir el mejor. También hay mejores formas de utilizar fórmulas bayesianas que dan una buena estimación en menos tiempo.

Para ver si es el algoritmo correcto para el problema, debe buscar mucho antes del uso exacto y discernir sobre la debilidad del algoritmo que pretendía usar. Luego, aplique los candidatos en pequeños subconjuntos de datos (si tiene datos a gran escala) y compare los resultados.

En realidad, nada es prometedor que experimentar los algoritmos exactamente, todos los demás métodos y sugerencias son solo pequeñas heurísticas y aproximaciones a la mejor solución. Si eres capaz de manejar la carga de todas esas ejecuciones (donde Google diverge de otras) computacionalmente (no sé que esto es un adverbio pero aquí está) solo experimenta, no uses ningún método heurístico, pero si eres un solo guerrero, usa tu maestro conocimiento.

Algunas pequeñas ayudas:

http://www.cs.cornell.edu/~carua

http://www.cs.cmu.edu/~aarti/Cla…

En la línea de la respuesta de Justin, el error más grande en ML probablemente sea malinterpretar sus datos / tener una configuración incorrecta. Por ejemplo, es posible que desee predecir si un usuario cancelará o no un servicio de suscripción, por lo que intenta modelar P (Cancelar) tal vez a través de una regresión logística. Tal vez lo que realmente desea es el modelo P (Cancelar | La cuenta ha estado activa durante N días), por lo que en realidad es la función de riesgo que desea modelar. Tal vez su trabajo aguas abajo no pueda consumir una salida que es una curva, en cuyo caso su regresión fue la configuración correcta después de todo

Las técnicas de validación están ahí para rescatarte. Asegúrese siempre de no tocar el conjunto de validación durante el tiempo que entrena su modelo de aprendizaje.

Mirando los datos (por ejemplo, visualizando el punto) para decidir que el modelo de aprendizaje es incorrecto. Al hacerlo, no estamos teniendo en cuenta la dimensión VC correctamente, ya que el aprendizaje que ocurrió en nuestro cerebro cuando elegimos el modelo es bastante complejo de analizar en términos de la dimensión VC.

**Para editar**

Hay una cuarta posibilidad que debe considerar: el problema que está tratando de resolver podría no ser particularmente adecuado para las técnicas de aprendizaje. Por mucho que no pueda extraer sangre de un cálculo, no puede extraer la señal de un conjunto de datos si, para empezar, no está allí.

Lo primero que debe hacer es descartar errores. Las revisiones e inspecciones de códigos son probablemente la mejor herramienta para esto, ya que no tendrá casos de prueba estándar que pueda usar para verificar sus algoritmos. Haga que alguien más experimentado vea su código y vea si ve algún problema. Si no lo hacen, que alguien más mire. Si otras dos personas no ven problemas, probablemente no haya nada importante.

La verificación de gradiente es una técnica que se usa comúnmente para depurar el algoritmo de aprendizaje de retropropagación utilizado para entrenar redes neuronales. Sin embargo, se puede usar para cualquier algoritmo de aprendizaje basado en gradiente.

La idea básica es calcular una derivada numérica de diferencia de dos lados usando su función de costo y luego compararla con su derivada simbólica. Si están lo suficientemente cerca, entonces su derivado simbólico probablemente esté libre de errores.
Con una función de costo [matemática] J (\ theta) [/ matemática] un gradiente numérico es [matemática] J ‘(\ theta) \ aprox \ frac {J (\ theta – \ epsilon) + J (\ theta + \ epsilon )} {2 \ times \ epsilon} [/ math] donde [math] \ epsilon [/ math] es un valor pequeño, digamos 10e-4. Compare su valor para [math] J ‘(\ theta) [/ math] con su derivada simbólica, si difieren en menos de 10e-4, entonces su derivada simbólica probablemente sea correcta.

Para la depuración, puede crear conjuntos de datos sintéticos (los pequeños funcionarán bien si no desea generarlos con un programa) para los que sabe cuál debería ser la respuesta. En cuanto a continuar ajustando frente a abandonar un enfoque incorrecto, debe preguntarle a alguien con experiencia. Alguien que ha estado perforando petróleo durante años tiene una gran intuición del panorama general y exactamente por qué las cosas funcionarían o no en un nivel fundamental.

Ya hay excelentes respuestas para esta pregunta.
Uno más piensa:
Genere un ejemplo sintético para el que conozca el modelo y el parámetro.
La forma más rápida de encontrar un error.

Trace siempre su función de costo y vea cómo cambia su valor después de cada iteración. Ofrece grandes ideas sobre lo que podría estar mal.