L'apprentissage automatique dans la négociation : théorie, modèles, pratique et algo-trading - page 24

 

Alexey, j'ai une autre question concernant votre fonction de tri des prédicteurs - quel intervalle de valeurs de retour devrait-elle avoir ? J'ai exécuté cette fonction de fitness sur mes données avec des entrées aléatoires (fitness_f(runif(predictor_number, min = 0, max = 1))), j'ai vu des résultats de 0 à 0,03. Je vois aussi dans le code qu'en cas d'erreur (zéro entrée) la fonction renvoie 0. Quelque chose ne va pas ici, GenSA essaie de minimiser les résultats, c'est-à-dire qu'à la fin GenSA va juste arriver à zéro entrée et s'arrêter. Peut-être devrions-nous alors changer le signe du résultat de la fonction de fitness afin que GenSA agisse dans la direction opposée ?
Si la fonction d'aptitude, à un moment donné de l'optimisation, commence à renvoyer des nombres négatifs et que plus ils sont bas, mieux c'est - alors tout est ok maintenant.

 
Dr. Trader:

Alexey, j'ai une autre question pour votre fonction de tri des prédicteurs - quel intervalle de valeurs de retour devrait-elle avoir ? J'ai exécuté cette fonction de fitness sur mes données avec des entrées aléatoires (fitness_f(runif(predictor_number, min = 0, max = 1))), j'ai vu des résultats de 0 à 0,03. Je vois aussi dans le code qu'en cas d'erreur (entrées nulles) la fonction retournera 0. Quelque chose ne va pas ici, GenSA essaie de minimiser les résultats, c'est-à-dire qu'à la fin GenSA va juste arriver à zéro entrée et s'arrêter. Peut-être devrions-nous alors changer le signe du résultat de la fonction de fitness afin que GenSA agisse dans la direction opposée ?
Si la fonction d'aptitude, à un moment donné de l'optimisation, commence à renvoyer des nombres négatifs et que plus ils sont bas, mieux c'est - alors tout est correct maintenant.

C'est une bonne question. Vous vous débrouillez.

Je suis en train d'écrire un article sur cette méthode et en voici un extrait :


Schéma fonctionnel de l'algorithme basé sur l'information mutuelle corrigée et la recherche stochastique d'un sous-ensemble de prédicteurs.


  • a) Classer l'ensemble des données dans l'une des catégories connues.
  • b) Évaluer les paramètres de l'ensemble de données tels que le nombre de lignes, de prédicteurs, le nombre moyen de niveaux des prédicteurs (s'ils ont des nombres de niveaux différents) et, sur la base de ces données, calculer le "nombre optimal" de prédicteurs dans le sous-ensemble final.
  • c) Initialiser un vecteur de type numérique dont la longueur est égale au nombre de variables d'entrée de l'ensemble, en utilisant des nombres aléatoires répartis uniformément dans l'intervalle [0, 1] et assigner les limites inférieure (0) et supérieure (1) des valeurs du vecteur - l'argument de la fonction SA.
  • d) Initialiser la fonction d'évaluation du quantile d'information mutuelle, la fonction du quantile d'information mutuelle et la fonction de fitness qui combine tous les calculs.
  • e) Définir le nombre de simulations de Monte Carlo pour estimer les quantiles du MI et du WI ; définir les quantiles (par exemple 0,9) pour les valeurs de bruit du MI et du WI.
  • f) Définissez la durée ou le nombre d'itérations de l'algorithme. Plus il y en a, mieux c'est.
  • g) Exécuter l'algorithme, attendre les résultats.


Le point "b" doit être clarifié. Le nombre optimal de variables est une valeur conditionnelle qui est calculée à l'aide de la formule :

optim_var_num < - log(x = sample_size / 100, base = round(mean_levels, 0))


L'intuition est que, étant donné l'hypothèse d'indépendance des variables d'entrée, le nombre moyen de niveaux d'une variable doit être élevé à la puissance requise afin d'obtenir un nombre total de niveaux uniques en interaction tels que chacun d'entre eux a en moyenne au moins n observations concentrées, où n est pris comme 100.

Nous ne pouvons pas avoir trop de variables d'entrée avec trop de niveaux, car une estimation prudente de la fréquence des observations sur les niveaux d'entrée serait trop faible pour donner une inférence statistique sur la dépendance de la variable de sortie sur l'ensemble des niveaux d'entrée.

En fixant le seuil au-dessus duquel les valeurs vectorielles du nombre de variables d'entrée seront converties en 1 (le drapeau d'inclusion de l'indice de variable), nous effectuons un calcul probabiliste :

threshold < - 1 - optim_var_num / predictor_number


Son essence est que nous définissons la valeur de probabilité maximale pour sélectionner le nombre optimal calculé d'entrées. Et cette logique est vérifiée en appliquant la distribution binomiale.

Par exemple, prenons nos données : la moitié de l'ensemble des données, qui est utilisée pour la formation.

Nous avons 17 973 lignes, 12 prédicteurs, chacun avec 5 niveaux. En appliquant les formules ci-dessus, nous obtenons que le nombre optimal de prédicteurs est de 3 226.

En appliquant la formule du seuil pour inclure un prédicteur dans l'ensemble, nous obtenons 0,731.

Quel est le nombre le plus probable de variables sélectionnées que l'on obtient sur une distribution binomiale ?


Le maximum est de 3 observations. Pour être précis, 5 ^ 3 226 nous donnerait 178 niveaux, qui accueilleraient chacun une moyenne de 100 observations.
 
Continué. La valeur 0 à la sortie de la fonction est la valeur maximale dans le pire des cas. Si aucun élément du vecteur par ne passe le seuil, la valeur est automatiquement 0. La meilleure valeur possible est -1. Signifie que la sortie est complètement déterministe à partir du sous-ensemble d'entrées.
 

Oui, j'ai trouvé un sous-ensemble de prédicteurs avec une valeur de fitness négative. Il y avait beaucoup de prédicteurs, plusieurs milliers, j'ai limité gensa à seulement 2 itérations, cela m'a pris 8 heures :). Le résultat de la fonction de fitness est de 6%. Lors du fronttest sur ces prédicteurs avec nnet, j'ai obtenu 45% d'erreur. Ce n'est pas beaucoup, je ne pense pas que l'EA soit rentable. J'ai mis une limite de 10 itérations à nouveau pour trouver un meilleur résultat, je l'ai exécuté, j'attends depuis 24 heures, j'espère que gensa sera un jour complet. Je vais devoir essayer la génétique (bibliothèque GA), elle fonctionnera plus rapidement avec plusieurs threads (GA minimise plutôt que de maximiser le résultat, c'est-à-dire que le résultat de la fonction de fitness pour GA devrait changer de signe). Je vais continuer à expérimenter.

J'ai lu divers articles sur le modèle en composantes principales et j'ai essayé d'enseigner le modèle non seulement pour mesurer le R^2 et le maximiser en sélectionnant les prédicteurs, mais aussi pour tester le modèle sur les données du fronttest. C'est un peu ambigu. D'une part, j'ai augmenté le R^2 du modèle en supprimant les paires de prédicteurs corrélés (fonction findCorrelation de bibiloteka caret), mais il s'est avéré que le R^2 lorsque l'on teste le modèle sur les données du fronttest diminue. Le miracle ne s'est pas produit, le modèle PCA est également recyclé. Je veux essayer une estimation de prédicteur plus complexe - diviser l'échantillon de formation en deux - pour la formation proprement dite et pour la validation, former le modèle PCA, puis tester immédiatement sur l'échantillon de validation, renvoyer le R^2 minimum comme résultat final. Si cette fonction est utilisée pour l'évaluation d'un ensemble de prédicteurs et la maximisation de cette valeur, seuls les ensembles de prédicteurs qui donnent de bons résultats sur les données formées et nouvelles seront trouvés. Nous devons le vérifier.

De plus, j'ai dû mal comprendre le texte du premier article sur l'APC dans ce fil. Il était dit que le nombre de composants doit être choisi pour décrire 95% de la variation, je pensais qu'ils parlaient de la précision de prédiction de la variable cible. Mais ce n'est pas le cas, les composantes principales sont construites sans aucune variable cible, et la précision de 95% est la précision avec laquelle les données brutes sont décrites en utilisant ces mêmes composantes. Et la précision des prédictions n'a absolument rien à voir avec cela.

 
Dr. Trader:

Oui, j'ai trouvé un sous-ensemble de prédicteurs avec une valeur de fitness négative. Il y avait beaucoup de prédicteurs, plusieurs milliers, j'ai limité gensa à seulement 2 itérations, cela m'a pris 8 heures :). Le résultat de la fonction de fitness est de 6%. Lors du fronttest sur ces prédicteurs avec nnet, j'ai obtenu 45% d'erreur. Ce n'est pas beaucoup, je ne pense pas que l'EA soit rentable. J'ai mis une limite de 10 itérations à nouveau pour trouver un meilleur résultat, je l'ai exécuté, j'attends depuis 24 heures, j'espère que gensa sera un jour complet. Je vais devoir essayer la génétique (bibliothèque GA), elle fonctionnera plus rapidement avec plusieurs threads (GA minimise plutôt que de maximiser le résultat, c'est-à-dire que le résultat de la fonction fitness pour GA devrait changer de signe). Je vais expérimenter davantage.

J'ai lu divers articles sur le modèle en composantes principales et j'ai essayé non seulement d'entraîner le modèle pour mesurer le R^2 et le maximiser en sélectionnant les prédicteurs, mais aussi de tester réellement le modèle sur les données du fronttest. C'est un peu ambigu. D'une part, j'ai augmenté le R^2 du modèle en supprimant les paires de prédicteurs corrélés (fonction findCorrelation de bibiloteka caret), mais il s'est avéré que le R^2 lorsque l'on teste le modèle sur les données du fronttest diminue. Le miracle ne s'est pas produit, le modèle PCA est également réentraîné. Je veux essayer une estimation de prédicteur plus complexe - diviser l'échantillon de formation en deux - pour la formation proprement dite et pour la validation, former le modèle PCA, puis tester immédiatement sur l'échantillon de validation, renvoyer le R^2 minimum comme résultat final. Si cette fonction est utilisée pour l'évaluation d'un ensemble de prédicteurs et la maximisation de cette valeur, seuls les ensembles de prédicteurs qui donnent de bons résultats sur les données entraînées et nouvelles seront trouvés. Nous devrons le vérifier.

De plus, j'ai dû me tromper dans le texte du premier article sur le PCA dans ce fil. Il était dit que le nombre de composants devait être choisi pour décrire 95% de la variation, je pensais qu'ils parlaient de la précision de la prédiction de la variable cible. Mais ce n'est pas le cas, les composantes principales sont construites sans aucune variable cible, et la précision de 95% est la précision avec laquelle les données brutes sont décrites en utilisant ces mêmes composantes. Et la précision des prédictions n'a absolument rien à voir avec cela.

Oui, il s'avère que vous ne comprenez pas.

L'ACP peut être appliquée comme un outil autonome, mais l'article n'en parle pas.

La discussion porte sur la manière de filtrer le bruit d'un grand ensemble de prédicteurs.

D'après ce que j'ai compris, cela se fait selon les étapes suivantes :

1. Conscience du Y. Il s'agit d'échelonner les prédicteurs en fonction de la variable cible.

2. En utilisant l'algorithme PCA, un ensemble de prédicteurs est ordonné et la partie qui explique 95% de la variance est prise.

2. ou alors (je ne l'ai pas encore compris moi-même) en utilisant l'algorithme PCA, un nouvel ensemble de prédicteurs est construit en multipliant l'ensemble original par les coefficients calculés (chargement). Cet ensemble est commandé. Nous prenons autant de ces nouveaux vecteurs qui expliquent 95% de la variance.

PS.

Nous allons publier que Y-aware est le nouveau venu dans le domaine du filtrage des prédicteurs de bruit.

Succès

 
SanSanych Fomenko:

2. En utilisant l'algorithme PCA, l'ensemble des prédicteurs est ordonné et la partie qui explique 95% de la variance est retenue.

Je ne l'ai pas encore compris. (Je ne parlerai maintenant que de l'approche y-aware, afin de ne pas la confondre avec l'autre). L'article lui-même est ici: http://www.r-bloggers.com/principal-components-regression-pt-2-y-aware-methods/

Après le code"princ <- prcomp(dmTrain, center = FALSE, scale. = FALSE)" il y a une situation : les données sont lues, mises à l'échelle par Y, les composants PC sont construits. Cette fonction ne limite pas le nombre de composants - autant qu'il y a de prédicteurs. La première chose à faire est de n'en sélectionner qu'une partie (il est recommandé de décrire 95% des variations). Dans l'article lui-même, l'auteur a examiné le graphique sdev (variances non spécifiées) pour les composants, et a déclaré que 2 ou 5 suffiraient, car ils ressortent du graphique. D'une certaine manière, rien ne ressort, le graphique est doucement décroissant.

Il existe une table sdev, dont le nombre d'entrées est égal au nombre de composants. Est-il possible de calculer le nombre de composants à prendre dans ce cas ? La somme de tous les chiffres n'est pas nécessairement limitée à 1, j'ai vu une somme de 6, et probablement plus.

> princ$sdev
[1] 0.17585066 0.15322845 0.13818021 0.13090573 0.12177070 0.11854969
[7] 0.11176954 0.10910302 0.10616631 0.10265987 0.10056754 0.09441041
[13] 0.09343688 0.08832101 0.08620753 0.08235531 0.08132748 0.07992235
[19] 0.07800569 0.07575063 0.07463254 0.07311194 0.07210698 0.07032990
[25] 0.06907964 0.06763711 0.06634935 0.06544930 0.06451703 0.06260861
 
Dr. Trader:

Je ne l'ai pas encore compris. (Je ne parlerai maintenant que de l'approche y-aware, afin de ne pas la confondre avec l'autre). L'article lui-même est ici: http://www.r-bloggers.com/principal-components-regression-pt-2-y-aware-methods/

Après le code"princ <- prcomp(dmTrain, center = FALSE, scale. = FALSE)" nous avons cette situation : les données sont lues, mises à l'échelle par Y, les composantes PC sont construites. Cette fonction ne limite pas le nombre de composants - autant qu'il y a de prédicteurs. La première chose à faire est de n'en sélectionner qu'une partie (il est recommandé de décrire 95% des variations). Dans l'article lui-même, l'auteur a examiné le graphique sdev (certaines variances non spécifiées) pour les composants et a déclaré que 2 ou 5 suffiraient, car ils ressortent du graphique. D'une certaine manière, rien ne ressort, le graphique est doucement décroissant.

Il existe une table sdev, dont le nombre d'entrées est égal au nombre de composants. Est-il possible de calculer le nombre de composants à prendre dans ce cas ? La somme de tous les nombres n'est pas nécessairement limitée à 1, j'ai vu une somme de 6, et probablement plus.

Je lance Rattle et j'obtiens trois tables :

  • Écarts types : ici, vous pouvez avoir toutes sortes de valeurs et dire que la somme = 1 n'est pas nécessaire.
  • Rotation : ce sont les coefficients par lesquels nous devons multiplier les vecteurs originaux pour obtenir de nouveaux vecteurs.
  • Importance des composants. Ce qui est discuté

Dans la dernière, la première colonne indique que si vous ne prenez que la PC1, elle expliquera 0,9761 de la variabilité (proportion cumulative), si vous prenez DEUX composantes - PC1 et PC2, elle expliquera 0,99996, etc.

(Je ne sais pas comment insérer des tableaux)

Importance des composants :

PC1 PC2 PC3 PC4 PC5

Écart-type 2,2092 0,34555 0,01057 0,008382 0,004236

Proportion de la variance 0.9761 0.02388 0.00002 0.000010 0.000000

Proportion cumulée 0,9761 0,99996 0,99998 1,000000 1,000000

 

Je cherchais ce tableau depuis longtemps, je l'ai enfin trouvé dans le résumé. L'endroit le plus évident en fait :) Merci de l'avoir montré. C'est le cas lorsqu'un élément figure dans le résumé, mais pas dans les attributs de l'objet.

summary(princ)$importance[3,]

Il s'avère que cet article a une suite, consacrée à la question même de la sélection des composants, avec une solution spéciale pour Y-aware. Je ne l'ai pas encore essayé.

http://www.win-vector.com/blog/2016/05/pcr_part3_pickk/

 
Dr. Trader:

Je cherchais ce tableau depuis longtemps, je l'ai enfin trouvé dans le résumé. L'endroit le plus évident en fait :) Merci de l'avoir montré. C'est le cas lorsqu'un élément figure dans le résumé, mais pas dans les attributs de l'objet.

Il s'avère que cet article a une suite, consacrée à la question même de la sélection des composants, avec une solution spéciale pour Y-aware. Je ne l'ai pas encore essayé.

http://www.win-vector.com/blog/2016/05/pcr_part3_pickk/

Dans ce R, dès que vous obtenez un objet, vous mettez str et summary dessus, et aussi plot. Vous pouvez voir beaucoup de choses étonnantes. Le fait est que le concept d'"objet" est beaucoup plus compliqué dans R que dans de nombreux langages de programmation.
 
Dr. Trader:

Oui, j'ai trouvé un sous-ensemble de prédicteurs avec une valeur de fitness négative. Il y avait beaucoup de prédicteurs, plusieurs milliers, j'ai limité gensa à seulement 2 itérations, cela m'a pris 8 heures :). Le résultat de la fonction de fitness est de 6%. Lors du fronttest sur ces prédicteurs avec nnet, j'ai obtenu 45% d'erreur. Ce n'est pas beaucoup, je ne pense pas que l'EA soit rentable. J'ai mis une limite de 10 itérations à nouveau pour trouver un meilleur résultat, je l'ai exécuté, j'attends depuis 24 heures, j'espère que gensa sera un jour complet. Je vais devoir essayer la génétique (bibliothèque GA), elle fonctionnera plus rapidement avec plusieurs threads (GA minimise plutôt que de maximiser le résultat, c'est-à-dire que le résultat de la fonction de fitness pour GA devrait changer de signe). Je vais expérimenter davantage.

J'ai lu divers articles sur le modèle en composantes principales, et maintenant j'ai essayé non seulement d'entraîner le modèle pour mesurer le R^2 et le maximiser en sélectionnant les prédicteurs, mais aussi de tester réellement le modèle sur les données du fronttest. C'est un peu ambigu. D'une part, j'ai augmenté le R^2 du modèle en supprimant les paires de prédicteurs corrélés (fonction findCorrelation de bibiloteka caret), mais il s'est avéré que le R^2 lorsque l'on teste le modèle sur les données du fronttest diminue. Le miracle ne s'est pas produit, le modèle PCA est également recyclé. Je veux essayer une estimation de prédicteur plus complexe - diviser l'échantillon de formation en deux - pour la formation proprement dite et pour la validation, former le modèle PCA, puis tester immédiatement sur l'échantillon de validation, renvoyer le R^2 minimum comme résultat final. Si cette fonction est utilisée pour l'évaluation d'un ensemble de prédicteurs et la maximisation de cette valeur, seuls les ensembles de prédicteurs qui donnent de bons résultats sur les données formées et nouvelles seront trouvés. Nous devrons le vérifier.

De plus, j'ai dû me tromper dans le texte du premier article sur l'APC dans ce fil. Il y était dit que le nombre de composants devait être choisi pour décrire 95% de la variation, je pensais qu'ils parlaient de la précision de la prédiction de la variable cible. Mais ce n'est pas le cas, les composantes principales sont construites sans aucune variable cible, et la précision de 95% est la précision avec laquelle les données brutes sont décrites en utilisant ces mêmes composantes. Et la précision des prédictions n'a absolument rien à voir avec cela.

Je ne comprends pas bien pourquoi ça a pris si longtemps. Combien d'optim_var_number avez-vous obtenu ? Il devrait être à moins de 10. Réglez-le à 1200 secondes et ça devrait être quelque chose maintenant.