Машинное обучение в трейдинге: теория, модели, практика и алготорговля - страница 754

 
Dr. Trader:

Примеры нейронок я уже выкладывал сюда, поищу что-нибудь подходящее и переделаю под ваши данные (и с комитетом). Вводных лекций я не буду писать, но я в код побольше комментов добавлю.


Извини, не понимаю смысла переменной с(F,T) В цикле

for(i in c(1:nrow(table))[c(F,T)]){
   ..... table[i,] ..... 
}

То есть этот цикл идёт по чётным строкам таблицы, а как тогда сделать по нечётным???

 

F и T это сокращения для булевых значений FALSE и TRUE, в принципе неважно - писать c(T,F) или c(TRUE,FALSE), первый вариант просто короче.

Если в таблице 10 строк, то c(1:nrow(table)) это просто вектор c(1,2,3,4,5,6,7,8,9,10). 
А массивы с булевыми значениями в этом случае будут зацикливаться до нужной длинны, получится c(TRUE,FALSE,TRUE,FALSE,TRUE,FALSE,TRUE,FALSE,TRUE,FALSE).

т.е. c(1:nrow(table))[c(F,T)] R поймёт как 
c(1,2,3,4,5,6,7,8,9,10)[c(TRUE,FALSE,TRUE,FALSE,TRUE,FALSE,TRUE,FALSE,TRUE,FALSE)]
и возьмёт те элементы вектора, которым соответствует TRUE по порядку.

Например если хочется взять каждый третий элемент, то это можно записать как
c(1,2,3,4,5,6,7,8,9,10)[c(FALSE,FALSE,TRUE,FALSE,FALSE,TRUE,FALSE,FALSE,TRUE,FALSE)]
или сокращённо 
c(1:10)[c(F,F,T)]


для нечётных элементов нужно просто поменять T и F местами: c(1:nrow(table))[c(T,F)]

 
Dr. Trader:

F и T это сокращения для булевых значений FALSE и TRUE, в принципе неважно - писать c(T,F) или c(TRUE,FALSE), первый вариант просто короче.

Если в таблице 10 строк, то c(1:nrow(table)) это просто вектор c(1,2,3,4,5,6,7,8,9,10). 
А массивы с булевыми значениями в этом случае будут зацикливаться до нужной длинны, получится c(TRUE,FALSE,TRUE,FALSE,TRUE,FALSE,TRUE,FALSE,TRUE,FALSE).

т.е. c(1:nrow(table))[c(F,T)] R поймёт как 
c(1,2,3,4,5,6,7,8,9,10)[c(TRUE,FALSE,TRUE,FALSE,TRUE,FALSE,TRUE,FALSE,TRUE,FALSE)]
и возьмёт те элементы вектора, которым соответствует TRUE по порядку.

Например если хочется взять каждый третий элемент, то это можно записать как
c(1,2,3,4,5,6,7,8,9,10)[c(FALSE,FALSE,TRUE,FALSE,FALSE,TRUE,FALSE,FALSE,TRUE,FALSE)]
или сокращённо 
c(1:10)[c(F,F,T)]


для нечётных элементов нужно просто поменять T и F местами: c(1:nrow(table))[c(T,F)]

Спасибо что не обламывает писать столь развёрнутые описания. Действительно многое становится понятным. Стыдно даже спрашивать, но решусь. Смысл задачи в следующем.....

Обучающий файл состоит из одинакого количества классов по таргету. Другими словами в таргете у меня 24 единички и 24 нуля. Повторюсь, хочу сделать как у Решетова.....

Я разбил обучающую таблицу на две таблици, где в одной все вектора, где таргет 1 в другой где таргет 0.

Беру таблицу с таргетом 1 и тут нужно создать две подтаблицs, где чётные стоки записать в  Train1, а не чётные в Train2.

Сначала делаем для чётных

for(i in c(1:nrow(Qwe_true))[c(F,T)]){
  Train1[i,]<-Qwe_true[i,]
  }

Но тогда таблица Train1 будет содержать строки c NA, а нужно чтоб Train1 была размером в 12 строк, ведь из 24 строк только 12 являются чётными. Чето голову сломал как это сделать.... 

 

Пожалуйста.

Для R нужно другое мышление, нужно мысленно оперировать векторами, тогда код писать совсем просто. Профессионалы в одну строку такое пишут что я даже не понимаю, и сам бы писал циклами в несколько строк.

Train1 <- rbind(Qwe[which(Qwe[,"target"]==1)[c(T,F)], ],  Qwe[which(Qwe[,"target"]==0)[c(T,F)], ])
Train2 <- rbind(Qwe[which(Qwe[,"target"]==1)[c(F,T)], ],  Qwe[which(Qwe[,"target"]==0)[c(F,T)], ])

пошагово - 
which(Qwe[,"target"]==1) - номера строк с таргетом 1
which(Qwe[,"target"]==1)[c(T,F)] - номера строк с таргетом1, с пропуском через 1
Qwe[which(Qwe[,"target"]==1)[c(T,F)], ] - табличка полученная из Qwe, с таргетом 1 с пропуском через 1
rbind(... , ...) - объединение двух табличек (с таргетом 1 и с таргетом 0)

 
Dr. Trader:

Пожалуйста.

Для R нужно другое мышление, нужно мысленно оперировать векторами, тогда код писать совсем просто. Профессионалы в одну строку такое пишут что я даже не понимаю, и сам бы писал циклами в несколько строк.

Train1 <- rbind(Qwe[which(Qwe[,"target"]==1)[c(T,F)], ],  Qwe[which(Qwe[,"target"]==0)[c(T,F)], ])
Train2 <- rbind(Qwe[which(Qwe[,"target"]==1)[c(F,T)], ],  Qwe[which(Qwe[,"target"]==0)[c(F,T)], ])

Ты просто монстритески шаришь. Две строки, такая гора с плечь. Ладно, продолжаю разбиратся... Спасибо!!!

 
Пятница, вечер... голова ужене варит. Как на счёт того чтоб проверить теорию вместе....С твоим умением писать на R и с моими возможностями постановки задачи (точность) мы бы за пол часа уже всё и проверили бы? Есть время? Dr.Trader
 
Не, продолжай учиться. Я помогу если будут вопросы. 
 

К эти двум выборкам нужно добавить ещё две.

MLP1=Train1+Test(Train2)

MPL2=Train2+Test(Train1)

Если сложить Test(Train2)+Test(Train1), то мы получим результат на всём участке обучения и этот участок будет тестовым, для каждого из полинома.

Может выберешь время, если сейчас нет возможно. Но это пол часа и убедились. Просто я хочу сделать зеркало. Я возьму один и тот же файл и научу его двумя способами. Потом кинем это всё на Контрольный участок и всё станет видно. Что скажешь?

 

объединить таблички можно функцией rbind()
MLP1 <- rbind(Train1, Test)

А что такое Test(Train2)? И зачем тренировочную и тестовую таблицу объединять? Тест должен быть отдельно, чтоб проверить на нём уже готовую обученную модель.

Всё выйдет не так просто и быстро как ты хочешь. Это в модель Решетова можно просто взять и подать данные, и модель сама будет заниматься отсевом предикторов, определением весов, числа нейронов, и прочего. А с обычной нейронкой так нельзя, параметры нейронки нужно подбирать кроссвалидацией, например как в том примере что я сегодня написал тут, или как в статьях Владимира Перервенко.


Ещё раз посмотри что я там написал - https://www.mql5.com/ru/forum/86386/page753#comment_6821981
просто подставь в тот код свои данные по описанию, и запусти. Если предикторы взяты все подряд и не отсеяны, то с первого раза всё выйдет наверное плохо. После выполнения кода ещё дополнительно выполни команду max(gaResult@fitness) это покажет R2 оценку лучшей модели найденной генетикой. Если оценка близка к 1 или чуть меньше - то хорошо, если близка к 0 или даже отрицательна - то плохо. 

Потом в PREDICTOR_COLUMNS укажи конкретные номера колонок которые ты определил как хорошие, и ещё раз запусти код, модель обучится только на этих предикторах. В идеале оценка лучшей модели найденной генетикой должно быть близка к 1, а точность на тренировочной и на тестовой табличке - 1.00 . 

Тестовая табличка - должна быть по времени строго после тренировочных данных, как будто это модель торгует уже на рынке.

Если с тем кодом ничего хорошего не получится (даже с KFOLDS=10) - значит не судьба. Если получится - значит есть хорошая альтернатива модели Решетова, и можно дальше разбираться с этим кодом и переносить модель в mql.

 

Я в общем к тому что если что-то сделать как в модели Решетова, что-то дописать, потом взять обычную нейронку и как-то смешать с предыдущими шагами, и ждать что всё это заработает как у Решетова - это получится бесперспективный долгий процесс, на который я точно не подписываюсь. 

Если хочется тот-же результат как у Решетова, но в R, то тогда нужно брать и переписывать весь джава код модели в R. 

Зато есть много альтернатив. Если с ними получится ещё лучше чем у Решетова - то вообще отлично, больше ничего и не надо, всё готово.

Причина обращения: