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

 
Rorschach:

En el caso de un bosque, existe la opción de mirar la importancia y los clusters. En catbust es probablemente plot_tree.

Prepararé los datos y los publicaré.

Hice una versión de prueba para 6 columnas, tomó 11GB. Notepad++ no pudo abrirlo, dice que el archivo es demasiado grande. BD Browser for SQLite se ha colgado durante unos 20 minutos.

Muestra una imagen de cómo son los racimos de árboles, aún no sé de qué se trata.

¿Por qué abrirlo? :) Sólo hago una mini copia con una estructura similar para depurar.

 
elibrarius:

Me pregunto cómo se entrenan los árboles sin tomar todos los datos en la memoria. Si la tabla es de 6 gigabytes, entonces se deben utilizar unos 6 gigabytes de memoria. El árbol debe ordenar cada columna como un todo. Si no ponemos todo en la memoria, sino que leemos los datos del disco cada vez, será demasiado lento.
La única variante es mantener los datos en memoria en tipo float en lugar de double, pero esto reducirá la precisión. Para nosotros, con 5 dígitos de precisión, puede no ser tan malo, pero catbust es un software universal, creo que los problemas físicos y matemáticos deberían resolverse en doble precisión.

No he estudiado el código, pero si lo piensas lógicamente, CatBoost probablemente convierte la tabla de datos de muestra y almacena exactamente la variante convertida, lo que se presta a una rápida compresión.

La transformación se produce en una rejilla de cuantificación de cada predictor (hay 6 algoritmos disponibles), y, por ejemplo, de 1000 valores diferentes de una variable quedan 32 variantes (que caen en el rango de una rejilla de cuantificación) y tal vector de datos se comprime fácilmente, además de cifras ya sólo enteras (a juzgar por las restricciones de tamaño de una rejilla - tipo de datos ushort - 2 bytes en un número), y la tabla de cuantificación simplemente se encuentra en la memoria y se utiliza ya entonces en la creación del modelo en un código. Ahora ya hemos reducido el tamaño, y además es posible reducir el volumen eligiendo no todos los predictores para la evaluación, sino su parte, lo que se recomienda hacer en muestras grandes, en las que el algoritmo del aleatorizador permite utilizar en otros árboles aquellos predictores, que no han entrado en la "bolsa" a la vez, debido a esto el entrenamiento será también más rápido, pero habrá más árboles en el modelo. Seguramente hay otros trucos, pero el principal es la cuantificación.

La cuantificación debe considerarse por separado, lo ideal es que cada predictor se empareje con su propia rejilla y que los datos se presenten para el entrenamiento junto con la rejilla, lo que permite al algoritmo hacerlo.

Así, la muestra puede ser autocuantizada y estará bien comprimida.

 
Aleksey Vyazmikin:

No he estudiado el código, pero si lo piensas lógicamente, CatBoost probablemente transforma la tabla de datos de muestra y almacena exactamente las variantes transformadas, que son susceptibles de una rápida compresión.

La transformación se produce en una rejilla de cuantificación de cada predictor (hay 6 algoritmos disponibles), y, por ejemplo, de 1000 valores diferentes de una variable quedan 32 variantes (que caen en el rango de una rejilla de cuantificación) y tal vector de datos se comprime fácilmente, además de cifras ya sólo enteras (a juzgar por las restricciones de tamaño de una rejilla - tipo de datos ushort - 2 bytes en un número), y la tabla de cuantificación simplemente se encuentra en la memoria y se utiliza ya entonces en la creación del modelo en un código. Ahora ya hemos reducido el tamaño, y además es posible reducir el volumen eligiendo no todos los predictores para la evaluación, sino su parte, lo que se recomienda hacer en muestras grandes, en las que el algoritmo del aleatorizador permite utilizar en otros árboles aquellos predictores, que no han entrado en la "bolsa" a la vez, debido a esto el entrenamiento será también más rápido, pero habrá más árboles en el modelo. Seguramente hay otros trucos, pero el principal es la cuantificación.

La cuantificación debe considerarse por separado, lo ideal es que cada predictor se empareje con su propia rejilla y que los datos se presenten para el entrenamiento junto con la rejilla, lo que permite al algoritmo hacerlo.

Por eso la muestra puede cuantificarse por sí misma y estará bien comprimida.

Cierto, creo que hay una parrilla por defecto de 1024 variantes de división. Si se sustituyen todos los datos por números divididos, se puede almacenar en formato ushort, lo que supone 2 bytes en lugar de 8, una compresión 4 veces mayor. Probablemente por eso usaste 2gb en lugar de 6.
Ahora entiendo para qué se utiliza esta rejilla, resulta que es para la compresión. Y es más rápido de ordenar.
Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
  • www.mql5.com
Целый тип char занимает в памяти 1 байт (8 бит) и позволяет выразить в двоичной системе счисления 2^8 значений=256. Тип char может содержать как положительные, так и отрицательные значения. Диапазон изменения значений составляет от -128 до 127. uchar # Целый тип uchar также занимает в памяти 1 байт, как и тип char, но в отличие от него, uchar...
 
elibrarius:
Cierto, lo he recordado, parece que hay una parrilla por defecto de 1024 variantes de división. Si sustituye todos los datos por números divididos, puede almacenar en formato ushort, que son 2 bytes en lugar de 8, lo que supone una compresión 4 veces mayor. Seguramente por eso tenías 2gb en lugar de 6 y los usaste.

El valor por defecto es 254, pero no recuerdo cuánto puse entonces. Probablemente se consumieron menos de 2gb de memoria - recuerdo que me sorprendió mucho que fuera tan poco.

De todos modos, este enfoque permite comprimir significativamente los datos, incluso el propio muestreo. No se puede hacer eso con las redes neuronales

elibrarius:
Ahora entiendo para qué se utiliza esta rejilla, resulta que para la compresión. Y es más rápido clasificarlo.
La cuadrícula también permite un menor ajuste, porque se utiliza un rango de valores. Pero esto no siempre será bueno: para captar los niveles teóricos, creo que hay que cortar la red por sí mismo.
 
Aleksey Vyazmikin:

El valor por defecto es 254, pero no recuerdo cuánto puse entonces. Probablemente se consumieron menos de 2gb de memoria - recuerdo que me sorprendió mucho que fuera tan pequeña.

Puedes usar uchar entonces, es 1 byte.

Aleksey Vyazmikin:
Grid permite encajar menos, porque se utiliza un rango de valores. Pero no siempre es bueno, para coger niveles teóricos tendrías que cortar la red tú mismo.


El valor máximo en ushort es de 65 mil - si se establece una cuadrícula de este tipo, puede no molestarse con ella manualmente.

 
Maxim Dmitrievsky:

https://www.mql5.com/ru/articles/8385

no es un hecho que sea una buena implementación )

Paso de la rusa.

He leído ese))) está lleno de errores en los cálculos y la red da respuestas bastante aleatorias

 
elibrarius:

Entonces puedes usar uchar , es 1 byte.


En ushort el valor máximo es de 65k - si se establece una rejilla de este tipo, no hay que preocuparse por ella manualmente

Su tamaño máximo es65535, pero no puedo afectar a las variables en el código.

En cuanto al tamaño máximo - no, no garantiza el resultado, porque se puede ajustar a la tira de datos y omitir los que están cerca de ella.

Generalmente es bueno tener un algoritmo de aprendizaje, que siempre comprueba la razonabilidad de la división de cierre (A>10 && A<=15), pero normalmente ocurre al azar - no hay tal condición obligatoria, aunque se reproduce a veces.

 
Alexander Alexeyevich:

He leído este))) hay muchos errores en los cálculos y la red da respuestas bastante aleatorias

¿Quiere escribir la red usted mismo?

Vod aquí es un mínimo de palabras y un máximo de código en python, pero también en inglés.

https://datascience-enthusiast.com/DL/Building_a_Recurrent_Neural_Network-Step_by_Step_v1.html

Building a Recurrent Neural Network - Step by Step - v1
  • datascience-enthusiast.com
Building your Recurrent Neural Network - Step by Step
 
Maxim Dmitrievsky:

¿Quiere escribir la red usted mismo?

Hay un mínimo de palabras y un máximo de código en Python, pero también en inglés.

https://datascience-enthusiast.com/DL/Building_a_Recurrent_Neural_Network-Step_by_Step_v1.html

Sí, quiero hacerlo yo mismo), porque todos los artículos y ejemplos no cuentan correctamente las funciones de activación, por ejemplo la función sigmoide siempre se asume como 1/1+exp(-x). Necesito 1,0/1,0+exp(-x). Parece que es lo mismo, pero el terminal da cálculos diferentes) mira si tienes los mismos cálculos) de ahí los errores.
 
Alexander Alexeyevich:
Sí, quiero hacerlo yo mismo) porque en todos los artículos, los ejemplos de funciones de activación se cuentan incorrectamente) por ejemplo sigmoide se cuenta como 1/1+exp(-x) en todas partes. Necesito 1,0/1,0+exp(-x). Parece que es lo mismo, pero el terminal da cálculos diferentes) mira si tienes los mismos cálculos) de ahí el error.
Escribir redes neuronales en el terminal no es una opción en absoluto. Puede notar que cualquier función puede funcionar de repente de una manera diferente a la esperada. Utiliza uno ya probado