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

 

Ve R ^ 2'yi tam olarak nasıl değerlendiriyorsunuz, hangi işlev?

Farklı modelleri çıngırak yoluyla eğitmeye çalıştım, "sözde r^2"yi korelasyon, yani cor(fitpoints[,1], fitpoints[,2])^2 olarak kabul etti, ancak r^2'yi aynı yöntemle hesaplamak istiyorum karşılaştırma için senin gibi.

Bu kod [1 - sum((yx)^2)/sum((y-mean(y))^2)] çalışır mı?

 
Dr.Tüccar :

Ve R ^ 2'yi tam olarak nasıl değerlendiriyorsunuz, hangi işlev?

Farklı modelleri çıngırak yoluyla eğitmeye çalıştım, "sözde r^2"yi korelasyon, yani cor(fitpoints[,1], fitpoints[,2])^2 olarak kabul etti, ancak r^2'yi aynı yöntemle hesaplamak istiyorum karşılaştırma için senin gibi.

Bu kod [1 - sum((yx)^2)/sum((y-mean(y))^2)] çalışır mı?


Aynen öyle. X - modeli.

 
Dr.Tüccar :

Gizli katmanda ne kadar çok nöron varsa, fonksiyon bir nöron tarafından o kadar karmaşık tanımlanabilir, daha fazla gizli katmana ve nöronlara ihtiyacınız vardır.

Ama o zaman sorun, nöronun hedefi tanımlamak için ardışık toplamalar ve çarpmalar (ve örneğin, aktivasyon fonksiyonu için sigmoidler) kullanması olacaktır, yani, bu açıkça sizin orijinal fonksiyonunuz değil, bir tür yaklaşıklık olacaktır. Ve bu yaklaşımın eğitim verilerindeki bazı özellikleri hatırlayacağı ve bu nedenle yeni veriler üzerinde doğru şekilde çalışmadığı ortaya çıkabilir. Bu nedenle, bazen eğitimi durdurmanız, test setindeki hatanın azalıp azalmadığına bakmanız ve her şey yolundaysa eğitime devam etmeniz gerekir. Bir noktada, test verilerindeki hata büyümeye başlayacak, ardından eğitimin tamamen durdurulması gerekiyor.

Ayrıca nöronun çıkışı, aktivasyon fonksiyonu ile sınırlıdır. Popüler olanlar için sigmoid (0; 1), relu [0; inf). Hedef değerlerin farklı bir aralığa ölçeklenmesi gerekir, (-7; 7) aralığındaki çıktılarınız birçok paket için basitçe elde edilemez.

Tüm verileri avg.0 sdv.1 olarak ölçeklendiriyorum.

-1;1'i hedefleyebilirsiniz. Ancak bu, yalnızca çıkış nöronunun doğrusal olmayan bir aktivasyon tanjantına sahip olması durumunda gerçekten gereklidir.

0:;1 benzer bir durumda sigmoid için.

Ve eğer kimlik varsa, o zaman prensipte gerekli değildir. ancak verilerin gerçek kapsamını dikkate almak gerekir. Ağırlıklar bu seviyeye doymayabilir.

Ve trende eğrilerin çıktısıyla öğretiyorum ve nerede duracağımı test edip görüyorum.
 

Bir kez daha çıngırak aldım, nnet öğrettim, günlükten bitmiş kodu aldım. Rattle nnet ile düzgün çalışmıyor, zamanla öğrenmeyi durdurmak için biraz daha kod ekledim.

Yeni verilerde en iyi R^2 = 0.18. En iyi ağ yapılandırması, tek bir iç katmanda bir nöronla oldukça komik çıktı. Ayrıca iç katmanda iki nörona sahip olabilirsiniz, sonuç yaklaşık olarak aynı olacaktır. Sayılarını artırmaya devam ederseniz, programa göre ağ çok hızlı bir şekilde yeniden eğitilir ve yeni veriler üzerinde daha kötü çalışır.

Sağdaki grafikte, mavi çizgi model için 20001 satırından yeni verilerdir. Gerisi eğitim ve çapraz doğrulamadır.

Evrişimsel ağ önde görünüyor.

Dosyalar:
 
Dr.Tüccar :

Bir kez daha çıngırak aldım, nnet öğrettim, günlükten bitmiş kodu aldım. Rattle nnet ile düzgün çalışmıyor, zamanla öğrenmeyi durdurmak için biraz daha kod ekledim.

Yeni verilerde en iyi R^2 = 0.18. En iyi ağ konfigürasyonu, tek bir iç katmanda bir nöronla oldukça komik çıktı. Ayrıca iç katmanda iki nörona sahip olabilirsiniz, sonuç yaklaşık olarak aynı olacaktır. Sayılarını artırmaya devam ederseniz, programa göre ağ çok hızlı bir şekilde yeniden eğitilir ve yeni veriler üzerinde daha kötü çalışır.

Sağdaki grafikte, mavi çizgi model için 20001 satırından yeni verilerdir. Gerisi eğitim ve çapraz doğrulamadır.

Evrişimsel ağ önde görünüyor.

Sonuç iyi! Tebrikler, basit NS'imi atladınız.

Özellikler gecikme olarak hazırlandı mı veya sunuldu mu? Görünüşe göre bu sorun saf günlüklerde çözülemez. Özellik hazırlığı gereklidir.

Başka bir gözlem - ağ çıktınız kesinlikle -1; 1. Ya aktivasyon tanjantını aldılar ve sonra çıktının ters dönüşümünü yapmadılar ya da başka bir şey.

Ve sadece referans için. mxnet paketinde evrişimsel (derin öğrenme). Şimdiye kadar sürüm sadece git ile. Ama temelde her şey çalışıyor.
 
Alexey Burnakov :

Ve sadece referans için. mxnet paketinde evrişimsel ağ (derin öğrenme). Şimdiye kadar sürüm sadece git ile. Ama temelde her şey çalışıyor.

sadece bir gözlem, konu dışı ama .... evrişimsel ağ ile ilgili yardım istediğimde ve mxnet paketine dikkat ettiğimde, herkes sessiz kaldı, diyorlar. kendin için takıl dostum ve şimdi herkes 50 sayfa önce bahsettiğim şeyi yapmakla ilgilenmeye başladı, bu neden oluyor? :) İlginçtir, belki 100 sayfa sonra birileri fark eder, benim de uzun zaman önce dikkat ettiğim quantstrat paketi ....

Diyeceksiniz ki - ha, peki, bunu kendin al ve çok akıllı olduğunda yap, gerçek şu ki bu çok akıllıca değil ve ben pek bir şey anlamıyorum ve İngilizce ile her şey çok kötü ve I için açıklamalar içeren dört satır kod, kendi başıma çözmeye çalışmak için harcadığım haftalara eşit olabilir ve o zaman bile her zaman işe yaramaz ...

 
mytarmailS :

sadece bir gözlem, konu dışı ama .... evrişimli ağ ile başa çıkmak için yardım istediğimde ve mxnet paketine dikkat ettiğimde, herkes sessiz kaldı, diyorlar. kendin için takıl dostum ve şimdi herkes 50 sayfa önce bahsettiğim şeyi yapmakla ilgilenmeye başladı, bu neden oluyor? :) İlginçtir, belki 100 sayfa sonra birileri fark eder, benim de uzun zaman önce dikkat ettiğim quantstrat paketi ....

Diyeceksiniz ki - ha, peki, bunu kendin al ve çok akıllı olduğunda yap, gerçek şu ki bu çok akıllıca değil ve ben pek bir şey anlamıyorum ve İngilizce ile her şey çok kötü ve I için açıklamalar içeren dört satır kod, kendi başıma çözmeye çalışmak için harcadığım haftalara eşit olabilir ve o zaman bile her zaman işe yaramaz ...

Sadece harika bir yorum, meslektaşım! ) ha

Vizyonuma göre madde madde cevaplayayım:

1) Burada insanların %90'ı kendi çıkarları, düşünme aşaması ve deney aşaması tarafından yönlendirilir. Bu nedenle, bazı iyi fikirler rafa kaldırıldı. İlginç örnekler ve problemler vermediğiniz için kimse ilgilenmedi. Basit, değil mi?

2) Bilgi edinmek için iki strateji vardır: kendinizi kazın ve acı içinde bir şeyler yapmaya çalışın (hepimiz bunu değişen derecelerde yapıyoruz. Örneğin, "Para kazanmayı öğrenin Köylüler!" Konusunda birkaç yıl harcayan adamı hatırlıyorum. Mevcut danışmanların performansını test eden hayatının bir kısmı Ve hepsi sızdırıldı.) Başka bir seçenek de, birinin yardım edip bitmiş olanı ortaya koyması umuduyla beklemek. Bu nedenle, koşullarınızdan dolayı ikinci stratejiyi seçtiyseniz, bitmiş olanı bekleme süresi çok uzayabilir.

Mxnet'e gelince, zaten başlattığım için, bu arada, internette neredeyse tamamen aynı olan kodu gönderdiğim için üzgün değilim:

install.packages ( "drat" , repos = "https://cran.rstudio.com" )
drat ::: addRepo ( "dmlc" )  

install.packages ( "mxnet" )  

 

 

train.x = data.matrix(dat_ready_scale[1:(nrow(dat_ready_scale) / 2), 1:100])

train.y = dat_ready_scale[1:(nrow(dat_ready_scale) / 2), 101]

test.x = data.matrix(dat_ready_scale[!rownames(dat_ready_scale) %in% rownames(train.x), 1:100])

test.y = dat_ready_scale[!rownames(dat_ready_scale) %in% rownames(train.x), 101]



########

train.x <- t(train.x)

test.x <- t(test.x)


dim(train.x) <- c(100, 1, 1, ncol(train.x))

dim(test.x) <- c(100, 1, 1, ncol(test.x))

#########



############ BUILD NET


library(mxnet)


# first conv layer


data <- mx.symbol.Variable('data')


conv1 <- mx.symbol.Convolution(data = data,

  kernel=c(14, 1),

  stride=c(1, 1),

  num.filter = 1)


tanh1 <- mx.symbol.Activation(data = conv1, 

 act.type = 'relu')


pool1 <- mx.symbol.Pooling(data = tanh1, 

     pool_type = "avg",

     kernel=c(5, 1), 

     stride=c(1, 1))



# second conv layer


conv2 <- mx.symbol.Convolution(data = conv1,

  kernel=c(12, 1),

  stride=c(1, 1),

  num.filter = 1)


tanh2 <- mx.symbol.Activation(data = conv2, 

 act.type = 'relu')


pool2 <- mx.symbol.Pooling(data = tanh2, 

     pool_type = "avg",

     kernel=c(5, 1), 

     stride=c(1, 1))



# third conv layer


conv3 <- mx.symbol.Convolution(data = conv2,

  kernel=c(10, 1),

  stride=c(1, 1),

  num.filter = 1)


tanh3 <- mx.symbol.Activation(data = conv3, 

 act.type = 'relu')


pool3 <- mx.symbol.Pooling(data = tanh3, 

     pool_type = "avg",

     kernel=c(2, 1), 

     stride=c(1, 1))



# first fully connected layer


flatten <- mx.symbol.Flatten(data = conv3)


fc1 <- mx.symbol.FullyConnected(data = flatten

   , num_hidden = 10)


tanh4 <- mx.symbol.Activation(data = fc1, act.type = 'tanh')



# second fully connected layer


fc2 <- mx.symbol.FullyConnected(data = tanh4, num_hidden = 1)


lenet <- mx.symbol.LinearRegressionOutput(data = fc2)


#### train


device <- mx.cpu()

log <- mx.metric.logger$new()


model <- mx.model.FeedForward.create(lenet, 

 X = train.x,

 y = train.y,

 ctx = device, 

 num.round = 100, 

 array.batch.size = 128,

 learning.rate = 0.01, 

 momentum = 0.9,

 eval.metric = mx.metric.rmse,

 eval.data = list(data = test.x, label = test.y),

 optimizer = 'sgd',

 initializer = mx.init.uniform(0.5),

 #array.layout = 'rowmajor',

 epoch.end.callback = mx.callback.log.train.metric(1, log))


plot(log$train, type = 'l', col = 'blue', ylim = c(min(c(log$train, log$eval)), max(c(log$train, log$eval))))

lines(log$eval, type = 'l', col = 'red')


mx.ctx.internal.default.value = list(device="cpu",device_id=0,device_typeid=1)

class(mx.ctx.internal.default.value) = "MXContext"


preds <- as.numeric(predict(model, test.x))

1 - sum((test.y - preds)^2) / sum((test.y - mean(test.y))^2)

Doğal olarak, sadece temel mantığı gösteren bir balıktır.

 
Alexey Burnakov :
Özellikler gecikme olarak hazırlandı mı veya sunuldu mu? Görünüşe göre bu sorun saf günlüklerde çözülemez. Özellik hazırlığı gereklidir.

Başka bir gözlem - ağ çıktınız kesinlikle -1; 1. Ya aktivasyon tanjantını aldılar ve sonra çıktının ters dönüşümünü yapmadılar ya da başka bir şey.

Her şeyi orijinalinde olduğu gibi değiştirmeden servis ettim. Doğru göstergelerin değerlerini sayarak ve bunları tahmin için de kullanarak daha iyi bir sonuç alınabileceğinden eminim. Ancak göstergelerden hangileri doğru? (retorik soru, henüz cevap yok).

Cevaptaki "-1; 1"e gelince, her şey komik. Son nöronun çıktısı orada lineerdir, aktivasyon fonksiyonu yoktur, yani hiçbir şeyle sınırlı değildir. Hedef değerleri -1;1'de de ölçeklendirmeyi denedim ancak bundan sonra ağ (-0.2;0.2) aralığında sonuç vermeye başladı. Bazı nedenlerden dolayı, sonuç her zaman gerekenden daha dar bir aralıkta olacaktır, muhtemelen hızlı bir şekilde durdurulan eğitim nedeniyle, sadece 250 yineleme.
Daha fazla nöron eklerseniz ve öğrenmeyi bırakmazsanız, sonunda ağ istenen aralığa kadar eğitecektir. İç katmandaki 100 nöron, eğitim verilerinde %100 doğruluk elde etmek için neredeyse yeterlidir. Günlüğe bakılırsa, tüm 20000 * 0.7 (daha sonra düzeltildi) sonuçlarındaki kalıntıların toplamı yaklaşık 200'dü. Ancak aynı zamanda, çapraz doğrulama sonuçları genellikle istenen sonuçlarla ilişkilendirilmeyi bırakacak, sadece İstenen aralıkta da olsa rastgele değerler.

 
Dr.Tüccar :

Her şeyi orijinalinde olduğu gibi değiştirmeden servis ettim. Doğru göstergelerin değerlerini sayarak ve bunları tahmin için de kullanarak daha iyi bir sonuç alınabileceğinden eminim. Ancak göstergelerden hangileri doğru? (retorik soru, henüz cevap yok).

Cevaptaki "-1; 1"e gelince, her şey komik. Son nöronun çıktısı orada lineerdir, aktivasyon fonksiyonu yoktur, yani hiçbir şeyle sınırlı değildir. Hedef değerleri -1;1'de de ölçeklendirmeyi denedim ancak bundan sonra ağ (-0.2;0.2) aralığında sonuç vermeye başladı. Bazı nedenlerden dolayı, sonuç her zaman gerekenden daha dar bir aralıkta olacaktır, muhtemelen hızlı bir şekilde durdurulan eğitim nedeniyle, sadece 250 yineleme.
Daha fazla nöron eklerseniz ve öğrenmeyi bırakmazsanız, sonunda ağ istenen aralığa kadar eğitecektir. İç katmandaki 100 nöron, eğitim verilerinde %100 doğruluk elde etmek için neredeyse yeterlidir. Günlüğe bakılırsa, tüm 20.000*100 öngörücülerdeki artıkların toplamı yaklaşık 200'dü. Ancak aynı zamanda, çapraz doğrulama sonuçları artık istenen sonuçlarla bağıntılı olmayacak, bunlar yalnızca rastgele değerler olacak, ancak istenilen aralık

Komik. Düşünmek gerek.

Not: büyük olasılıkla, bu aralıkta [-1; 1] ağ en tutarlı giriş sinyallerini alır ve işlevin bu parçası en kolay modellenir (sinir ağı en kolay olanı öğrenir). Ve elbette, bu seçenek, eğim inişinin minimumunu bulduğu zamandır. Bununla tartışmak zor...

Tamam, yine de pratik yapmak istiyorsan sana bir ipucu ekleyeceğim.

İlk olarak, R^2 0.55, "metafişe" bazı küçük fonksiyonel dönüşümler uygulanarak gerçekten elde edilebilir. Başka bir şey, işlevin görünüşünde oldukça karmaşık olduğu ortaya çıkıyor.

Ayrıca şunu deneyin:

satırOrtalamalar(df[, 1:10])

satırOrtalamalar(df[, 1:20])

satırOrtalamalar(df[, 1:30])

...

satırOrtalamalar(df[, 1:100])

Bu 10 üstkurmaca, anlamlı girdilerin doğru kombinasyonunu içerir.

Bu arada, evrişimli katmanlar, nereye kazacağınızı biliyorsanız, bunu öğrenme sürecinde zaten vurgulamanıza izin verir.

Neden öneriyorum, aslında - ne ile öğütüleceğini bilsen bile, çıktının yaklaşıklığını yeniden oluşturmak için çok çabalaman gerekiyor. Ve içeriden biri olarak, insanlara çözülemez bir problem satmaya çalıştığım hissinden hoşlanmıyorum.

 
Alexey Burnakov :

Sadece harika bir yorum, meslektaşım! ) ha

Vizyonuma göre madde madde cevaplayayım:

Seni anladım, daha sert bir tepki bekliyordum, beni dövmediğin için teşekkürler)) ve kod için de teşekkürler, zaten başka bir fikirle meşgul olduğum için hafta sonu çözmeye çalışacağım ....

Yardıma ihtiyacım var...

Hareketli ortalamada eşbütünleşme testi yapmak istiyorum ama hata veriyor...

 

burada sadece statik veriler üzerinde bir test var


 library(tseries)  
ri <- cumsum(rnorm( 10000 ))   # типа цены
si <- cumsum(rnorm( 10000 ))   # типа цены
ln <- length(ri)

data <- as.data.frame(cbind(ri,si))

#проводим линейную регрессию для определения правильного соотношения
model <- lm(  ri ~ si + 0 , data)
#вычисляем разницу цен (спред)
spread <- ri - coef(model)[ 1 ] * si
#проводим тест Дики-Фуллера на стационарность
test <- adf.test(as.vector(spread), k= 0 )

test$p.value

her şey çalışıyor...

fakat aynısını sürgülü pencerede yaptığımda bir hata alıyorum - Error in lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) :

0 (NA dışı) vaka

sürgülü pencere testi

ri <- cumsum(rnorm( 10000 ))   # типа цены
si <- cumsum(rnorm( 10000 ))   # типа цены
ln <- length(ri)


data <- as.data.frame(cbind(ri,si))


test_vec <- rep( 0 ,ln) # тут будем хранить показатели теста 

for (i in 151 :ln){
  print(i)
          idx <- (i- 150 ):i
                 #проводим линейную регрессию для определения правильного соотношения
                model <- lm(  ri[idx] ~ si[idx] + 0 , data[idx,])
                 #вычисляем разницу цен (спред)
                spread <- ri[idx] - coef(model)[ 1 ] * si[idx]
                 #проводим тест Дики-Фуллера на стационарность
                test <- adf.test(as.vector(spread), k= 0 )
                
                test_vec[i] <- test$p.value
                
}

benzer problemlerde yığın taşması üzerine bunun verilerdeki "NA" nedeniyle olduğu söylenir, ancak bende böyle bir şey yok, orası kesin ...

sorun nedir? bana yardım et lütfen