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

 
mytarmailS:

Karoch Ich weiß nicht, vielleicht habe ich eine falsche gmm ))) Aber ich sehe keinen Unterschied zwischen mit und ohne, meiner Meinung nach wird alles durch das Ziel entschieden und nichts anderes....


Ich habe insgesamt 60k Daten.

Ich nehme die ersten 10k und wähle zufällig 500 Punkte aus.

Entweder trainiere ich das Modell sofort mit ihnen oder ich trainiere den gmm und trainiere dann das Modell.

Test mit den restlichen 50k

Und auch auf die übliche Art und Weise kann man solche Modelle finden, wie mit gmm , und mit der gleichen Häufigkeit sind sie genetisiert.

zum Beispiel

Modell ohne gmm wird mit 500 Punkten trainiert, Test mit 50k.


=================================================================================================

Ich habe eine interessante Sache gesehen, über die ich nachdenken sollte.....

Es gibt so einen Standpunkt, dass der Markt in Zustände unterteilt werden sollte und in jedem Zustand eine andere Strategie gehandelt werden sollte, aber alle mir bekannten Versuche waren erfolglos, entweder sieht man den Zustand nicht oder das Modell handelt selbst in "einer Art" Zustand schlecht.

Aber in diesem Ansatz, können Sie ganz klar sehen, welche Markt das Modell "mag". und welche es nicht mag.

Wahrscheinlich arbeitet das Modell wegen der Renditen aus dem Mashka als Zeichen besser in Flat.

Es ist möglich, manuell in Zustände zu unterteilen und diese Perioden der Spur hinzuzufügen. Sie müssen die Beispiele durch "Staaten" ausgleichen oder künstliche über gmm machen. Wie auch immer, ich habe nie solche Ergebnisse auf einem nackten Modell erhalten. Vielleicht können das ein paar Mashas machen.
 
Maxim Dmitrievsky:
Sie können manuell in Zustände unterteilen und diese Zeiträume in die Ausbildung einfügen. Sie müssen die Beispiele nach "Zuständen" abgleichen oder mit Hilfe von gmm künstliche Beispiele erstellen.

Ja, Sie können HMM nach Zustand machen, aber es wird alles durch ein gleitendes Fenster erkannt, also mit einer Verzögerung der Fenstergröße, also ...... )

Ich habe gerade gesehen, dass es eine wirklich klare Sicht auf die Zustände gibt, es schien interessant.

 
mytarmailS:

Ja, man kann ein HMM nach Zuständen durchführen, aber es wird alles durch ein gleitendes Fenster erkannt, und daher mit einer Verzögerung der Fenstergröße, und daher ...... )

Ich habe gerade gesehen, dass man die Zustände hier sehr deutlich sehen kann, das scheint interessant zu sein.

Trends sind in der Regel weniger als flach, also scheint es mir, dass es immer so sein wird, man sollte sie stichprobenartig erfassen. Die gleiche Clusterung kann verwendet werden, um sie in Zustände zu unterteilen.
 
Maxim Dmitrievsky:
. Wie kommt es, dass ich nie solche Ergebnisse bei einem nackten Modell erzielt habe. Vielleicht schaffen es ein paar Mashkas.

Es ist mit dem gmm gewesen, ich habe verschiedene Dinge versucht, dies und das.

 
Maxim Dmitrievsky:

Ich bin davon besessen, eine Trainingsstichprobe durch Optimierung von Verteilungen oder Funktionen zu erstellen.

Ohne überhaupt eine Stichprobe zu verwenden, einfach "etwas" zu erzeugen und es an echten Daten zu testen.

Aber ich weiß noch nicht, wie ich das realisieren kann

=====================================================

Ich habe auch eine Idee, wie man die Qualität verbessern kann, indem man schlechte Bäume aus dem Modell entfernt, das könnte auch helfen.

 
mytarmailS:

Ich bin davon besessen, eine Trainingsstichprobe durch Optimierung von Verteilungen oder Funktionen zu erstellen.

Ohne überhaupt von einer Stichprobe auszugehen, einfach "etwas" zu erzeugen und es an realen Daten zu testen.

Aber ich weiß noch nicht, wie ich das realisieren kann.

=====================================================

Ich habe auch eine Idee, wie man die Qualität verbessern kann, indem man schlechte Bäume aus dem Modell entfernt, das könnte auch helfen.

Sie sind derjenige, der sich in die stochastische Modellierung einarbeiten will
 
Maxim Dmitrievsky:

Das ist ein seltsamer Ansatz. Für das Gleichgewicht der Klassen. Man könnte es für unsere Zwecke ausnutzen. Das ist mir gerade eingefallen.

https://towardsdatascience.com/augmenting-categorical-datasets-with-synthetic-data-for-machine-learning-a25095d6d7c8

Ich habe versucht, diesen Ansatz in den Clusteriser aus dem Artikel zu integrieren, aber nicht als Klassenausgleichsmethode, sondern als Generator für einen neuen ausgeglichenen Datensatz.

Es gibt dort eine großartige Methode zur Berechnung des Mahalanobis-Abstands zwischen zwei eindimensionalen Arrays. In dem Artikel heißt es, dass es sich um eine multivariate Verallgemeinerung dessen handelt, wie viele Standardabweichungen eine Stichprobe vom Mittelwert der Verteilung entfernt ist.

Ich habe noch keine Erfahrung mit dieser Metrik, aber der Autor schlägt vor, sie zu verwenden, um zu beurteilen, ob die generierten Merkmale zu einer bestimmten Klasse gehören .

https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.mahalanobis.html

Um diesen Indikator zu berechnen, benötigen wir 2 univariate Arrays und eine Kovarianzmatrix.

In unserem Fall ist das erste Array das generierte Merkmal, das zweite Array ist die durchschnittliche Verteilung der Merkmale aus dem GMM. Die Kovarianzmatrix wird ebenfalls dem GMM entnommen. Das GMM wird für jede Klasse separat erstellt. Außerdem werden der Mittelwert und die Standardabweichungen für jedes Merkmal und jede Bezeichnung generiert. Diese werden für die Generierung neuer Daten benötigt.

import numpy.linalg as lnalg
from scipy.spatial.distance import mahalanobis

#initialization 
gmms = dict()
desc_df = list()
inv_sig = dict()
arr_classes = np.sort(X.labels.unique())
cols = X.columns.tolist()
pr_c = add_labels(pr.copy(), min=60, max=120, add_noize=0.0)
X = pr_c[pr_c.columns[2:]]
x_train = X.copy()

#create descriptive statistics, train gmm, extract means and covariances for each classes
for ind, cls in enumerate(arr_classes):

    desc_df.append(x_train[x_train['labels'] == cls].describe())

    x_trainGMM = x_train[x_train['labels'] == cls].values[:, :-1]
    gmm = mixture.GaussianMixture(n_components=1, covariance_type='full').fit(x_trainGMM)
    gmms[cls] = (gmm.means_, gmm.covariances_)

    # invert the matrix for mahalanobis calc
    mu, sig = gmms[cls]
    isig = lnalg.inv(sig)
    inv_sig[cls] = mu, isig

Alles ist bereit für die Generierung und Auswahl neuer Daten. Unten zufällig auf der Grundlage der Mittelwert und Abweichung, generiert Features für jede Klasse in der Anzahl von mehr als 60 mal als angegeben. Dies ist notwendig, um etwas zur Auswahl zu haben. Und die Etiketten sind auf den Zustand 0 -1 gebracht.

 def brute_force(samples=5000):
    import numpy.linalg as lnalg
    gen = []

    for index_cl, cls in enumerate(arr_classes):

        dlt = samples * 60
        sub_arr = np.zeros((dlt, len(cols), 1))
        
        #generate samples ahd lables for cls class
        col_counter = 0
        for col in cols:
            sub_arr[:, col_counter] = np.random.normal(loc=desc_df[index_cl][col]['mean'],
                                                       scale=desc_df[index_cl][col]['std'],
                                                       size=(dlt, 1)
                                                       )
            col_counter += 1
        sub_arr = sub_arr.reshape((sub_arr.shape[:-1]))

        #normalization lables
        sub_arr[-1] = np.where(sub_arr[-1] >= 0.5, 1, 0)

        mh = np.zeros((arr_classes.shape[0]))
        counter = 0

        #selection of the most successful samples
        for index, i in enumerate(sub_arr):
            for m_index, m_cls in enumerate(arr_classes):
                mu, isig = inv_sig[m_cls]
                mh[m_index] = mahalanobis(i[:-1], mu, isig)
            
            #if gmm assignment the same as the original label add in gen
            if np.argmin(mh) == i[-1]:
                gen = np.append(gen, i)
                counter += 1
            if counter == int(samples / 2):
                break


...

Nach für jede Probe der Mahalanobis-Abstand Index berechnet wird , in Bezug auf die Arrays der mittleren Verteilungen von GMM für beide Klassen. ein Array von 2 Werten erhalten wird, die die Nähe der erzeugten Probe zu beiden Klassen zeigen. der minimale Wert wird zeigen, welche. Wenn das Label mit diesem Wert übereinstimmt, fügen wir es der Trainingsstichprobe hinzu. Und wenn die Stichprobe den eingestellten Wert erreicht hat, gehen wir zur nächsten Klasse über. Auf diese Weise erhalten wir eine perfekt ausgewogene Stichprobe.

Aber das Tamburin tanzen und die komplexen Beziehungen zum Zufall werden dadurch nicht aufgehoben. Aber wenn man sich genug Mühe gibt, kann man ein normales Ergebnis erzielen:

Wenn ich Zeit und Energie habe, werde ich versuchen, die Verteilungen der Merkmale von 25 bis 75 Quantilen in den Generator zu säen, vielleicht ergibt das etwas.

Ich habe auch versucht, den Abstandsindikator zu verwenden, um die Auswahl der Zielmerkmale zu bewerten. Die Idee war, dass bei richtig gewählten Bezeichnungen und Zielen der Durchschnittswert dieses Indikators sinkt.

results = np.zeros(x_train.shape[0])
mh = np.zeros((arr_classes.shape[0]))
for index, i in enumerate(x_train.to_numpy()):
    for m_ind, m_cls in enumerate(arr_classes):
        mu, isig = inv_sig[m_ind]
        mh[m_ind] = mahalanobis(i[:-1], mu, isig)

    if np.argmin(mh) == i[-1]:
        results[index] = mh[np.argmin(mh)]

acc = results.sum() / results.shape[0]

print('Accuracy:', acc)

Ich habe alle verfügbaren "erfolgreichen" Kombinationen von Ziel und Merkmalen ausprobiert und auch "erfolglose" Kombinationen reproduziert. Bei einer solchen oberflächlichen Analyse sinkt der Index für erfolgreiche und steigt für erfolglose Varianten. Möglicherweise besteht ein gewisser Zusammenhang, aber das müssen Sie überprüfen. Wenn Sie eine beliebige Grid-Scanner-Version oder GA haben, können Sie das überprüfen

 
welimorn:

Ich habe versucht, diesen Ansatz in die Clustering-Engine aus dem Artikel zu integrieren, nur nicht als Klassenausgleichsmethode, sondern als Generator für einen neuen ausgeglichenen Datensatz.

Ich habe alle "erfolgreichen" Kombinationen von Ziel und Attributen ausgeführt und die "erfolglosen" Kombinationen reproduziert. Bei dieser oberflächlichen Analyse zeigt sich, dass der Index für erfolgreiche Varianten abnimmt und für erfolglose Varianten zunimmt. Möglicherweise besteht ein gewisser Zusammenhang, aber das müssen Sie selbst überprüfen. Wenn Sie eine Grid-Scanner-Version oder GA haben, können Sie das überprüfen

Noch kein Scanner. Großartig, das muss ich mir genauer ansehen. Ich habe bisher Informationen über zusätzliche Ansätze gesammelt, die das Modell verbessern können (neben den Codierern). Ich werde wahrscheinlich bald einen Artikel verfassen.

 
Maxim Dmitrievsky:

Noch kein Scanner. Großartig, ich werde mir das genau ansehen müssen. In der Zwischenzeit habe ich Informationen über zusätzliche Ansätze gesammelt, die das Modell verbessern können (neben den Codierern). Ich werde wahrscheinlich bald einen Artikel verfassen.

Was die von Ihnen erwähnte Kombination erfolgreicher Modelle im Suchprozess angeht, so habe ich versucht, erfolgreiche Modelle mit verschiedenen Attributen zu kombinieren. Diese Technik gleicht den Drawdown in einigen Teilen der Historie aus. Es wurde auch festgestellt, dass das Hinzufügen von Modellen mit einem R^2 von 0,65 die Ergebnisse verbessert, selbst wenn es Modelle mit einem R^2 von 0,85-0,95 gibt.

 
welimorn:

Zusätzlich zu der oben erwähnten Kombination von erfolgreichen Mustern im Suchprozess habe ich versucht, erfolgreiche Muster mit verschiedenen Attributen zu kombinieren. Diese Technik gleicht den Drawdown in einigen Teilen der Historie aus. Es wurde auch festgestellt, dass das Hinzufügen von Modellen mit einem R^2 von 0,65 die Ergebnisse verbessert, selbst wenn es Modelle mit einem R^2 von 0,85-0,95 gibt.

Ja, aber oft auf Kosten einer Verringerung der Anzahl der Trades um 10-20 %.