Aprendizaje automático en el trading: teoría, práctica, operaciones y más - página 24

 

Alexey, tengo otra pregunta sobre tu función para cribar predictores: ¿qué intervalo de valores de retorno debería tener? He ejecutado esa función de fitness en mis datos con entradas aleatorias (fitness_f(runif(predictor_number, min = 0, max = 1))), vi resultados de 0 a 0,03. También veo en el código que en caso de error (cero entradas) la función devolverá 0. Algo está mal aquí, GenSA intenta minimizar el resultado, es decir, al final GenSA sólo llegará a cero entradas y se detendrá. ¿Quizá entonces debamos cambiar el signo del resultado de la función de aptitud para que GenSA actúe en sentido contrario?
Si la función de aptitud en algún momento de la optimización comienza a devolver números negativos y cuanto más bajos sean, mejor - entonces todo está bien ahora.

 
Dr.Trader:

Alexey, tengo otra pregunta para tu función de cribado de predictores: ¿qué intervalo de valores de retorno debería tener? He ejecutado esa función de fitness en mis datos con entradas aleatorias (fitness_f(runif(predictor_number, min = 0, max = 1))), vi resultados de 0 a 0,03. También veo en el código que en caso de error (cero entradas) la función devolverá 0. Algo está mal aquí, GenSA intenta minimizar los resultados, es decir, al final GenSA sólo llegará a cero entradas y se detendrá. ¿Quizá entonces debamos cambiar el signo del resultado de la función de aptitud para que GenSA actúe en sentido contrario?
Si la función de aptitud en algún momento de la optimización comienza a devolver números negativos y cuanto más bajos sean, mejor - entonces todo está bien ahora.

Esa es una buena pregunta. Ya te lo imaginaste.

Estoy escribiendo un artículo sobre este método y aquí hay un extracto:


Diagrama de bloques del algoritmo basado en la información mutua corregida y la búsqueda estocástica de un subconjunto de predictores.


  • a) Categorizar el conjunto de datos en una de las formas conocidas.
  • b) Evaluar los parámetros del conjunto de datos, como el número de filas, los predictores, el número medio de niveles de los predictores (si tienen diferentes números de niveles) y, basándose en estos datos, calcular el "número óptimo" de predictores en el subconjunto final.
  • c) Inicializar un vector de tipo numérico con la longitud en el número de variables de entrada del conjunto, utilizando números aleatorios distribuidos uniformemente en el rango [0, 1] y asignar el límite inferior (0) y el superior (1) de los valores del vector - el argumento de la función SA.
  • d) Inicializar la función de evaluación de cuantiles de información múltiple, la función de cuantiles de información mutua y la función de aptitud que combina todos los cálculos.
  • e) Establezca el número de simulaciones de Monte Carlo para estimar los cuantiles del IM y del WI; establezca los cuantiles (por ejemplo, 0,9) para los valores de ruido del IM y del WI.
  • f) Establecer el tiempo o número de iteraciones del algoritmo. Cuanto más, mejor.
  • g) Ejecutar el algoritmo, esperar los resultados.


El punto "b" necesita una aclaración. El número óptimo de variables es un valor condicional que se calcula mediante la fórmula:

optim_var_num < - log(x = tamaño_de_muestra / 100, base = round(niveles_medios, 0))


La intuición es que, dada lasuposición de independencia de las variables de entrada, el número medio de niveles de una variable debe elevarse a la potencia necesaria para obtener un número total de niveles únicos que interactúen de forma que cada uno de ellos tenga de media al menos n observaciones concentradas, donde n se toma como 100.

No podemos tener demasiadas variables de entrada con demasiados niveles, ya que una estimación conservadora de la frecuencia de las observaciones sobre los niveles de entrada sería demasiado pequeña para dar una inferencia estadística sobre la dependencia de la variable de salida del conjunto de niveles de entrada.

Al establecer el umbral por encima del cual los valores de los vectores del número de variables de entrada se convertirán en 1 (el indicador de inclusión del índice de la variable), realizamos un cálculo probabilístico:

umbral < - 1 - optim_var_num / predictor_number


Su esencia es que establecemos el valor máximo de probabilidad para seleccionar el número óptimo calculado de entradas. Y esta lógica se comprueba aplicando la distribución binomial.

Por ejemplo, tomemos nuestros datos: la mitad del conjunto completo, que se utiliza para el entrenamiento.

Tenemos 17.973 filas, 12 predictores, cada uno con 5 niveles. Aplicando las fórmulas anteriores, obtenemos que el número óptimo de predictores es de 3.226.

Aplicando la fórmula del umbral para incluir un predictor en el conjunto, obtenemos 0,731.

¿Cuál es el número más probable de variables seleccionadas que se obtiene en una distribución binomial?


El máximo es de 3 observaciones. Para ser precisos, 5 ^ 3.226 nos daría 178 niveles, que darían cabida a una media de 100 observaciones cada uno.
 
Continúa. El valor 0 a la salida de la función es el valor máximo del peor caso. Si ningún elemento del vector par supera el umbral, automáticamente el valor es 0. El mejor valor posible es -1. Significa que la salida es completamente determinista a partir del subconjunto de entradas.
 

Sí, he encontrado un subconjunto de predictores con un valor de aptitud negativo. Había muchos predictores, varios miles, limité gensa a sólo 2 iteraciones, me llevó 8 horas :). El resultado de la función de aptitud es del 6%. En la prueba frontal de estos predictores con nnet obtuve un error del 45%. No es mucho, no creo que el EA tenga beneficios. He vuelto a poner un límite de 10 iteraciones para encontrar un mejor resultado, lo he ejecutado, he estado esperando 24 horas, espero que gensa alguna vez se complete. Tendré que probar la genética (biblioteca GA), funcionará más rápido con múltiples hilos (GA minimiza en lugar de maximizar el resultado, es decir, el resultado de la función de aptitud para GA debe cambiar su signo). Seguiré experimentando.

He leído varios artículos sobre el modelo de componentes principales y he intentado enseñar el modelo no sólo para medir R^2 y maximizarlo seleccionando predictores, sino también para probarlo en datos de fronttest. Está saliendo algo ambiguo. Por un lado, he incrementado el R^2 del modelo eliminando los pares de predictores correlacionados (función findCorrelation de bibiloteka caret), pero resulta que el R^2 al probar el modelo con los datos de fronttest disminuye. El milagro no se produjo, el modelo PCA también está reentrenado. Quiero probar una estimación de predictor más compleja - dividir la muestra de entrenamiento en dos - para el entrenamiento propiamente dicho y para la validación, entrenar el modelo PCA, luego probar inmediatamente en la muestra de validación, devolver el R^2 mínimo como resultado final. Si dicha función se utiliza para la evaluación de un conjunto de predictores y la maximización de este valor, entonces sólo se encontrarán aquellos conjuntos de predictores que den buenos resultados en los datos entrenados y nuevos. Tenemos que comprobarlo.

También debo haber entendido mal el texto de ese primer artículo sobre el PCA en este hilo. Decía que el número de componentes debe elegirse para describir el 95% de la variación, creía que hablaban de la precisión de la predicción de la variable objetivo. Pero no es así, los componentes principales se construyen sin variables objetivo en absoluto, y la precisión del 95% es la exactitud con la que se describen los datos brutos utilizando esos mismos componentes. Y la precisión de las predicciones no tiene nada que ver con esto.

 
Dr.Trader:

Sí, he encontrado un subconjunto de predictores con un valor de aptitud negativo. Había muchos predictores, varios miles, limité gensa a sólo 2 iteraciones, me llevó 8 horas :). El resultado de la función de aptitud es del 6%. En la prueba frontal de estos predictores con nnet obtuve un error del 45%. No es mucho, no creo que el EA tenga beneficios. He vuelto a poner un límite de 10 iteraciones para encontrar un mejor resultado, lo he ejecutado, he estado esperando 24 horas, espero que gensa alguna vez se complete. Tendré que probar la genética (biblioteca GA), funcionará más rápido con múltiples hilos (GA minimiza en lugar de maximizar el resultado, es decir, el resultado de la función de aptitud para GA debe cambiar su signo). Experimentaré más.

He leído varios artículos sobre el modelo de componentes principales y he intentado no sólo entrenar el modelo para medir R^2 y maximizarlo seleccionando predictores, sino también probar realmente el modelo en los datos de fronttest. Está saliendo algo ambiguo. Por un lado, he incrementado el R^2 del modelo eliminando los pares de predictores correlacionados (función findCorrelation de bibiloteka caret), pero resulta que el R^2 al probar el modelo con los datos de fronttest disminuye. El milagro no se produjo, el modelo PCA también está reentrenado. Quiero probar una estimación de predictor más compleja - dividir la muestra de entrenamiento en dos - para el entrenamiento propiamente dicho y para la validación, entrenar el modelo PCA, luego probar inmediatamente en la muestra de validación, devolver el R^2 mínimo como resultado final. Si dicha función se utiliza para la evaluación de un conjunto de predictores y la maximización de este valor, entonces sólo se encontrarán aquellos conjuntos de predictores que den buenos resultados en los datos entrenados y nuevos. Tendremos que comprobarlo.

Además, debo haber entendido mal el texto de ese primer artículo sobre el PCA en este hilo. Allí se decía, que el número de componentes debe ser elegido para describir el 95% de la variación, pensé que se referían a la precisión de la predicción de la variable objetivo. Pero no es así, los componentes principales se construyen sin variables objetivo en absoluto, y la precisión del 95% es la exactitud con la que se describen los datos brutos utilizando esos mismos componentes. Y la precisión de las predicciones no tiene nada que ver con esto.

Sí, resulta que no lo entiendes.

El ACP puede aplicarse como una herramienta independiente, pero el artículo no habla de ello.

Lo que se discute es cómo filtrar el ruido de un gran conjunto de predictores.

Según tengo entendido, esto se hace en los siguientes pasos:

1. Conciencia de Y. Se trata de escalar los predictores en función de la variable objetivo

2. Mediante el algoritmo PCA, se ordena un conjunto de predictores y se toma la parte que explica el 95% de la varianza.

2. O bien (no lo he calculado yo mismo) utilizando el algoritmo PCA, se construye un nuevo conjunto de predictores multiplicando el original por los coeficientes calculados (carga). Este conjunto está ordenado. Tomamos tantos de estos nuevos vectores como expliquen el 95% de la varianza.

PS.

Vamos a las publicaciones que Y-aware es el nuevo peep en el campo del filtrado de predicción de ruido.

Éxito

 
SanSanych Fomenko:

2. Mediante el algoritmo PCA, se ordena el conjunto de predictores y se toma la parte que explica el 95% de la varianza.

Esto aún no lo he descubierto. (A partir de ahora sólo escribiré sobre el enfoque "y", para no confundirlo con el otro). El artículo en sí está aquí:http://www.r-bloggers.com/principal-components-regression-pt-2-y-aware-methods/

Después del código"princ <- prcomp(dmTrain, center = FALSE, scale. = FALSE)" hay una situación: se leen los datos, se escalan por Y, se construyen los componentes de PC. Esta función no limita el número de componentes: tantos como predictores haya. Lo primero que hay que hacer es seleccionar sólo una parte de ellas (se recomienda describir el 95% de las variaciones). En el propio artículo el autor se fijó en la gráfica de sdev (unas variantes no especificadas) para los componentes, y dijo que con 2 o 5 sería suficiente, porque destacan en la gráfica. De alguna manera, nada destaca, el gráfico es suavemente decreciente.

Hay una tabla sdev, el número de entradas en ella es igual al número de componentes. ¿Es posible calcular cuántos componentes hay que tomar de esto? La suma de todos los números no se limita necesariamente a 1, he visto una suma de 6, y probablemente más.

> princ$sdev
[1] 0.17585066 0.15322845 0.13818021 0.13090573 0.12177070 0.11854969
[7] 0.11176954 0.10910302 0.10616631 0.10265987 0.10056754 0.09441041
[13] 0.09343688 0.08832101 0.08620753 0.08235531 0.08132748 0.07992235
[19] 0.07800569 0.07575063 0.07463254 0.07311194 0.07210698 0.07032990
[25] 0.06907964 0.06763711 0.06634935 0.06544930 0.06451703 0.06260861
 
Dr.Trader:

Todavía no lo he descubierto. (A partir de ahora sólo escribiré sobre el enfoque "y", para no confundirlo con el otro). El artículo en sí está aquí:http://www.r-bloggers.com/principal-components-regression-pt-2-y-aware-methods/

Después del código"princ <- prcomp(dmTrain, center = FALSE, scale. = FALSE)" tenemos esta situación: se leen los datos, se escalan por Y, se construyen los componentes PC. Esta función no limita el número de componentes: tantos como predictores haya. Lo primero que hay que hacer es seleccionar sólo una parte de ellas (se recomienda describir el 95% de las variaciones). En el propio artículo el autor se fijó en la gráfica de sdev (unas variantes no especificadas) para los componentes, y dijo que con 2 o 5 sería suficiente, porque destacan en la gráfica. De alguna manera, nada destaca, el gráfico es suavemente decreciente.

Hay una tabla sdev, el número de entradas en ella es igual al número de componentes. ¿Es posible calcular cuántos componentes hay que tomar de esto? La suma de todos los números no se limita necesariamente a 1, he visto una suma de 6, y probablemente más.

Hago un sonajero y obtengo tres mesas:

  • Desviaciones estándar: aquí puedes tener todo tipo de valores y decir que la suma = 1 no es necesaria
  • Rotación: son los coeficientes por los que debemos multiplicar los vectores originales para obtener los nuevos
  • Importancia de los componentes. lo que se discute

La última tiene la primera columna que dice que si se toma sólo PC1 se explicará 0,9761 de la variabilidad (Proporción Acumulada), si se toman DOS componentes - PC1 y PC2 se explicará 0,99996 etc.

(No sé cómo insertar tablas)

Importancia de los componentes:

PC1 PC2 PC3 PC4 PC5

Desviación estándar 2,2092 0,34555 0,01057 0,008382 0,004236

Proporción de la varianza 0,9761 0,02388 0,00002 0,000010 0,000000

Proporción acumulada 0,9761 0,99996 0,99998 1,000000 1,000000

 

Llevo mucho tiempo buscando esta tabla, por fin la he encontrado en el resumen. El lugar más obvio en realidad :) Gracias por mostrarlo. Este es el caso cuando algo está en el resumen, pero no en los atributos del objeto.

summary(princ)$importance[3,]

Resulta que ese artículo tiene una secuela, dedicada a la misma cuestión de la selección de componentes, con alguna solución especial para Y-aware. Todavía no lo he probado.

http://www.win-vector.com/blog/2016/05/pcr_part3_pickk/

 
Dr.Trader:

Llevo mucho tiempo buscando esta tabla, por fin la he encontrado en el resumen. El lugar más obvio en realidad :) Gracias por mostrarlo. Este es el caso cuando algo está en el resumen, pero no en los atributos del objeto.

Resulta que ese artículo tiene una secuela, dedicada a la misma cuestión de la selección de componentes, con alguna solución especial para Y-aware. Todavía no lo he probado.

http://www.win-vector.com/blog/2016/05/pcr_part3_pickk/

En este R, en cuanto se obtiene algún objeto, se le pone str y summary, y también plot. Puedes ver muchas cosas increíbles. La cuestión es que lo de los "objetos" en R es mucho más complicado que en muchos lenguajes de programación.
 
Dr.Trader:

Sí, he encontrado un subconjunto de predictores con un valor de aptitud negativo. Había muchos predictores, varios miles, limité gensa a sólo 2 iteraciones, me llevó 8 horas :). El resultado de la función de aptitud es del 6%. En la prueba frontal de estos predictores con nnet obtuve un error del 45%. No es mucho, no creo que el EA tenga beneficios. He vuelto a poner un límite de 10 iteraciones para encontrar un mejor resultado, lo he ejecutado, he estado esperando 24 horas, espero que gensa alguna vez se complete. Tendré que probar la genética (biblioteca GA), funcionará más rápido con múltiples hilos (GA minimiza en lugar de maximizar el resultado, es decir, el resultado de la función de aptitud para GA debe cambiar su signo). Experimentaré más.

He leído varios artículos sobre el modelo de componentes principales, y ahora he intentado no sólo entrenar el modelo para medir la R^2 y maximizarla seleccionando predictores, sino también probar realmente el modelo en los datos de fronttest. Está saliendo algo ambiguo. Por un lado, he incrementado el R^2 del modelo eliminando los pares de predictores correlacionados (función findCorrelation de bibiloteka caret), pero resulta que el R^2 al probar el modelo con los datos de fronttest disminuye. El milagro no se produjo, el modelo PCA también está reentrenado. Quiero probar una estimación de predictor más compleja - dividir la muestra de entrenamiento en dos - para el entrenamiento propiamente dicho y para la validación, entrenar el modelo PCA, luego probar inmediatamente en la muestra de validación, devolver el R^2 mínimo como resultado final. Si dicha función se utiliza para la evaluación de un conjunto de predictores y la maximización de este valor, entonces sólo se encontrarán aquellos conjuntos de predictores que den buenos resultados en los datos entrenados y nuevos. Tendremos que comprobarlo.

Además, debo haber entendido mal el texto de ese primer artículo sobre el PCA en este hilo. Allí se decía, que el número de componentes debe ser elegido para describir el 95% de la variación, pensé que se referían a la precisión de la predicción de la variable objetivo. Pero no es así, los componentes principales se construyen sin variables objetivo en absoluto, y la precisión del 95% es la exactitud con la que se describen los datos brutos utilizando esos mismos componentes. Y la precisión de las predicciones no tiene nada que ver con esto.

No entiendo muy bien por qué ha tardado tanto. ¿Cuántos optim_var_number obtuviste? Debería estar dentro de los 10. Ponlo a 1200 segundos y ya debería ser algo.