Discusión sobre el artículo "Remuestreo avanzado y selección de modelos CatBoost con el método de fuerza bruta" - página 10

[Eliminado]  
elibrarius:

¿Cuáles?

F1, MCC parece mejor.

Aquí está la lista completa

https://catboost.ai/docs/concepts/loss-functions-classification.html

Classification: objectives and metrics - CatBoost. Documentation
  • catboost.ai
If the target type is not binary, then every object with target value and weight is replaced with two objects for the metric calculation: Target values must be in the range [0; 1]. If the target type is not binary...
 
Maxim Dmitrievsky:

F1, MCC parece ser mejor

aquí está la lista completa

https://catboost.ai/docs/concepts/loss-functions-classification.html

Es difícil especular sobre por qué son mejores.
 
Maxim Dmitrievsky:

Una vez más.

Bueno, sí, a veces tiene sentido.

Un poco más de apilamiento. Sí, tiene sentido apilar. Todavía es una pregunta abierta en cuanto a cuánto.

¡Gran artículo y titánico trabajo!

Eliminado las etiquetas de pie después de que el cambio de dirección en el conjunto de datos antes de alimentarlos en el modelo de mezclas.

X['labels'].loc[X['labels'].diff(2)!=0] = np.nan
X = X.dropna().reset_index(drop=True)

de la observación, más modelos dan resultados positivos.

Iteration:  0 R^2:  0.5260017837414628
Iteration:  1 R^2:  0.6331497253790681
Iteration:  2 R^2:  0.029844101542724655
Iteration:  3 R^2:  0.792134192720112
Iteration:  4 R^2:  -0.5575595243513453
Iteration:  5 R^2:  0.6266442030501214
Iteration:  6 R^2:  0.22435035980633944
Iteration:  7 R^2:  0.38384379495564724
Iteration:  8 R^2:  0.028795249767878173
Iteration:  9 R^2:  0.4976165963899961
Iteration:  10 R^2:  0.38091909530246537
Iteration:  11 R^2:  0.6668471456765452
Iteration:  12 R^2:  0.9173487144971179
Iteration:  13 R^2:  0.31007344321289365
Iteration:  14 R^2:  0.4391449002278133
Iteration:  15 R^2:  0.8643834389201246
Iteration:  16 R^2:  0.1609614914253078
Iteration:  17 R^2:  -0.593998636390909
Iteration:  18 R^2:  0.7253019217609338
Iteration:  19 R^2:  0.11872614816490491
Iteration:  20 R^2:  0.0023909994463473527
Iteration:  21 R^2:  0.6486563192357756
Iteration:  22 R^2:  0.011546691763490213
Iteration:  23 R^2:  0.8085201529889603
Iteration:  24 R^2:  0.9233877589157101
Iteration:  25 R^2:  -0.08743681307491602
Iteration:  26 R^2:  0.6132492793114834
Iteration:  27 R^2:  0.0016322532208268292
Iteration:  28 R^2:  -0.2241780583190326
Iteration:  29 R^2:  0.6739577294046565
Iteration:  30 R^2:  0.43270922254052624
Iteration:  31 R^2:  -0.40571688327667377
Iteration:  32 R^2:  0.8558895655918841
Iteration:  33 R^2:  0.22222950417101828
Iteration:  34 R^2:  0.8718519436072187
Iteration:  35 R^2:  0.3103828388939166
Iteration:  36 R^2:  -0.3274785257455094
Iteration:  37 R^2:  -0.056797883380174774
Iteration:  38 R^2:  0.7372428685425149
Iteration:  39 R^2:  0.46650446544282376
Iteration:  40 R^2:  0.7158974618001703
Iteration:  41 R^2:  -0.08982821839565835
Iteration:  42 R^2:  -0.004541876992860683
Iteration:  43 R^2:  0.39737057218337546
Iteration:  44 R^2:  -0.35131421135378293
Iteration:  45 R^2:  -0.003237278102928842
Iteration:  46 R^2:  0.37272998002935753
Iteration:  47 R^2:  -0.5554473442698793
Iteration:  48 R^2:  0.38766288235168855
Iteration:  49 R^2:  0.8582912360226171

resultados de la mejor prueba en tester y terminal:


En general, un hermoso trabajo. Lo utilicé para probar todos mis objetivos y los tiré a la basura)))

[Eliminado]  
welimorn:

¡Gran artículo y un esfuerzo hercúleo!

Eliminado las etiquetas de pie después de que el cambio de dirección en el conjunto de datos antes de alimentarlos en el modelo de mezclas.

A partir de la observación, más modelos tienen un resultado positivo.

resultados de la mejor prueba en el probador y el terminal:


En general, hermoso trabajo. Con su ayuda he comprobado todos mis de destino y los tiró a la basura))).

sí, usted puede dejar caer antes de la agrupación

gracias por los comentarios :)

Z.Ы para que pueda probar todos los modelos a la vez, promediado. Juega. Parser para todos los modelos no ha hecho todavía, todavía en duda. Pero a veces un conjunto de varios modelos realmente mejora.

def test_models(result):
    pr_tst = get_prices(FULL_DATE, STOP_DATE)
    X = pr_tst[pr_tst.columns[1:]]
    X.columns = [''] * len(X.columns)

    #test the learned model
    p = 0
    for i in range(len(result)):
        p += result[i][2].predict_proba(X)

    p = p/len(result)
    p2 = [x[0]<0.5 for x in p]
    pr2 = pr_tst.iloc[:len(p2)].copy()
    pr2['labels'] = p2
    R2 = tester(pr2, MARKUP, plot=True)

test_models(res)
ZYZY. usted puede hacer una enumeración de diferentes combinaciones de modelos entrenados por la misma métrica R2, como un desarrollo del tema. Luego quédate con el mejor ensemble. Incluso es posible mediante genética, si hay muchos modelos.
 
Hola Maxim

¡Gracias por otro buen artículo! :)

Tomé EURUSD, H1 datos de 2015 a 2020 y lo hice dividir en tres conjuntos:

1. Conjunto de entrenamiento: de 2015.01.01 a 2018.01.01
Esto sólo se utilizará para entrenar GMM.

2. 2. Conjunto de validación: de 2018.01.01 a 2019.01.01
Este conjunto junto con el conjunto de entrenamiento se utilizará en la función de fuerza bruta para encontrar el mejor modelo.

3. Conjunto de prueba: del 01.01.2019 al 01.01.2020
Este conjunto sólo se utilizará para probar el mejor modelo obtenido mediante el algoritmo de fuerza bruta.

A continuación se muestra el resultado de un backtest en todo el conjunto de datos,


He comprobado dos veces mi código y sin embargo podría haber hecho algo mal. De todos modos puede que tenga alguna idea sobre los resultados. Saludos cordiales, Rasoul


Документация по MQL5: Константы, перечисления и структуры / Именованные константы / Предопределенные макроподстановки
Документация по MQL5: Константы, перечисления и структуры / Именованные константы / Предопределенные макроподстановки
  • www.mql5.com
//| Expert initialization function                                   | //| Expert deinitialization function                                 | //| Expert tick function                                             | //| test1                                                            |...
[Eliminado]  
Rasoul Mojtahedzadeh:
Hola Maxim,

¡Gracias por otro buen artículo! :)

Tomé EURUSD, H1 datos de 2015 a 2020 y lo dividió en tres conjuntos:

1. Conjunto de entrenamiento: de 2015.01.01 a 2018.01.01
Esto sólo se utiliza para entrenar GMM.

2. Conjunto de validación: de 2018.01.01 a 2019.01.01
Este conjunto junto con el conjunto de entrenamiento se utilizará en la función de fuerza bruta para encontrar el mejor modelo

3. Conjunto de pruebas: de 2019.01.01 a 2020.01.01
Este conjunto sólo se utilizará para probar el mejor modelo obtenido mediante el algoritmo de fuerza bruta.

A continuación se muestra el resultado de una prueba retrospectiva con todo el conjunto de datos,


He comprobado dos veces mi código y sin embargo podría haber hecho algo mal. De todos modos usted puede tener alguna idea acerca de los resultados. Saludos cordiales, Rasoul


Hola, Rasoul. Intenta reducir el tamaño del conjunto de entrenamiento. Puede depender de diferentes configuraciones, pero el truco clave es que a menor tamaño de entrenamiento, mejor generalización sobre nuevos datos. En el próximo artículo intentaré explicar este efecto.
 
Maxim Dmitrievsky

¿Pueden decirme cómo puedo cargar mis datos a través de un archivo csv?


Lo he intentado de esta forma, pero no carga.


El formato del archivo es:

hora,cierre

2020,11,15,1.3587

2020,11,16,1.3472


def get_prices(START, STOP):
    prices = pd.read_csv('file.csv', columns=['time', 'close']).set_index('time')
    prices.index = pd.to_datetime(prices.index, unit='s')
    prices = prices.dropna()
    pr = prices.copy()
    count = 0
    for i in MA_PERIODS:
        returns = pr - pr.rolling(i).mean()
        for l in range(LOOK_BACK):
            prices[str(count)] = returns.shift(l)
            count += 1
    return prices.dropna()
[Eliminado]  
Evgeni Gavrilovi:

¿Puede decirme cómo puedo cargar mis datos mediante un archivo csv?

def get_prices(look_back = 15):
    prices = pd.DataFrame(mt5.copy_rates_range(SYMBOL, TIMEFRAME, START_DATE, STOP_DATE), 
                            columns=['time', 'close']).set_index('time')
    prices.index = pd.to_datetime(prices.index, unit='s')
    prices = prices.dropna()
    pr = prices.copy()
    count = 0
    for i in MA_PERIODS:
        returns = pr - pr.rolling(i).mean()
        for l in range(look_back):
            prices[str(count)] = returns.shift(l)
            count += 1
    
    prices = prices.dropna()
    prices.to_csv('pr.csv', sep=';')
pr = pd.read_csv('pr.csv', sep=';')

es decir, este es un ejemplo de cargar datos desde el terminal, guardarlos en un archivo. Y luego se puede utilizar en colab

 
Maxim Dmitrievsky:
Hola, Rasoul. Trate de reducir el tamaño del conjunto de entrenamiento. Puede depender de diferentes configuraciones, pero el truco clave es que a menor tamaño del conjunto de entrenamiento, mejor generalización sobre nuevos datos. En el próximo artículo intentaré explicar este efecto.

Eso es bueno. Sería bueno ver en el artículo una observación sobre el alcance de la aplicabilidad de esta tesis - en particular, a diferentes métodos de IO. Por alguna razón recomiendan 70/30 para NS. Y lógicamente, en mi humilde opinión, 50/50 debería dar resultados más estables.

[Eliminado]  
Stanislav Korotky:

Esto está bien. Sería bueno ver un comentario en el artículo sobre el alcance de la aplicabilidad de esta tesis - en particular, a los diferentes métodos de MO. Por alguna razón se recomienda 70/30 para NS. Y lógicamente, en mi humilde opinión, 50/50 debería dar resultados más estables.

Hay aprendizaje activo y pasivo. El aprendizaje pasivo consiste en marcar manualmente los datos y formarse con ellos, en este caso debería haber muchos datos, pero existe el problema de marcarlos correctamente. Es decir, el "profesor" tiene que marcar los datos para que, convencionalmente, procedan de la misma distribución y generalicen bien. En este sentido, da casi igual la proporción de aprendices que pruebe. No te aporta casi nada, es sólo una comprobación del modelo, una comprobación de lo bien que has etiquetado los datos manualmente.

En el aprendizaje activo, el modelo aprende a marcar los datos de forma óptima. El artículo es sólo un caso de partición mediante GMM. Es decir, se utiliza tanto el aprendizaje con y sin profesor. En este caso, el modelo aprende a aprender sobre pequeños datos particionados y tiene que particionar él mismo los datos restantes de forma óptima. Se trata de un enfoque relativamente nuevo (de alrededor de 2017). Y quiero verlo con más detalle en un artículo posterior.

Demasiados "datos" en las frases, pido disculpas por la tautología )