L'Apprentissage Automatique dans le trading : théorie, modèles, pratique et trading algo - page 1260

 
Maxim Dmitrievsky:
avec katbust - il revient normal, habituellement > 0.5 sur le test... comme d'habitude

Avez-vous vérifié la forêt d'un arbre dans katbust ? Et katbust donne-t-il une sortie d'entropie croisée ou une autre erreur ?

Alglib donne 5 erreurs différentes : (voici mon exemple avec 1 arbre)

Alerte : Rapport d'estimation des erreurs de l'ensemble d'entraînement : relclserror=0.267 ; avgce=184.207 ; rmserror=0.516 ; avgerror=0.267 ; avgrelerror=0.267 ;

[Supprimé]  

Non, le boosting est construit différemment, il augmente le nombre d'arbres alors que l'entropie diminue, lorsqu'il commence à croître pendant n itérations, il s'arrête, afin de ne pas surcompliquer le modèle.

il donne l'entropie et n'importe quelle métrique personnalisée mais se base sur l'entropie

la version anglaise du site alglib a une nouvelle forêt, plus rapide, d'ailleurs... je voulais la réécrire, mais je ne la trouve pas ;)

 
J'ai regardé la documentation de xgboost. Il ne s'agit pas d'un résultat d'entropie croisée, mais de
error - taux d'erreur de classification binaire. Il est calculé comme suit : (# cas erronés) / (# tous les cas).
Par défaut, il utilise le seuil de 0,5 pour les valeurs prédites afin de définir les instances négatives et positives.
Un seuil différent (par exemple, 0.) pourrait être spécifié comme "erreur@0".
[Supprimé]  
elibrarius:
J'ai regardé la documentation de xgboost. Il n'a pas de sortie d'entropie croisée, mais
error - Taux d'erreur de la classification binaire. Il est calculé comme suit : (# cas erronés) / (# tous les cas).
Par défaut, il utilise le seuil de 0,5 pour les valeurs prédites afin de définir les instances négatives et positives.
Un seuil différent (par exemple, 0.) pourrait être spécifié comme "erreur@0".

Oui, et ici l'erreur de classification est utilisée par défaut, apparemment

mais il faut distinguer, le boosting utilise l'erreur pour s'arrêter, alors que la forêt ne donne que du post-facto, et les arbres de pleine profondeur.
 
Maxim Dmitrievsky:

Non, le boosting est construit différemment, il augmente le nombre d'arbres alors que l'entropie diminue, lorsqu'il commence à croître pendant n itérations, il s'arrête, afin de ne pas surcompliquer le modèle.

il donne l'entropie et n'importe quelle métrique personnalisée mais se base sur l'entropie

sur la version anglaise du site alglib, j'ai posté une nouvelle forêt, plus rapide, d'ailleurs... je voulais la réécrire, mais je ne la trouve pas ;)

Où se trouve le nouvel alglib - puis-je le chercher quelque part sur le forum ? Il est intéressant de comparer le code de cette fonction

[Supprimé]  
elibrarius:

Où se trouve le nouvel alliglib - est-il sur le forum, quelque part où le chercher ? Il est intéressant de comparer le code de cette fonction

non, c'est en c++ ou c#

http://www.alglib.net/arcnews.php#date_16_06_2018

  • algorithme de construction de forêts aléatoires amélioré, qui est de 2x à 10x plus rapide que la version précédente et produit des forêts de taille plus réduite.
NEWS Archive
  • www.alglib.net
The news archive contains the list of all news, 44 in total. The latest news are at the news page.
 
Maxim Dmitrievsky:

Non, c'est en c++ ou c#.

http://www.alglib.net/arcnews.php#date_16_06_2018

  • algorithme de construction de forêts aléatoires amélioré, qui est de 2x à 10x plus rapide que la version précédente et produit des forêts de taille plus réduite.

Merci !

[Supprimé]  
elibrarius:

Merci !

Si vous trouvez une solution et comparez, faites-le moi savoir :) vous pourriez le réécrire de cette façon, si ce n'est pas trop compliqué. Les fichiers de la forêt actuelle sont trop gros, il serait bien de les réduire. Et l'accélération est aussi un bonus.

 

Grâce à l'initiative de Maxim, j'ai été débanalisé ! Merci Maxim.

Le résultat est négatif jusqu'à présent, mais je pense que je dois lui donner plus de temps, parce que Si est à plat maintenant après les forts mouvements du Nouvel An, qui ne se sont pas produits lorsque l'EA a été lancé.

Les tests ont été faits avec un volume minimal sur le compte avec un historique riche et une mauvaise expérience, donc il n'y aura pas de signal public, je posterai le rapport plus tard quand les statistiques seront disponibles. Je le fais pour ceux qui sont intéressés à savoir si mon approche est rentable ou non.

En ce qui concerne CatBoost'a, parce que j'ai de très petits modèles, 1-30 arbres ou plus, puis confronté à une situation où le test (sur lequel le modèle de sélection) et l'examen (sur lequel les tests indépendants) échantillon peut montrer de très bons résultats financiers, mais sur l'échantillon de formation des résultats sont très faibles. Je teste donc maintenant le modèle sur les trois échantillons, et s'il me convient, je le sélectionne. Je ne l'ai pas fait car je m'attendais au même effet que les feuilles de l'arbre (mon approche alternative où seules les feuilles sont sélectionnées) ou l'échafaudage, à savoir que le modèle se comporterait certainement bien sur l'échantillon de test, mais il s'avère que ce n'est pas toujours le cas.

Jusqu'à présent la question des critères de sélection d'un modèle est ouverte pour moi, après des tests sur un échantillon pour la formation de bons modèles (pour un certain nombre d'indicateurs financiers et de modèles de critères) sur 100k n'est pas plus de 10-30 pièces, ce qui n'est pas suffisant bien sûr. Nous devrions soit abaisser les critères, soit créer davantage de modèles. Catbust a beaucoup de paramètres différents, ce qui permet de riveter un grand nombre de modèles.

D'autre part, j'espérais vraiment un entraînement via les cartes graphiques, mais il s'est avéré très peu utile pour le 1060 - jusqu'à présent, les expériences montrent qu'il a fallu 20 minutes pour entraîner 200 modèles, alors que sur le processeur G3900 (en fait la scorie sous LGA1151), il n'a fallu que 6 minutes ! En même temps, le processeur est toujours chargé de 50% à 60%, ce qui rend impossible l'utilisation de plus de 2 cartes vidéo à la fois, alors que j'avais de grands espoirs pour une configuration à 6 cartes. Je ne sais pas pourquoi cela se produit alors qu'en théorie tout devrait être rapide. Le plus gros goulot d'étranglement dans les calculs GPU est le transfert du modèle de la RAM au GPU et inversement, mais c'est trop lent pour moi, peut-être que le transfert se fait après chaque itération et c'est la raison des décalages. Quelqu'un d'autre a-t-il essayé de le faire tourner sur le GPU ?

 
Maxim Dmitrievsky:

Si vous trouvez une solution et comparez, faites-le moi savoir :) vous pourriez le réécrire de cette façon, si ce n'est pas trop compliqué. Les fichiers de la forêt actuelle sont trop gros, il serait bien de les réduire. Oui, et l'accélération est aussi un bonus.

Je l'ai comparé, il y a le même morceau de code inutilisé ci-dessous : (signé en 2009, c'est-à-dire qu'aucune modification n'a été apportée à cette partie)


             Copyright 16.02.2009 by Bochkanov Sergey
        *************************************************************************/
        public static double dfavgce(decisionforest df,
            double[,] xy,
            int npoints,
            alglib.xparams _params)
        {
            double result = 0;
            double[] x = new double[0];
            double[] y = new double[0];
            int i = 0;
            int j = 0;
            int k = 0;
            int tmpi = 0;
            int i_ = 0;

            x = new double[df.nvars-1+1];
            y = new double[df.nclasses-1+1];
            result = 0;
            for(i=0; i<=npoints-1; i++)
            {
                for(i_=0; i_<=df.nvars-1;i_++)
                {
                    x[i_] = xy[i,i_];
                }
                dfprocess(df, x, ref y, _params);
                if( df.nclasses>1 )
                {
                   
                    //
                    // classification-specific code
                    //
                    k = (int)Math.Round(xy[i,df.nvars]);
                    tmpi = 0;
                    for(j=1; j<=df.nclasses-1; j++)
                    {
                        if( (double)(y[j])>(double)(y[tmpi]) )
                        {
                            tmpi = j;
                        }
                    }

                    if( (double)(y[k])!=(double)(0) )
                    {
                        result = result-Math.Log(y[k]);
                    }
                    else
                    {
                        result = result-Math.Log(math.minrealnumber);
                    }
                }
            }
            result = result/npoints;
            return result;
        }