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

 
elibrarius:
Si vous commencez quelque chose pour un mois - utilisez une alimentation ininterrompue pour votre ordinateur, j'ai une fois eu 2 semaines de calculs, la lumière était éteinte))
Et la version GPU n'attend pas grand chose, réécrire du code me semble plus long et si l'auteur ne l'a pas fait, il est peu probable que quelqu'un d'autre finisse cette tâche jusqu'au bout.

Eh bien, l'auteur a tout mis en parallèle, maintenant je dois juste l'exécuter. Quoi qu'il en soit, j'ai maximisé l'exécution pendant 3 jours et j'ai obtenu un modèle avec 9 entrées, ce qui est un record pour moi maintenant pour être honnête. Je ne veux pas vraiment l'optimiser pendant si longtemps. Mais comme on dit. Le marché l'exige. Par conséquent, à la recherche de capacités, si quelqu'un a l'occasion d'optimiser un jeu de données sur l'optimiseur, et même sur 20-30 cœurs, je lui en serais très reconnaissant.
 

Mihail Marchukajtes:

des jours, des semaines d'apprentissage.

Apparemment, votre algorithme n'est pas optimal. Sur de si petits ensembles de données, vous pouvez utiliser en toute sécurité des algorithmes de forçage brutal tels que Knn, qui sont quasi-optimaux, si l'algorithme est plus lent que Knn, c'est probablement un mauvais algorithme ML ou une mauvaise configuration. Sur un tel jeu de données, l'ensemble du cycle d'apprentissage et l'exécution de l'ensemble des données ne devraient pas prendre plus d'une seconde.
 
pantural:
Apparemment, votre algorithme n'est pas optimal. Sur de si petits ensembles de données, vous pouvez utiliser en toute sécurité des algorithmes de forçage brutal tels que Knn, qui sont quasi-optimaux, si l'algorithme est plus lent que Knn, il s'agit probablement d'un mauvais algorithme ML ou d'une mauvaise configuration. Sur un tel ensemble de données, le cycle d'entraînement et l'exécution de l'ensemble ne devraient pas prendre plus d'une seconde.

J'ai expliqué plus haut. 100 divisions chaque division est entraînée 1000 époques etc. L'essence de l'optimiseur est de calculer le jeu de données de manière à ce qu'il n'y ait aucune question sur son adéquation. C'est-à-dire qu'il fait tourner ce dossier dans tous les sens, et vous ne cessez de le comparer à l'entraînement d'un seul neurone. IMHO. Il s'agit essentiellement d'un système d'IA dans lequel toutes sortes d'optimisations et de prétraitements sont effectués en même temps que la formation des neurones, et la formation elle-même est exécutée des centaines de fois. Si quelque chose....
 
Mihail Marchukajtes:

J'ai expliqué plus haut. 100 divisions, chaque division est entraînée pendant 1000 époques, etc. Vous faites une fixation sur un seul entraînement d'un neurone, alors que l'essence de l'optimiseur est de calculer un ensemble de données de manière à ce qu'il n'y ait aucune question sur son adéquation. En d'autres termes, il fait tourner ce dossier de haut en bas au sens figuré, et vous continuez à le comparer à une formation unique d'un neurone. IMHO. Il s'agit essentiellement d'un système d'IA dans lequel toutes sortes d'optimisations et de prétraitements sont effectués en même temps que la formation des neurones, et la formation elle-même est exécutée des centaines de fois. Si quelque chose....
Je suis généralement contre toutes ces formations, mais votre machine est définitivement un cancre qui l'a inventée, même moi je peux la comprendre.
 
elibrarius:
MLP devine 95% du temps... Je ne pense pas que vous fassiez le bon vélo) Sans vouloir vous offenser.

Vous avez une erreur.
La toute première colonne du tableau est le numéro de ligne, et cette colonne ne peut pas être utilisée dans la prédiction, mais elle n'est requise que pour jPrediction pour une raison quelconque.

La cible est distribuée de manière à ce que la première moitié des lignes soit de classe 0, et la seconde moitié des lignes de classe 1. Le neurone se souvient donc simplement que si le numéro de la ligne est inférieur à 228, il s'agit de la classe 0, sinon de la classe 1.

 
Dr. Trader:

Vous avez une erreur.
La toute première colonne du tableau est un numéro de ligne et vous ne pouvez pas utiliser cette colonne dans la prédiction, mais elle est obligatoire uniquement pour jPrediction pour une raison quelconque.

La cible est distribuée de manière à ce que la première moitié des lignes soit de classe 0, et la seconde moitié des lignes de classe 1. Ainsi, le neurone se souvient simplement que si le numéro de ligne est inférieur à 228, c'est la classe 0, sinon c'est la classe 1.

Oh, au fait, oui. Je n'avais pas remarqué que c'était juste un numéro.

Sans elle Entrées à conserver : 4,50,53,59,61,64,92,98,101,104,

Erreur moyenne en formation (60,0%) =0,269 (26,9%) nLearns=2 NGrad=7376 NHess=0 NCholesky=0 codResp=2
Erreur moyenne sur la validation (20,0 %) parcelle =0,864 (86,4 %) nLearns=2 NGrad=7376 NHess=0 NCholesky=0 codResp=2
Erreur moyenne sur le test (20,0%) plot =0,885 (88,5%) nLearns=2 NGrad=7376 NHess=0 NCholesky=0 codResp=2

Clairement du surentraînement. Je dois donc passer les données en revue d'une manière différente.

Peut-être trier par poids des entrées ? Comme vous l'avez fait pour le problème dans le premier message du fil...

J'essaie de réécrire votre script R ci-joint, afin qu'il puisse déterminer les noms et le nombre de colonnes... mais je ne connais pas assez le R.

 
elibrarius:

J'essaie de réécrire le script R que vous avez joint, afin qu'il détermine les noms et le nombre de colonnes... mais je ne connais pas assez le R.


Je commençais encore à apprendre R à l'époque, le script est presque entièrement généré dans rattle (environnement visuel pour le traitement des données dans R), c'est pourquoi il est si complexe et personnalisé pour toutes les occasions.


Ce...

crs$input <- c("input_1", "input_2", "input_3", "input_4",
     "input_5", "input_6", "input_7", "input_8",
     "input_9", "input_10", "input_11", "input_12",
     "input_13", "input_14", "input_15", "input_16",
     "input_17", "input_18", "input_19", "input_20")

crs$numeric <- c("input_1", "input_2", "input_3", "input_4",
     "input_5", "input_6", "input_7", "input_8",
     "input_9", "input_10", "input_11", "input_12",
     "input_13", "input_14", "input_15", "input_16",
     "input_17", "input_18", "input_19", "input_20")

devrait être changé en...

crs$input <- colnames(crs$dataset)[-ncol(crs$dataset)]

crs$numeric <- crs$input

Et ça devrait aller.


En général, c'est une mauvaise approche, vous ne devriez pas définir l'importance des entrées de cette façon. Pour une raison quelconque, ça a marché cette fois-là, mais ça ne m'a plus jamais aidé.

 

Il est préférable de définir l'importance des prédicteurs de la manière suivante

library(vtreat)

sourceTable <- read.table("BuySell.csv", sep=";", header = TRUE, stringsAsFactors = FALSE)

#Эта  строка кода относится только к конкретно этому файлу.
 этом csv первая колонка и первая строка специально заполнены для конкретной модели, и тут не нужны. Удалить.
#для  обычных csv файлов такую команду выполнять не нужно.
sourceTable <- sourceTable[-1,-1]

#число колонок
sourceTable_ncol <- ncol(sourceTable)

#Оценка  для классификации, только для двух классов.
#Outcometarget  должен быть равен значению одного из классов.
#На  выбор или эта функция designTreatmentsC, или designTreatmentsN, или designTreatmentsZ (ниже, закоменчены)
#Взаимная  корреляция предкиторов учитывается только в designTreatmentsC, и у повторяющихся или похожих предикторов оценка будет понижаться
set.seed(0)
treats <- designTreatmentsC(dframe = sourceTable,
                            varlist = colnames(sourceTable)[-sourceTable_ncol],
                            outcomename = colnames(sourceTable)[sourceTable_ncol],
                            outcometarget = 1,
                            verbose = FALSE
)

# #оценка  для регрессии или если больше двух классов
#  sourceTable[,sourceTable_ncol] <- as.numeric(sourceTable[,sourceTable_ncol])
#  set.seed(0)
#  treats <- designTreatmentsN(dframe = sourceTable,
#                              varlist = colnames(sourceTable)[-sourceTable_ncol],
#                              outcomename = colnames(sourceTable)[sourceTable_ncol],
#                              verbose = FALSE
# )

# #Оценка  предикторов без учёта цели.
#  set.seed(0)
#  treats <- designTreatmentsZ(dframe = sourceTable,
#                              varlist = colnames(sourceTable)[-sourceTable_ncol],
#                              verbose = FALSE
# )
# 




#табличка  только с названием колонки и её оценкой важности
resultTable <- treats$scoreFrame[,c("varName", "sig")]

#сортировка
 resultTable <- resultTable[order(resultTable$sig),]

#согласно  общему правилу, оценка предиктора (sig) должна быть меньше 1/<общее число предикторов>
#чем  оценка меньше, тем лучше
resultTable$testPassed <- resultTable$sig < 1/(sourceTable_ncol-1)

#для  создания модели и прогноза лучше использовать только те предкторы у которых testPassed == TRUE
resultTable
 

Les résultats de l'évaluation de l'importance sont les suivants. Plus le prédicteur est élevé dans le tableau, mieux c'est. SeulsVVolum6, VDel1, VVolum9, VQST10 ont passé le test.

Dans rattle, nous pouvons construire 6 modèles à la fois sur ces 4 prédicteurs, et le SVM montre une précision d'environ 55% sur les données de validation et de test. Pas mal.

             varName sig testPassed 182 VVolum6_catB 3.220305e-06 VRAI 28 VDel1_catB 1.930275e-03 VRAI 186 VVolum9_catB 5.946373e-03 VRAI 143 VQST10_catB 8.458616e-03 VRAI 126 VQST_catB 1.843740e-02 FAUX 23 Del11_catP 2.315340e-02 FAUX 147 Volum_catP 2.331145e-02 FAUX 24 Del11_catB 2.429723e-02 FALSE 154 Volum3_catB 2.985041e-02 FALSE 12 Del5_catP 3.689965e-02 FALSE 120 QST9_catB 4.092966e-02 FALSE 130 VQST2_catB 4.136235e-02 FALSE 163 Volum9_catP 4.299684e-02 FALSE 109 QST2_catB 4.311742e-02 FALSE 32 VDel3_catB 4.704981e-02 FALSE 11 Del5_lev_x.1 4.725332e-02 FALSE 19 Del9_catB 5.316355e-02 FALSE 13 Del5_catB 5.472078e-02 FALSE 178 VVolum4_catB 5.705614e-02 FALSE 191 VVolum11_catB 5.749245e-02 FALSE 148 Volum_catB 6.281945e-02 FALSE 181 VVolum6_catP 6.534487e-02 FALSE 31 VDel3_catP 6.911261e-02 FAUX 74 VST11_catB 7.709038e-02 FAUX 134 VQST4_catB 9.536026e-02 FAUX 141 VQST9_catB 9.536026e-02 FAUX 162 Volum7_catB 9.589108e-02 FALSE 107 QST1_catB 9.589108e-02 FALSE 2 Del_catB 1.049703e-01 FALSE 151 Volum2_catP 1.071203e-01 FALSE 60 ST11_catB 1.076877e-01 FALSE 43 VDel10_catP 1.201338e-01 FALSE 184 VVolum7_catB 1.286891e-01 FALSE 121 QST10_catP 1.464880e-01 FALSE 38 VDel6_catB 1.479268e-01 FALSE 173 VVolum2_catP 1.663695e-01 FALSE 8 Del3_catB 1.703652e-01 FALSE 10 Del4_catB 1.755150e-01 FALSE 30 VDel2_catB 1.781568e-01 FALSE 37 VDel6_catP 1.797087e-01 FALSE 1 Del_catP 1.995316e-01 FALSE 112 QST4_catP 2.104902e-01 FALSE 15 Del6_catB 2.132517e-01 FALSE 27 VDel1_catP 2.313270e-01 FALSE 41 VDel9_catP 2.316597e-01 FALSE 100 VAD11_catP 2.320692e-01 FALSE 144 VQST11_lev_x.100 2.374690e-01 FAUX 123 QST11_catP 2.576971e-01 FAUX 145 VQST11_catP 2.626389e-01 FAUX 104 QST_catP 2.716664e-01 FAUX 160 Volum6_catB 2.776463e-01 FALSE 115 QST6_catP 3.034207e-01 FALSE 137 VQST6_catB 3.060767e-01 FALSE 102 QST_lev_x.100 3.061104e-01 FALSE 36 VDel5_catB 3.149911e-01 FALSE 99 VAD11_lev_x.0 3.340276e-01 FALSE 17 Del7_catB 3.431346e-01 FALSE 16 Del7_catP 3.819094e-01 FALSE 3 Del1_catP 3.912432e-01 FALSE 152 Volum2_catB 3.938369e-01 FALSE 44 VDel10_catB 3.965567e-01 FALSE 5 Del2_catP 4.363645e-01 FALSE 20 Del10_catP 4.409282e-01 FALSE 171 VVolum1_catP 4.550495e-01 FALSE 169 VVolum_catP 4.682515e-01 FALSE 46 VDel11_catP 4.693330e-01 FALSE 86 AD11_catP 4.742976e-01 FALSE 187 VVolum10_catP 4.963890e-01 FALSE 132 VQST3_catP 5.291401e-01 FALSE 14 Del6_catP 5.310502e-01 FALSE 124 QST11_catP 5.355186e-01 FALSE 177 VVolum4_catP 5.542335e-01 FALSE 150 Volum1_catP 5.552986e-01 FALSE 39 VDel7_catP 5.589613e-01 FALSE 185 VVolum9_catP 5.589901e-01 FALSE 59 ST11_catP 5.669251e-01 FALSE 188 VVolum10_catB 5.680089e-01 FALSE 21 Del10_catB 5.706515e-01 FALSE 9 Del4_catP 5.708557e-01 FALSE 142 VQST10_catP 5.725309e-01 FALSE 113 QST4_catB 5.856434e-01 FALSE 119 QST9_catP 5.922916e-01 FALSE 131 VQST3_catP 6.033950e-01 FALSE 168 Volum11_catB 6.156530e-01 FALSE 155 Volum4_catP 6.196455e-01 FALSE 170 VVolum_catB 6.244269e-01 FALSE 180 VVolum5_catB 6.279081e-01 FALSE 87 AD11_catB 6.372863e-01 FALSE 153 Volum3_catP 6.641713e-01 FALSE 73 VST11_catP 6.701117e-01 FALSE 172 VVolum1_catB 6.707140e-01 FALSE 183 VVolum7_catP 6.771533e-01 FALSE 55 ST6_catB 6.780044e-01 FALSE 42 VDel9_catB 6.925700e-01 FALSE 167 Volum11_catP 6.973599e-01 FALSE 179 VVolum5_catP 7.093678e-01 FALSE 125 VQST_catP 7.189573e-01 FALSE 146 VQST11_catB 7.195859e-01 FALSE 101 VAD11_catB 7.250369e-01 FALSE 25 VDel_catP 7.310211e-01 FALSE 108 QST2_catP 7.426980e-01 FALSE 29 VDel2_catP 7.486648e-01 FALSE 136 VQST6_catP 7.529104e-01 FALSE 103 QST_lev_x.0 7.600202e-01 FALSE 22 Del11_lev_x.0 7.600202e-01 FALSE 47 VDel11_catB 7.619000e-01 FALSE 140 VQST9_catP 7.684919e-01 FALSE 164 Volum9_catB 7.743767e-01 FALSE 4 Del1_catB 7.796789e-01 FALSE 158 Volum5_catB 7.804397e-01 FALSE 117 QST7_catP 7.843659e-01 FALSE 26 VDel_catB 7.904299e-01 FALSE 166 Volum10_catB 7.936121e-01 FALSE 165 Volum10_catP 8.017445e-01 FALSE 6 Del2_catB 8.104867e-01 FALSE 190 VVolum11_catP 8.133908e-01 FALSE 45 VDel11_lev_x 8.231377e-01 FALSE 189 VVolum11_lev_x.0 8.231377e-01 FALSE 105 QST_catB 8.431046e-01 FALSE 174 VVolum2_catB 8.506238e-01 FALSE 81 AD6_catP 8.552222e-01 FALSE 94 VAD6_catP 8.552222e-01 FALSE 110 QST3_catP 8.560370e-01 FALSE 35 VDel5_catP 8.633955e-01 FALSE 122 QST10_catB 8.651814e-01 FALSE 18 Del9_catP 8.816989e-01 FALSE 34 VDel4_catB 8.909886e-01 FALSE 176 VVolum3_catB 8.911481e-01 FALSE 159 Volum6_catP 9.086195e-01 FALSE 106 QST1_catP 9.218420e-01 FALSE 133 VQST4_catP 9.218420e-01 FALSE 70 VST9_catP 9.223350e-01 FALSE 129 VQST2_catP 9.276503e-01 FALSE 54 ST6_catP 9.371128e-01 FALSE 161 Volum7_catP 9.634046e-01 FALSE 138 VQST7_catP 9.991105e-01 FALSE 116 QST6_catB 9.992413e-01 FALSE 7 Del3_catP 9.993376e-01 FALSE 33 VDel4_catP 9.994999e-01 FALSE 40 VDel7_catB 9.995014e-01 FALSE 157 Volum5_catP 9.995728e-01 FALSE 156 Volum4_catB 9.995799e-01 FALSE 118 QST7_catB 9.995921e-01 FALSE 139 VQST7_catB 9.995937e-01 FALSE 175 VVolum3_catP 9.996133e-01 FAUX 149 Volum1_catP 9.996479e-01 FAUX 48 ST_catB 1.000000e+00 FAUX 49 ST1_catB 1.000000e+00 FAUX 50 ST2_catB 1.000000e+00 FAUX 51 ST3_catB 1.000000e+00 FALSE 52 ST4_catB 1.000000e+00 FALSE 53 ST5_catB 1.000000e+00 FALSE 56 ST7_catB 1.000000e+00 FALSE 57 ST9_catB 1.000000e+00 FALSE 58 ST10_catB 1.000000e+00 FALSE 61 VST_catB 1.000000e+00 FALSE 62 VST1_catB 1.000000e+00 FALSE 63 VST2_catB 1.000000e+00 FALSE 64 VST3_catB 1.000000e+00 FALSE 65 VST4_catB 1.000000e+00 FALSE 66 VST5_catB 1.000000e+00 FALSE 67 VST6_catP 1.000000e+00 FALSE 68 VST6_catB 1.000000e+00 FALSE 69 VST7_catB 1.000000e+00 FALSE 71 VST9_catB 1.000000e+00 FALSE 72 VST10_catB 1.000000e+00 FALSE 75 AD_catB 1.000000e+00 FALSE 76 AD1_catB 1.000000e+00 FALSE 77 AD2_catB 1.000000e+00 FALSE 78 AD3_catB 1.000000e+00 FALSE 79 AD4_catB 1.000000e+00 FALSE 80 AD5_catB 1.000000e+00 FALSE 82 AD6_catB 1.000000e+00 FALSE 83 AD7_catB 1.000000e+00 FALSE 84 AD9_catB 1.000000e+00 FALSE 85 AD10_catB 1.000000e+00 FALSE 88 VAD_catB 1.000000e+00 FALSE 89 VAD1_catB 1.000000e+00 FALSE 90 VAD2_catB 1.000000e+00 FALSE 91 VAD3_catB 1.000000e+00 FALSE 92 VAD4_catB 1.000000e+00 FALSE 93 VAD5_catB 1.000000e+00 FALSE 95 VAD6_catB 1.000000e+00 FALSE 96 VAD7_catB 1.000000e+00 FALSE 97 VAD9_catB 1.000000e+00 FALSE 98 VAD10_catB 1.000000e+00 FALSE 111 QST3_catB 1.000000e+00 FALSE 114 QST5_catB 1.000000e+00 FALSE 127 VQST1_catP 1.000000e+00 FALSE 128 VQST1_catB 1.000000e+00 FALSE 135 VQST5_catB 1.000000e+00 FALSE
 
elibrarius:
MLP fait bien les choses 95% du temps... Je ne pense pas que vous fassiez le bon vélo) Sans vouloir vous offenser.
Je fabrique aussi mon propre vélo, mais en me basant sur des décennies de MLP éprouvée (dont on dit qu'elle est obsolète et qu'elle a besoin de quelque chose de plus cool pour travailler).


Et essayez aussi les arbres de décision alglib, ils comptent plus vite et ont de meilleures performances que mlp. Diplerning est également plus rapide, mais pas dans alglib.

L'essentiel est le rapport vitesse/qualité, à quoi bon attendre une semaine, voire un jour ou même une heure, pour ne jamais trouver la combinaison optimale). Le modèle prend quelques secondes à apprendre, puis vous pouvez utiliser la génétique pour l'autosimulation des paramètres ou des prédicteurs, alors c'est de l'IA pure, sinon c'est de la merde).