Diskussion zum Artikel "Fortschrittliches Resampling und Auswahl von CatBoost-Modellen durch die Brute-Force-Methode" - Seite 10

 
elibrarius:

Welche?

F1, MCC scheint besser zu sein.

Hier ist die vollständige Liste

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 scheint besser zu sein

Hier ist die vollständige Liste

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

Es ist schwer, darüber zu spekulieren, warum sie besser sind.
 
Maxim Dmitrievsky:

Noch einmal.

Nun, ja, manchmal macht es Sinn.

Ein bisschen mehr Stacking. Ja, es macht Sinn, zu stapeln. Es ist immer noch eine offene Frage, wie viel.

Toller Artikel und gigantische Arbeit!

Ich habe die Etiketten, die nach der Richtungsänderung im Datensatz stehen, fallen gelassen, bevor ich sie in das Mischungsmodell eingespeist habe.

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

Die Beobachtung zeigt, dass mehr Modelle positive Ergebnisse liefern.

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

Ergebnisse des besten Tests in Tester und Terminal:


Im Allgemeinen eine schöne Arbeit. Ich habe es verwendet, um alle meine Ziele zu testen und warf sie in den Papierkorb)))

 
welimorn:

Toller Artikel und eine Herkulesaufgabe!

Ich habe die Beschriftungen, die nach der Richtungsänderung im Datensatz stehen, fallen gelassen, bevor ich sie in das Mischungsmodell eingegeben habe.

aus der Beobachtung, mehr Modelle haben ein positives Ergebnis.

Ergebnisse des besten Tests im Testgerät und im Terminal:


Im Allgemeinen, schöne Arbeit. Mit seiner Hilfe habe ich alle meine Ziel überprüft und warf sie in den Papierkorb)))

ja, man kann sie vor dem Clustering fallen lassen

danke für das Feedback :)

Z.Ы so können Sie alle Modelle auf einmal testen, gemittelt. Spielen. Parser für alle Modelle hat noch nicht gemacht, noch im Zweifel. Aber manchmal ein Ensemble von mehreren Modellen wirklich verbessert.

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. Sie können eine Aufzählung von verschiedenen Kombinationen von trainierten Modellen durch die gleiche Metrik R2, als eine Entwicklung des Themas zu machen. Dann behält man das beste Ensemble. Es ist sogar möglich durch Genetik, wenn es viele Modelle gibt.
 
Hallo Maxim!

Danke für einen weiteren schönen Artikel! :)

Ich habe EURUSD, H1 Daten von 2015 bis 2020 genommen und sie in drei Sets aufgeteilt:

1. Training Set: von 2015.01.01 bis 2018.01.01
Dieses Set wird nur für das Training von GMM verwendet.

2. Validierungsset: von 2018.01.01 bis 2019.01.01
Dieser Satz wird zusammen mit dem Trainingssatz in der Brute-Force-Funktion verwendet, um das beste Modell zu finden.

3. Testsatz: von 2019.01.01 bis 2020.01.01
Dieser Satz wird nur verwendet, um das beste Modell zu testen, das mit dem Brute-Force-Algorithmus ermittelt wurde.

Nachfolgend sehen Sie das Ergebnis eines Backtests für den gesamten Datensatz,


Ich habe meinen Code doppelt überprüft, aber vielleicht habe ich etwas falsch gemacht. Wie auch immer, vielleicht haben Sie ja eine Vorstellung von den Ergebnissen. Mit freundlichen Grüßen, Rasoul


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

Danke für einen weiteren schönen Artikel! :)

Ich nahm EURUSD, H1 Daten von 2015 bis 2020 und habe es in drei Sätze aufgeteilt:

1. Training Set: von 2015.01.01 bis 2018.01.01
Diese Daten werden nur für das Training von GMM verwendet.

2. Validierungssatz: von 2018.01.01 bis 2019.01.01
Dieser Satz wird zusammen mit dem Trainingssatz in der Brute-Force-Funktion verwendet, um das beste Modell zu finden.

3. Testreihe: von 2019.01.01 bis 2020.01.01
Dieser Satz wird nur verwendet, um das beste Modell zu testen, das mit dem Brute-Force-Algorithmus ermittelt wurde.

Nachfolgend sehen Sie das Ergebnis eines Backtests für den gesamten Datensatz,


Ich habe meinen Code doppelt überprüft, aber vielleicht habe ich etwas falsch gemacht. Wie auch immer, vielleicht haben Sie eine Vorstellung von den Ergebnissen. Mit freundlichen Grüßen, Rasoul


Hallo, Rasoul. Versuchen Sie, die Größe der Trainingsmenge zu reduzieren. Das kann von verschiedenen Einstellungen abhängen, aber der wichtigste Trick ist, dass eine geringere Trainingsmenge zu einer besseren Generalisierung auf neuen Daten führt. Im nächsten Artikel werde ich versuchen, diesen Effekt zu erklären.
 
Maxim Dmitrievsky

Können Sie mir sagen, wie ich meine Daten als csv-Datei hochladen kann?


Ich habe es auf diese Weise versucht, aber sie wurde nicht geladen.


Das Format der Datei ist:

Zeit,Schluss

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()
 
Evgeni Gavrilovi:

Können Sie mir sagen, wie ich meine Daten über eine csv-Datei hochladen kann?

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=';')

Das heißt, dies ist ein Beispiel für das Laden von Daten aus dem Terminal und das Speichern in einer Datei. Und dann kann man sie in colab verwenden

 
Maxim Dmitrievsky:
Hallo, Rasoul. Versuchen Sie, die Größe der Trainingsmenge zu reduzieren. Das kann von verschiedenen Einstellungen abhängen, aber der wichtigste Trick ist, dass eine geringere Trainingsmenge zu einer besseren Generalisierung auf neuen Daten führt. Im nächsten Artikel werde ich versuchen, diesen Effekt zu erklären.

Das ist sehr gut. Es wäre schön, wenn in dem Artikel eine Bemerkung über den Anwendungsbereich dieser These zu finden wäre - insbesondere für verschiedene IO-Methoden. Aus irgendeinem Grund empfehlen sie 70/30 für NS. Und logischerweise, IMHO, sollte 50/50 zu stabileren Ergebnissen führen.

 
Stanislav Korotky:

Das ist gut. Es wäre schön, wenn in dem Artikel ein Hinweis auf die Anwendbarkeit dieser These - insbesondere auf verschiedene Methoden der MO - zu finden wäre. Aus irgendeinem Grund wird für NS 70/30 empfohlen. Und logischerweise, IMHO, sollte 50/50 zu stabileren Ergebnissen führen.

Es gibt aktives und passives Lernen. Passives Lernen besteht in der manuellen Aufbereitung von Daten und dem Training an ihnen. In diesem Fall sollten viele Daten vorhanden sein, aber es gibt ein Problem mit der korrekten Aufbereitung. Das heißt, der "Lehrer" muss die Daten so aufbereiten, dass sie konventionell aus der gleichen Verteilung stammen und gut verallgemeinert werden können. In dieser Hinsicht macht es fast keinen Unterschied, welchen Anteil der Auszubildende testet. Es bringt Ihnen fast nichts, es ist nur eine Modellprüfung, eine Prüfung, wie gut Sie die Daten manuell beschriftet haben.

Beim aktiven Lernen lernt das Modell, die Daten auf optimale Weise zu beschriften. Der Artikel ist ein solcher Fall von Partitionierung durch GMM. Das heißt, es wird sowohl das Lernen mit als auch ohne Lehrer verwendet. In diesem Fall lernt das Modell, aus kleinen partitionierten Daten zu lernen, und muss die restlichen Daten selbst optimal partitionieren. Dies ist ein relativ neuer Ansatz (etwa aus dem Jahr 2017). Und ich möchte ihn in einem Folgeartikel genauer betrachten.

zu viele "Daten" in den Sätzen, ich entschuldige mich für die Tautologie )