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

 
Записал этот код в скрипт и несколько раз его запустил, получил результаты немного отличающиеся раз от раза...
 
Vizard_:

set.seed(1234)

Это что такое и куда его пихать??

 
Mihail Marchukajtes:

, то это более чем половина дела... так то....

90%, а модели - это дело техники, в caret полно этого добра с соответствующей обвязкой. 

 

Вот заодно и пример с vtreat, 

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

forexFeatures <- read.csv2("Qwe.txt", dec=".")
forexFeatures <- forexFeatures[,-1]

library(vtreat)


#designTreatmentsC подходит только для классификации с двумя классами
treatmentsC <- designTreatmentsC(dframe = forexFeatures,
                                 varlist=colnames(forexFeatures)[-ncol(forexFeatures)], #названия колонок с предикторами (тут - все кроме последней колонки)
                                 outcomename = colnames(forexFeatures)[ncol(forexFeatures)], #названия колонок с таргетом (тут - последняя колонка)
                                 outcometarget = "1") #текст или цифра одного из классов
#обработка, сортировка результата
treatmensC_scores <- treatmentsC$scoreFrame[order(treatmentsC$scoreFrame$sig),]
treatmensC_scores <- treatmensC_scores[!duplicated(treatmensC_scores$origName),]
treatmensC_scores <- treatmensC_scores[,c("origName","sig")] 
treatmensC_scores$is_good <- treatmensC_scores$sig <= 1/nrow(forexFeatures)
treatmensC_scores #вывод на экран таблички результатов. Лучшие предикторы вверху таблицы. Чем оценка sig меньше тем лучше. Желательно (колонка is_good==TRUE) чтоб sig была меньше чем 1/nrow(forexFeatures), всё что больше - плохо 


#designTreatmentsN подходит для регрессии или если больше двух классов. Если всего два класса то предпочтительнее использовать C функцию, она вроде как и коррелирующие предикторы убирает заодно.
treatmentsN <- designTreatmentsN(dframe = forexFeatures,
                                 varlist=colnames(forexFeatures)[-ncol(forexFeatures)], #названия колонок с предикторами (тут - все кроме последней колонки)
                                 outcomename = colnames(forexFeatures)[ncol(forexFeatures)]) #названия колонок с таргетом (тут - последняя колонка)
#обработка, сортировка результата
treatmensN_scores <- treatmentsN$scoreFrame[order(treatmentsN$scoreFrame$sig),]
treatmensN_scores <- treatmensN_scores[!duplicated(treatmensN_scores$origName),]
treatmensN_scores <- treatmensN_scores[,c("origName","sig")] 
treatmensN_scores$is_good <- treatmensN_scores$sig <= 1/nrow(forexFeatures)
treatmensN_scores #вывод на экран таблички результатов. Лучшие предикторы вверху таблицы. Чем оценка sig меньше тем лучше. Желательно (колонка is_good==TRUE) чтоб sig была меньше чем 1/nrow(forexFeatures), всё что больше - плохо

 
Mihail Marchukajtes:
Это что такое и куда его пихать??

set.seed устанавливает начальное зерно генератора случайных чисел. Если перед запуском кода ставить его в одно и тоже состояние (типа 1234), то и последующий код выполнится одинаково во всех случаях.

read.csv2(.. итд
set.seed(1234)
Boruta(TargetProf... итд)

Но наверное алгоритму нужно больше итераций (maxRuns = 1000000 например), он не укладывается в столь малое число как по дефолту и останавливается на полпути.

 

Я вот над регрессией задумался....
Регрессия на фин. рынках скорее не гладкая функция, а ступенчатая с шагом в 1 пт. (и для учителя и для прогноза). Если например ограничиться движением в +/- 100 пт., то тогда прослеживается аналогия с классификацией, на 200 классов. Т.е. на выходе мы предсказываем наиболее вероятный класс - например +22 пт.
Не означает ли это, что для хороших результатов структура/сложность модели (число нейронов) для регрессии должна быть в 200 раз больше? Ну если увеличить шаг до 5 пт, то в 40 раз - чуть поэкономнее будет за счет меньшей точности.

 
Прогнал файл в vtreat, признаюсь не густо. Всего 4 входа отобрал. Спасибо за подсказки..... буду крутить дальше....
 
Vizard_:

Теперь впомни боксплот, сделай что нить с входами и прогони еще раз.

Параметр set.seed в обоих случаях одинаков.

Что сделать то с входами???

Мдя..... признаюсь я ожидал лучшего от своих входов. Во всяком случае думал что важных будет побольше, ну уж никак не четыре из 100. На таком количестве входов модели получаются уж больно совсем маленькие, хотя из практики было замечено, чем модель проще тем она работает лучше. И глядя на полученную модель и проведя свои тесты я понимаю что эта маленькая засранка чертовски хороша..... Выводы делать рано, нужно больше тестов. Продолжаю копать....

 
везде где я был написавши
forexFeatures <- read.csv2("Qwe.txt")

на самом деле нужно
forexFeatures <- read.csv2("Qwe.txt", dec=".")

Извиняюсь, недоглядел формат в вашем файле. Поправлю старые посты. Код запустите заново, результаты должны быть качественнее, а то все числа с десятичными дробями обрабатывались не так как надо.
 
Mihail Marchukajtes:

Что сделать то с входами???

jPrediction например шкалирует данные в интервал [-1;1], и уже на этих числах обучается. Можно и в R шкалировать к этому-же интервалу перед оценкой входов.

forexFeatures <- read.csv2("Qwe.txt", dec=".")

for(i in 1:(ncol(forexFeatures)-1)){
  forexFeatures[,i] <- (forexFeatures[,i] - min(forexFeatures[,i]))/(max(forexFeatures[,i])-min(forexFeatures[,i]))*2-1
}

vtreat, Boruta, etc,...

Методы оценки основанные на деревьях наверное не изменят результат, лесам не особо важно в каком интервале пришли данные, но лучше проверить. vtreat тоже не привередлив к интервалу. 


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