Ticarette makine öğrenimi: teori, pratik, ticaret ve daha fazlası - sayfa 213

 

Başka bir simülasyon örneği.

20.000 doğrusal model oluşturulmuştur (her yerde 1000 gözlem, tahminci sayısı 1 ila 20 arasındadır (her sayı için 1000 model), artı bir bağımsız değişken). Veri kimliği, N(0,1).

Simülasyonun amacı, doğrusal modelin gereksinimlerini karşılayan bağımsız veriler (bağımlılık içermeyen) üzerinde bir LSM regresyonu oluştururken, F-istatistiğinin kritik bir değeri aşmadığından emin olmaktır. Bu, modelin eğitiminin bir göstergesi olarak kullanılabileceği anlamına gelir.

############### simulate lm f-stats with random vars


rm(list=ls());gc()


library(data.table)

library(ggplot2)


start <- Sys.time()


set.seed(1)


x <- as.data.table(matrix(rnorm(21000000, 0, 1), ncol = 21))

x[, sampling:= sample(1000, nrow(x), replace = T)]


lm_models <- x[, 

 {

  lapply(c(1:20), function(x) summary(lm(data = .SD[, c(1:x, 21), with = F], formula = V21 ~ . -1))$'fstatistic'[[1]])

 }

 , by = sampling

]


lm_models_melted <- melt(lm_models, measure.vars = paste0('V', c(1:20)))


crtitical_f_stats <- qf(p = 0.99, df1 = c(1:20), df2 = 1000, lower.tail = TRUE, log.p = FALSE)


boxplot(data = lm_models_melted, value ~ variable); lines(crtitical_f_stats, type = 's', col = 'red')


Sys.time() - start


gc()

Kod çalışma süresi: 1.35 dakika.

 

Yararlı kod. İşlem dizileri üç şekilde görselleştirilir.

##########################


rm(list=ls());gc()


library(data.table)

library(ggplot2)

library(gridExtra)

library(tseries)


start <- Sys.time()


set.seed(1)


x <- as.data.table(matrix(rnorm(1000000, 0.1, 1), ncol = 1)) #random normal value with positive expectation

x[, variable:= rep(1:1000, times = 1000)]

x[, trade:= 1:.N, by = variable]


x.cast = dcast.data.table(x, variable ~ trade, value.var = 'V1', fun.aggregate = sum)

x_cum <- x.cast[, as.list(cumsum(unlist(.SD))), by = variable]


monte_trades <- melt(x_cum, measure.vars = names(x_cum)[-1], variable.name = "trade", value.name = 'V1')

setorder(monte_trades, variable, trade)

monte_trades_last <- as.data.table(monte_trades[trade == '1000', V1])

quantile_trade <- monte_trades[, quantile(V1, probs = 0.05), by = trade]

RF_last <- monte_trades[, V1[.N] / maxdrawdown(V1)[[1]], by = variable]



p1 <- ggplot(data = monte_trades, aes(x = trade, y = V1, group = variable)) +

geom_line(size = 2, color = 'blue', alpha = 0.01) + 

geom_line(data = quantile_trade, aes(x = trade, y = V1, group = 1), size = 2, alpha = 0.5, colour = 'blue') +

ggtitle('Simulated Trade Sequences of Length 1000')


p2 <- ggplot(data = monte_trades_last, aes(V1)) +

geom_density(alpha = 0.1, size = 1, color = 'blue', fill = 'blue') + 

scale_x_continuous(limits = c(min(monte_trades$V1), max(monte_trades$V1))) +

coord_flip() +

ggtitle('Cumulative Profit Density')


p3 <- ggplot(data = RF_last, aes(V1)) +

geom_density(alpha = 0.1, size = 1, color = 'blue', fill = 'blue') + 

geom_vline(xintercept = mean(RF_last$V1), colour = "blue", linetype = 2, size = 1) +

geom_vline(xintercept = median(RF_last$V1), colour = "red", linetype = 2, size = 1) +

ggtitle('Recovery Factor Density + Mean (blue) and Median (red)')


grid.arrange(p1, p2, p3, ncol = 3)


Sys.time() - start


gc()

Yaklaşık 45 sn çalışır. Yaklaşık 1.5 dakika işliyor.

 
Alexey Burnakov :


Güzel teşekkür ederim.
 
Alexey Burnakov :

Simülasyonun amacı, doğrusal modelin gereksinimlerini karşılayan bağımsız veriler (bağımlılık içermeyen) üzerinde bir LSM regresyonu oluştururken, F-istatistiğinin kritik bir değeri aşmadığından emin olmaktır. Bu nedenle, model öğrenmenin bir göstergesi olarak kullanılabilir.

Fstatistic'i tam olarak anlamadım. Buradaki veriler rastgeledir, ancak model bir şeyler öğrenmiştir, bu nedenle modelin takıldığı ve fazla takıldığı sonucuna varabiliriz. Bu, modelin değerlendirmesinin kötü olması gerektiği anlamına gelir. Onlar. Negatif bir fstatistiс veya grafikte her şeyin kötü olduğuna dair başka bir gösterge bekliyordum.
Bu örnekten elde edilen sonuç nasıl doğru bir şekilde yorumlanır?
İlk tahmin edicinin birinci + saniyeden daha iyi kabul edilebileceğini anlıyorum. Ve 1+2, 1+2+3'ten daha iyidir. Bunun gibi bir şey mi? En yüksek istatistiki değeri verecek bir dizi tahmin ediciyi seçmek için genetiği kullanmak mantıklı mı?
 
Dr.Tüccar :
Fstatistic'i tam olarak anlamadım. Buradaki veriler rastgeledir, ancak model bir şeyler öğrenmiştir, bu nedenle modelin takıldığı ve fazla takıldığı sonucuna varabiliriz. Bu, modelin değerlendirmesinin kötü olması gerektiği anlamına gelir. Onlar. Negatif bir istatistik bekliyordum ya da grafikte her şeyin kötü olduğuna dair başka bir gösterge.
Bu örnekten çıkan sonuç nasıl doğru bir şekilde yorumlanır?
İlk tahmin edicinin birinci + saniyeden daha iyi kabul edilebileceğini anlıyorum. Ve 1+2, 1+2+3'ten daha iyidir. Bunun gibi bir şey mi? En yüksek istatistiki değeri verecek bir dizi tahmin ediciyi seçmek için genetiği kullanmak mantıklı mı?

Tablo F dağılımına bakın. http://www.socr.ucla.edu/applets.dir/f_table.html

F istatistiği, serbestlik derecelerine bağlı bir niceliktir. Tek taraflı bir dağılımımız olduğu için her zaman pozitiftir.

Ancak, eğitilen modelin yüksek bir F istatistiğine sahip olması gerektiğinden model hiçbir şey öğrenmez (belirli bir alfa için kritik değerden büyük veya buna eşit - sıfır hipotezini test ederken duyulduğu gibi).

Her durumda, alfa = 0,01'deki kritik değeri aşmadılar, ancak örneğin 0,0001'i ayarlayabilirsiniz.

Aynı zamanda, lineer modele gürültü değişkenleri eklemenin öğrenmede bir artış göstermeyeceğinden emin olmak istedim (bunu üniversitede okumadım). Ne görüldü...

F-Distribution Tables
  • Ivo Dinov: www.SOCR.ucla.edu
  • www.socr.ucla.edu
Statistics Online Computational Resource
 
Alexey Burnakov :

Yararlı kod. İşlem dizileri üç şekilde görselleştirilir.

Yukarıdaki kodla ilgili. Lütfen koda en azından kısa yorumlar yazın. Özellikle karmaşık ifadeler kullanırken. Herkes "data.table" paketini bilmiyor ve kullanmıyor, dcast.data.table'ın ne yaptığını, .N, .SD'nin ne olduğunu açıklamak gereksiz değil. Konunun ne kadar derinde olduğunu göstermemek için kodu yayınlıyorsunuz. Benim düşünceme göre, yayınlanan kod diğer kullanıcıların (ilk eğitim seviyesinde bile) komut dosyasını anlamalarına yardımcı olmalıdır.

R'nin eylemi birkaç şekilde programlamanıza izin vermesi harika, ancak kodun okunabilirliğinin kaybolmaması arzu edilir.

Birkaç kod önerisi:

- ara değişkenler x, x.cast, x.cum hesaplamalarda gerekli değildir ve sadece hafızayı işgal eder. Boru aracılığıyla ara sonuçların kaydedilmesini gerektirmeyen tüm hesaplamaların yapılması arzu edilir.

örneğin

#---variant-------------
rm(list=ls());gc()
library(data.table)
library(ggplot2)
library(gridExtra)
library(tseries)
#----
require(magrittr)
require(dplyr)
start <- Sys.time()
monte_trades <- as .data.table(matrix(rnorm( 1000000 , 0.1 , 1 ), ncol = 1 )) %>%
        .[, variable := rep( 1 : 1000 , times = 1000 )]%>%
        .[, trade := 1 :.N, by = variable] %>%
        dcast.data.table(., variable ~ trade, value . var = 'V1' , fun.aggregate = sum)%>%
        .[, as .list(cumsum(unlist(.SD))), by = variable]%>%
        melt(., measure.vars = names(.)[- 1 ], variable.name = "trade" , value .name = 'V1' )%>%
        setorder(., variable, trade)
monte_trades_last <- as .data.table(monte_trades[trade == '1000' , V1])
quantile_trade <- monte_trades[, quantile(V1, probs = 0.05 ), by = trade]
RF_last <- monte_trades[, V1[.N] / maxdrawdown(V1)[[ 1 ]], by = variable]
Sys.time() - start
#Time difference of 2.247022 secs

Ve elbette, grafikleri oluşturmak çok uzun zaman alıyor.

Eleştiri değil.

İyi şanlar

 
Dr.Tüccar :
Fstatistic'i tam olarak anlamadım. Buradaki veriler rastgeledir, ancak model bir şeyler öğrenmiştir, bu nedenle modelin takıldığı ve fazla takıldığı sonucuna varabiliriz. Bu, modelin değerlendirmesinin kötü olması gerektiği anlamına gelir. Onlar. Negatif bir fstatistiс veya grafikte her şeyin kötü olduğuna dair başka bir gösterge bekliyordum.
Bu örnekten çıkan sonuç nasıl doğru bir şekilde yorumlanır?
İlk tahmin edicinin birinci + saniyeden daha iyi kabul edilebileceğini anlıyorum. Ve 1+2, 1+2+3'ten daha iyidir. Bunun gibi bir şey mi? En yüksek istatistiki değeri verecek bir dizi tahmin ediciyi seçmek için genetiği kullanmak mantıklı mı?

Ve işte tam olarak eğitilmiş bir modelin 20 değişken içereceğini ve bunların ağırlık artışlarını (1 değişken - ağırlık 1, 20. değişken - ağırlık 20) içereceğini varsaydığımızda bir örnek. Modele sırayla tahmin ediciler ekledikten sonra F istatistiklerinin dağılımının nasıl değişeceğini görelim:

############### simulate lm f-stats with non-random vars


rm(list=ls());gc()


library(data.table)

library(ggplot2)


start <- Sys.time()


set.seed(1)


x <- as.data.table(matrix(rnorm(20000000, 0, 1), ncol = 20))

x[, (paste0('coef', c(1:20))):= lapply(1:20, function(x) rnorm(.N, x, 1))]

x[, output:= Reduce(`+`, Map(function(x, y) (x * y), .SD[, (1:20), with = FALSE], .SD[, (21:40), with = FALSE])), .SDcols = c(1:40)]

x[, sampling:= sample(1000, nrow(x), replace = T)]


lm_models <- x[, 

 {

  lapply(c(1:20), function(x) summary(lm(data = .SD[, c(1:x, 41), with = F], formula = output ~ . -1))$'fstatistic'[[1]])

 }

 , by = sampling

]


lm_models_melted <- melt(lm_models, measure.vars = paste0('V', c(1:20)))


crtitical_f_stats <- qf(p = 0.99, df1 = c(1:20), df2 = 1000, lower.tail = TRUE, log.p = FALSE)


boxplot(data = lm_models_melted, value ~ variable, log = 'y'); lines(crtitical_f_stats, type = 's', col = 'red')


summary(lm(data = x[sample(1000000, 1000, replace = T), c(1:20, 41), with = F], formula = output ~ . -1))


Sys.time() - start


gc()

Logaritmik y ekseni ile arsa:

Görünüşe göre evet...

> summary(lm(data = x[sample(1000000, 1000, replace = T), c(1:20, 41), with = F], formula = output ~ . -1))


Call:

lm(formula = output ~ . - 1, data = x[sample(1e+06, 1000, replace = T), 

    c(1:20, 41), with = F])


Residuals:

     Min       1Q   Median       3Q      Max 

-19.6146  -2.8252   0.0192   3.0659  15.8853 


Coefficients:

    Estimate Std. Error t value Pr(>|t|)    

V1    0.9528     0.1427   6.676  4.1e-11 ***

V2    1.7771     0.1382  12.859  < 2e-16 ***

V3    2.7344     0.1442  18.968  < 2e-16 ***

V4    4.0195     0.1419  28.325  < 2e-16 ***

V5    5.2817     0.1479  35.718  < 2e-16 ***

V6    6.2776     0.1509  41.594  < 2e-16 ***

V7    6.9771     0.1446  48.242  < 2e-16 ***

V8    7.9722     0.1469  54.260  < 2e-16 ***

V9    9.0349     0.1462  61.806  < 2e-16 ***

V10  10.1372     0.1496  67.766  < 2e-16 ***

V11  10.8783     0.1487  73.134  < 2e-16 ***

V12  11.9129     0.1446  82.386  < 2e-16 ***

V13  12.8079     0.1462  87.588  < 2e-16 ***

V14  14.2017     0.1487  95.490  < 2e-16 ***

V15  14.9080     0.1458 102.252  < 2e-16 ***

V16  15.9893     0.1428 111.958  < 2e-16 ***

V17  17.4997     0.1403 124.716  < 2e-16 ***

V18  17.8798     0.1448 123.470  < 2e-16 ***

V19  18.9317     0.1470 128.823  < 2e-16 ***

V20  20.1143     0.1466 137.191  < 2e-16 ***

---

Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1


Residual standard error: 4.581 on 980 degrees of freedom

Multiple R-squared:  0.9932, Adjusted R-squared:  0.993 

F-statistic:  7123 on 20 and 980 DF,  p-value: < 2.2e-16

 
Vladimir Perervenko :

Teşekkür ederim! Bunu henüz yapamadım. Ama gerçekten, mümkün olduğu kadar hesaplamaları hafızada tutmak gerekiyor. Daha hızlı olacak. İyi kung fu...

Yaptığınız değişikliklerle:

#---variant-------------

rm(list=ls());gc()

library(data.table)

library(ggplot2)

library(gridExtra)

library(tseries)

#----

require(magrittr)

require(dplyr)

start <- Sys.time()

monte_trades <- as.data.table(matrix(rnorm(1000000, 0.1, 1), ncol = 1)) %>%

.[, variable := rep(1:1000, times = 1000)]%>%

.[, trade := 1:.N, by = variable] %>%

dcast.data.table(., variable ~ trade, value.var = 'V1', fun.aggregate = sum)%>%

.[, as.list(cumsum(unlist(.SD))), by = variable]%>%

melt(., measure.vars = names(.)[-1], variable.name = "trade", value.name = 'V1')%>% 

setorder(., variable, trade)

monte_trades_last <- as.data.table(monte_trades[trade == '1000', V1])

quantile_trade <- monte_trades[, quantile(V1, probs = 0.05), by = trade]

RF_last <- monte_trades[, V1[.N] / maxdrawdown(V1)[[1]], by = variable]


p1 <- ggplot(data = monte_trades, aes(x = trade, y = V1, group = variable)) +

geom_line(size = 2, color = 'blue', alpha = 0.01) + 

geom_line(data = quantile_trade, aes(x = trade, y = V1, group = 1), size = 2, alpha = 0.5, colour = 'blue') +

ggtitle('Simulated Trade Sequences of Length 1000')


p2 <- ggplot(data = monte_trades_last, aes(V1)) +

geom_density(alpha = 0.1, size = 1, color = 'blue', fill = 'blue') + 

scale_x_continuous(limits = c(min(monte_trades$V1), max(monte_trades$V1))) +

coord_flip() +

ggtitle('Cumulative Profit Density')


p3 <- ggplot(data = RF_last, aes(V1)) +

geom_density(alpha = 0.1, size = 1, color = 'blue', fill = 'blue') + 

geom_vline(xintercept = mean(RF_last$V1), colour = "blue", linetype = 2, size = 1) +

geom_vline(xintercept = median(RF_last$V1), colour = "red", linetype = 2, size = 1) +

ggtitle('Recovery Factor Density + Mean (blue) and Median (red)')


grid.arrange(p1, p2, p3, ncol = 3)


Sys.time() - start

Çalışma süresi 47 saniye. Yani kod daha güzel ve derli toplu hale geldi ama hız farkı yok evet render çok uzun. 1000 satır şeffaflık - onlar sayesinde...

 
Alexey Burnakov :

Teşekkür ederim! Bunu henüz yapamadım. Ama gerçekten, hesaplamaları mümkün olduğunca hafızada tutmak gerekiyor. Daha hızlı olacak. İyi kung fu...

Çalışma süresi 47 saniye. Yani kod daha güzel ve derli toplu hale geldi ama hız farkı yok evet render çok uzun. 1000 satır şeffaflık - onlar sayesinde...

bir hesabım var

# - saniye cinsinden yürütme süresi

# min lq ortalama medyan uq maks neval

# 2.027561 2.253354 2.254134 2.275785 2.300051 2.610649 100

Ama o kadar da önemli değil. Kod okunabilirliği ile ilgiliydi.

İyi şanlar

not. Ve lm() hesaplamalarını paralelleştirin. Bu sadece ihtiyacınız olduğunda durum

 
Vladimir Perervenko :

bir hesabım var

# - saniye cinsinden yürütme süresi

# min lq ortalama medyan uq maks neval

# 2.027561 2.253354 2.254134 2.275785 2.300051 2.610649 100

Ama o kadar da önemli değil. Kod okunabilirliği ile ilgiliydi.

İyi şanlar

not. Ve lm() hesaplamalarını paralelleştirin. Bu sadece ihtiyacınız olduğunda durum

Hayır. Kod bölümünü grafiklerden önce zamanlıyorsunuz. Grafiklerle birlikte belirttim.

Grafiklerden önce elimde: 1.5 saniye. Yönteminiz 1.15 saniyedir.

rm(list=ls());gc()


library(data.table)

library(ggplot2)

library(gridExtra)

library(tseries)


start <- Sys.time()


set.seed(1)


x <- as.data.table(matrix(rnorm(1000000, 0.1, 1), ncol = 1)) #random normal value with positive expectation

x[, variable:= rep(1:1000, times = 1000)]

x[, trade:= 1:.N, by = variable]


x.cast = dcast.data.table(x, variable ~ trade, value.var = 'V1', fun.aggregate = sum)

x_cum <- x.cast[, as.list(cumsum(unlist(.SD))), by = variable]


monte_trades <- melt(x_cum, measure.vars = names(x_cum)[-1], variable.name = "trade", value.name = 'V1')

setorder(monte_trades, variable, trade)

monte_trades_last <- as.data.table(monte_trades[trade == '1000', V1])

quantile_trade <- monte_trades[, quantile(V1, probs = 0.05), by = trade]

RF_last <- monte_trades[, V1[.N] / maxdrawdown(V1)[[1]], by = variable]


Sys.time() - start

rm(list=ls());gc()

library(data.table)

library(ggplot2)

library(gridExtra)

library(tseries)

#----

require(magrittr)

require(dplyr)


start <- Sys.time()


monte_trades <- as.data.table(matrix(rnorm(1000000, 0.1, 1), ncol = 1)) %>%

.[, variable := rep(1:1000, times = 1000)]%>%

.[, trade := 1:.N, by = variable] %>%

dcast.data.table(., variable ~ trade, value.var = 'V1', fun.aggregate = sum)%>%

.[, as.list(cumsum(unlist(.SD))), by = variable]%>%

melt(., measure.vars = names(.)[-1], variable.name = "trade", value.name = 'V1')%>% 

setorder(., variable, trade)

monte_trades_last <- as.data.table(monte_trades[trade == '1000', V1])

quantile_trade <- monte_trades[, quantile(V1, probs = 0.05), by = trade]

RF_last <- monte_trades[, V1[.N] / maxdrawdown(V1)[[1]], by = variable]


Sys.time() - start

Görünüşe göre hala daha hızlısın ...