- Primero vamos a jugar con el ajuste/aprendizaje de la red.
Descárgate el fichero base, nuevamente para el problema de los precios de las casas. Aparte de lo de otras veces, prueba a tocar:
- Distintas posibilidades de preproceso. Analiza qué importancia tiene. Tienes:
- mediavar
- media nula y varianza unidad
- normalpow
- otro método para lo mismo, en caso de que te diera problemas el anterior
- medianavar
- llevarlo a mediana 0, intercuartil 1; robusto si tienes abundantes valores extremos
- normalquant
- otro variante de la misma idea
- unifor
- ecualización (distribución uniforme)
- rango1
- mínimo a 0, máximo a 1
- pca
- decorrelar mediante PCA
- aleat
- proyección aleatoria
- La función de error a optimizar. Tienes como opciones:
- nn.MSELoss
- error medio cuadrático
- nn.L1Loss
- error medio en valor absoluto
- nn.SmoothL1Loss
- cuadrático en errores bajos y lineal en altos
- nn.BCELoss
- entropía cruzada para clasificaciones binarias
- nn.CrossEntropyLoss
- ídem para múltiples clases (usar con función de salida
Softmax
)
- error.ErrorPropio('satura')
- logaritmo del error medio cuadrático
- error.ErrorPropio('maximo')
- máximo valor absoluto de error
- error.ErrorPropio('medabs')
- mediana de los valores absolutos de los errores
- error.ErrorPropio('d2')
- verosimilitud de distribución gamma
- el método de ajuste que utiliza la red. Puedes probar con SGD, LBFGS, Rprop, RMSprop, Adam, Adagrad, ASGD. Aumenta la velocidad lo que puedas que no se desestabilice.
- el método de dar los valores iniciales a los pesos. Prueba con 'inibase', 'inio', 'inixn', 'inixu', 'initn', 'initd'
- Si quieres más control sobre el ajuste, puedes ir cambiando la velocidad. Para ello, en la llamada de ajuste, pones en
control
'paso' o 'ajuste' o 'validación', según en qué quieras que se fije para cambiar la velocidad.
- paso
- pones en
ajusteveloc
un texto cuyo valor sea una función lambda que aplique un factor multiplicativo a la velocidad inicial; va a recibir como argumento el paso de iteración; Un ejemplo (interesante)): lambda paso: 1/(1+k*paso)
Prueba distintos valores de k, pero en cualquier caso pequeños (centésimas)
- factor
- pones en
ajusteveloc
un texto cuyo valor sea una función lambda que aplique un factor multiplicativo a la velocidad del paso previo; va a recibir como argumento el paso de iteración; Un ejemplo puede ser: lambda paso: 0.99 if paso<20 else 0.95
- ajuste o validación
- en
ajusteveloc
pones directamente el factor multiplicativo, que aplicará cuando vea que ese error no avanza
- También puedes intentar robustecer el ajuste inyectando ruido. Puedes hacerlo con las siguientes variables, cuyo valor, de no ser nulo, será la ganancia de la perturbación (centésimas o milésimas):
- ruidodatos
- las entradas
- ruidosal
- las salidas
- ruidosal
- los pesos
¿Con qué métodos, y con qué parámetros, obtienes mejores resultados?
- Ahora vamos a tratar de estimar el error en generalización.
Ya sabemos que medimos la eficiencia del modelo por el error de predicción. Pero, en primer lugar, no debemos medirlo sobre la muestra de ajuste, sino sobre un conjunto más general. En segundo lugar, una sola estimación seguramente no es suficiente. Por ello vamos a obtener varias estimaciones. Estimamos varias veces y obtenemos finalmente el histograma de medidas de error en las distintas pruebas. Los métodos que vienen a continuación se diferencian en cómo se elige los conjuntos de puntos de ajuste dentro de la muestra completa de la que disponemos. En todos vas a tener que ajustar repetidamente.
- Partición separada de ajuste y prueba:
Es lo que venimos haciendo hasta ahora, pero en realidad deberíamos hacer varios casos, para eliminar la influencia aleatoria de una partición concreta.
- Bootstrap:
En este caso elegimos conjuntos de puntos para el ajuste utilizando un muestreo con reemplazo.
- Validación cruzada:
Este caso es equivalente al anterior sólo que el método de selección no es un muestreo con reemplazo, sino una partición aleatoria de la muestra completa.
- Un inconveniente de dividir en ajuste, validación y prueba es que perdemos puntos para el ajuste. Una forma de evitar esto es usar
el método de remuestreo para controlar el ajuste. La idea es hacer varias pruebas de las anteriores y luego usar esa información en el ajuste en la red definitiva. Para hacer esto, elige una función para estimar el límite de ajuste a partir de las pruebas anteriores: median, mean, geometric_mean o harmonic_mean y luego activa ese reajuste final. Al final ¿con qué te quedas?