Selamlar, serinin ikinci yazısına hoşgeldiniz. Geçen yazıda, Ocak 1966 ve Ekim 1975 yılları arasında Boston’da aylık silahlı soygunların verisini incelemiş ve zaman serisi regresyonu metodunu kullanarak tahminler gerçekleştirmiştik. Gerçekleştirdiğimiz tahminler basit metodlar vasıtasıyla oluşmalarına karşın, göreceli olarak iyi sonuçlar elde etmişti. Bu yazıda ise aynı veri seti üzerinde başka bir tahminleme metodu olan “Üstel Düzeltme” yöntemini kullanacağız.

Veriyi bir önceki yazıda detaylı olarak incelediğimiz için, bu kez inceleme kısmını daha kısa tutacağız. İndirme ve tanıtım linkini bir önceki yazıda vermiştik. Veriyi R üzerine alalım ve hatırlamak amacıyla grafiğini tekrar çizdirelim:

Data <- read.csv("MonthlyBostonArmedRobberies.csv",
stringsAsFactors = FALSE,
sep = ";")
nrow(Data)
ncol(Data)
head(Data, n = 10)

Buradaki kodu anlatmaya gerek yok, veriyi R üzerine alıp gerekli incelemeleri yapmıştı. Sonuçları hatırlayalım:

1

Evet verinin ilk hali bu şekildeydi, daha sonra aşağıdaki kod bloğuyla zaman serisi verisine çevirmiştik:

install.packages("fpp2")
library(fpp2)

Data_ts <- ts(data = Data$Value,
start = c(1966, 01),
end = c(1975, 10),
frequency = 12)

Verinin son hali:

2

Evet veriyi R’a zaman serisi olarak tanıttıktan sonra, grafiğini de aşağıdaki kodlar ile çizdirmiştik:

autoplot(Data_ts) +
ggtitle("Boston Aylık Silahlı Soygun Verisi") +
xlab("Ay") +
ylab("Sayı")

Yine kod bloklarını açıklamadan geçiyorum, çünkü bir önceki yazıda açıklamıştım. Grafiği inceleyelim:

3

Evet veri setinin grafik üzerinde görünümü bu şekildeydi. Grafiği inceleyip, yorumlar yapmış ve detaylarına girmiştik. Bu kez veriyi anlamak için farklı bir yöntem kullanacak ve o şekilde detaylandıracağız. Bu yöntem de “ayrıştırma” yöntemi olacak. Bu yöntemin detaylarına değinelim.

Bir önceki yazıda, zaman serilerinin üç ana unsurdan veya paternden oluştuğunu söylemiştik. Bunlar trend, mevsimsellik ve periyodik hareketlerdi. Dolayısıyla zaman serisi verilerini bunların toplamı olarak değerlendirebiliriz. Bunu aşağıdaki gibi özetlersek:

1

Burada “Y” olarak gösterdiğimiz zaman serisinin kendisi, “S” ile gösterilen mevsimsellik(seasonality), “T” ile gösterilen trend, “R” ile gösterilen ise ilk iki unsur seriden çıkarıldığında geriye kalan öğe(remainder ya da noise). Yani “mevsimsellik + trend + kalıntılar” ifadesi, zaman serisinin kendisine eşit oluyor. Tabii ki bunların hepsi “t” anındaki unsurlar. Burada periyodik hareketler nerede diye sorabilirsiniz, aslında periyodik hareketler bu denklemde genelde trend unsurunun içerisinde sayıldığı için, “T” ifadesini “trend + periyodik hareketler” olarak düşünebiliriz. İşte bu denklemin bize sağladığı avantaj sayesinde, biz bir zaman serisini bu şekilde unsurlarına ayrıştırıp, bu unsurların nasıl davrandığını ve nelerden oluştuğunu çok daha kolay kavrayabiliriz.

Üstteki denklemde dikkat ederseniz bu üç unsur birbirleriyle toplanarak asıl seriyi oluşturmuş durumda. Bu yüzden bu şekilde yapılan ayrıştırmalara “toplamsal” ayrıştırmalar deniyor. Bir de çarpımsal ayrıştırmalar var ki bunların da denklemi tahmin edebileceğiniz gibi aşağıdaki şekilde:

2

Görüleceği gibi bu kez bu unsurlar toplanarak değil, çarpılarak asıl seriyi oluşturuyor. Bu da bir ayrıştırma yöntemi fakat farklı bir teknik kullanıyor. Hangi durumlarda hangi ayrıştırma yöntemi daha çok tercih ediliyor diye soracak olursanız, genelde mevsimsel hareketlerin büyüklüğü serinin farklı seviyelerinde değişmeden sabite yakın devam ediyorsa toplamsal, değişiyor ve sabit seyretmiyorsa çarpımsal ayrıştırmalar tercih edilir. Aslında ayrıştırma metodları da, trend, mevsimsellik gibi unsurları tahmin ederek bu ayrıştırmaları gerçekleştirmeye çalışır. Sonuçta bunlar ne olduğu kesin ve rakamları elimizde olup belli olan değerler değiller. Bizim bu ayrıştırmalarla, grafiklerle yapmaya çalıştığımız şey genel olarak bunların nasıl hareket ettiğini tahminlemek ve grafiğe dökmeye çalışmak.

Bu zaman serisi için biz de unsurları ayrıştırıp, ne şekilde olduklarını tartışacağız. Toplamsal veya çarpımsal ayrıştırma yapmak için kullanılan birden fazla metod bulunuyor. Bunlar arasında X11, SEATS, STL gibi metodlar var. Hatta herkesin bildiği tanıdık bir metod olan hareketli ortalama metodu da serideki trend + periyodik hareketler unsurunu tahmin etmek için kullanılabilir. Zaten finansal zaman serilerinde hareketli ortalama metodu hala sıkça kullanılmaktadır. Üstte saydığımız metodların tamamının detaylarına tabii ki değinmeyeceğiz, ben bu yazıda “STL” metodunu kullanacak ve onun detayına biraz değineceğim. İnternette zaten bunlar ile alakalı detaylarını merak edenler için birçok kaynak bulunuyor.

“STL(Seasonal and Trend decomposition using Loess)” metodu, her tür mevsimsellikle baş edebilen ve her frekanstaki veriye de uygulanabilen bir metoddur. Burada frekanstan kastımız tabii ki aylık, yıllık, haftalık, günlük gibi farklı zaman aralıklarında gözlemlenmiş veriler. Bazı ayrıştırma metodları her tür frekanstaki veriye uygulanamazken, STL metodunun böyle bir kısıtlaması yok. Her tür mevsimsellikten de kastımız, zamanla değişen, değişmeyen ve farklı periyodlarda tekrar eden olmak üzere akıllara gelebilecek değişik tipteki tüm mevsimsellik unsurları. STL bu tarz konularda da başarılı bir metod. Ayrıca bu metod içerisinde mevsimselliğin değişme oranını da kullanıcının kendisinin bir katsayı kullanarak belirtme şansı bulunuyor. Aynı durum trend unsuru için de geçerli. Trendin de ne kadar düz veya dalgalı olacağını kullanıcı belirtebiliyor. STL metodu sapan değerlere karşı da dirençli bir metod olduğu için, nadir görülebilen olaylar trend ve mevsimsellik unsurlarının tahminini çok etkilemeyecektir. Fakat bunlar çıkarıldığında geriye kalan unsur olan kalıntı unsurunu tabii ki etkileyecektir. STL’in bir dezavantajı ise üstte saydığımız metodlardan bazıları iş günleri ve takvimdeki değişiklikler gibi problemleri kendileri halledebiliyorken, STL’de bu özellik bulunmuyor.

Evet STL metodunu açıkladıktan sonra, şimdi onu kullanarak elimizdeki veri setini unsurlarına ayrıştıralım:

Data_ts %>%
stl(t.window = 10,
s.window = 6,
robust = TRUE) %>%
autoplot()

Kod bloğunu açıklayacak olursak, “pipe operator” dediğimiz ve solundaki nesneyi sağındaki fonksiyonun ilk argümanı olarak atayan ifadeyi kullandık ve verimizi “stl” komutunun içine soktuk. Burada “t.window” argümanı, trend unsuru hesaplanırken ard arda gelen kaç gözlemin kullanılacağını gösteriyor. Yani aslında trend unsurunun üstte de bahsettiğimiz gibi ne kadar hızlı değiştiğini burada belirtiyoruz. Ben bu değere 10 verdim. Fakat daha iyi sonuçlar elde etmek adına farklı değerler de denenebilir. “s.window” argümanı ise, ard arda kaç yılın mevsimsel değerleri bulmada kullanılacağını belirtiyor. Aynı şekilde bu da mevsimselliğin değişme hızını gösteriyor. Ben bu argümanı 6 yıl olarak belirledim. Unutmamak gerekir ki bu argümanlara ne kadar küçük değerler verirseniz, bu unsurların o kadar hızlı değişebildiğini metoda belirtmiş olursunuz. Mevsimsel unsur daha hızlı büyüdüğü için daha küçük bir sayı olan 6’yı, trend ise sabırlı arttığı için biraz daha büyük bir sayı olan 10’u kullandım. Dediğim gibi farklı sayılar denenerek daha iyi sonuçlar elde edilmeye çalışılabilir. “robust” argümanına “TRUE” değerini vermek ise outlier değerlere karşı direnç göstermesini belirtmek anlamına geliyor. Fakat bir yerden sonra sonuç çok da değişmeyecektir. Kod bloğunun sonucunu görelim:

3

Evet sonucu inceleyelim. Trend unsuruna baktığımızda, serinin gidişatını güzel bir şekilde takip ettiğini görüyoruz. Verideki yön değişimlerini ve verinin genel gidişatını diğer unsurları karıştırmadan sade bir biçimde gözler önüne seriyor. Mevsimsel unsura baktığımızda ise, yavaş yavaş büyüdüğünü görüyoruz ki bu da veriyle tutarlı bir durumda. Verideki mevsimsellik de zamanla artarak gidiyor. Kalıntı unsuru da, tüm unsurlar veriden çıkartıldığında bize geriye kalanı gösteriyor. Bu unsur aslında verideki “noise”, yani kontrol edilemez değişimi gösterir. Her veride bulunan ve hesap edilmeyen etkenlerden kaynaklanan değişimdir. Örneğin, 1975 yılı civarındaki yüksek değerlere bakarsak, seride de o zaman dilimindeki gözlem değerlerinin yüksek olduğunu görüyoruz. Bu değerlerden trend ve mevsimselliği çıkardığımızda ise, grafikte görüldüğü gibi yüksek kalıntı çubukları geriye kalıyor.

Evet STL metodu veriyi bu şekilde ayrıştırdı ve bize veri hakkında bilgi sahibi olma imkanı sundu. Ayrıştırma metodlarının amacı, veriyi anlamak ve içerisindeki unsurların davranışlarını gözlemlemektir. Bu da tahmin aşamasında bize yardımcı olacaktır. Ayrıştırma metodları kullanılarak da tahminleme yapılabilir, fakat bizim yazımızın amacı farklı olduğundan biz bu kısma değinmeyeceğiz.

Yazının başlığından da anlaşılabileceği gibi veriyi “Üstel Düzeltme” metodunu kullanarak tahminleyeceğiz. Şimdi üstel düzeltme metodunun ne olduğundan ve teorik arkaplanından bahsedelim.

Üstel düzeltme metodu, zaman serisinin geçmiş değerlerinden bir ağırlıklı ortalama üreterek gelecekteki gözlemleri tahminlemeye çalışır. Fakat bu ortalamayı hesaplarken geçmiş gözlemlerin tamamına aynı ağırlığı vermez. Serinin sonuna yakın olan gözlemlere daha yüksek ağırlık verirken, uzak ve eski gözlemlere düşük ağırlık verir. Buradaki mantık ise tabii ki serinin son değerlerinin serideki komponentlerin(trend ve mevsimsellik) son hallerini daha iyi temsil ediyor olmasıdır. Üstel düzeltme metodlarının genel mimarisini aşağıdaki denklem ile gösterebiliriz:

4

Üstteki denkleme baktığımızda, sol taraftaki ifade yani bir sonraki gözlemin tahmini, geçmiş gözlemlerin ağırlıklı ortalamalarından hesaplanıyor ve en yeni gözlem olan serinin son gözlemi en yüksek ağırlığı yani direkt olarak alfa değerini alıyor. Sonraki gözlemlerde ise ağırlık yavaş yavaş düşüyor. Unutmamak gerekir ki alfa’nın değeri 0 ve 1 arasında olmalıdır ve gözlemlere verilen ağırlıkların toplamı da yaklaşık olarak 1 değerini bulmalıdır. Bu nedenle, alfa değerini ne kadar yüksek tutarsanız(1’e yakın) yeni gözlemlere o kadar çok, eski gözlemlere de o kadar az ağırlık vermiş olursunuz. Çünkü ağırlıkların toplamı 1 civarında olmalı ve siz zaten ilk gözlemlere yüksek ağırlık verdiğiniz için, 1 değerinden bu ağırlıkları çıkardığınızda son gözlemlere çok az ağırlık kalacaktır.

Üstel düzeltme metodunun mantığını anlamak adına başka bir örnek daha verelim. Geçen yazıda “Benchmark” yani karşılaştırma metodlarından bahsetmiştim. Bunlar basit ama yerine göre etkili olan, Naive metod, Ortalama metodu gibi metodlardı. Naive metodu baz alalım. Bu metodda, gelecek gözlemin tahmini serinin son değerine eşittir. Yani aslında geçmiş gözlemlerin ağırlıklı ortalamasıdır fakat tüm ağırlık son gözlemdedir, diğer gözlemlerin hiç ağırlığı yoktur. Ortalama metodunda ise bir sonraki gözlem geçmiş gözlemlerin ortalamasına eşittir, ki bu da her gözlemin eşit ağırlıkta olduğu bir ağırlıklı ortalamadan başka bir şey değildir. Üstel düzeltme metodu da, bu iki uç metodun arasında yerini alır. Tarihi yakın olan gözlemlere daha çok, uzak olanlara ise daha az ağırlık verir.

Üstel düzeltme metodunun da birden fazla alt metodu vardır. “Simple Exponential Smoothing(SES)” ya da “Basit Üstel Düzeltme”, “Holt’s Trend Method” ve “Holt-Winter’s Seasonal Method” bunların başlıcalarıdır. SES metodu, herhangi bir trend ya da mevsimsellik içermeyen zaman serilerinde kullanılır. En temel ve basit üstel düzeltme yöntemidir. Holt’s Trend Method ise sadece trend içeren fakat mevsimsellik içermeyen zaman serileri için uygundur. Tabi eğer istenirse bazı ek işlemler yapılarak mevsimsellik içeren veriler de bu metodla tahminlenmeye çalışılabilir fakat biz burada bunun detayına girmeyeceğiz. Son olarak Holt-Winter’s Seasonal Method ise,  hem trend hem de mevsimsellik içeren serileri tahminleyebilir. Bizim verimiz de hem trend hem de mevsimsellik içerdiğinden dolayı, kullanacağımız metod bu olacak.

Holt-Winter’s Seasonal method, yukarıda ayrıştırma metodunda da anlattığımız gibi, serinin unsurlarını tahminlemeye çalışarak değerler elde eder ve bunları da asıl denklemde yerine koyarak serinin bir sonraki gözlemini tahminlemeye çalışır. Yani başka bir deyişle, serideki her unsuru tahminlemek adına bir denklem kullanır. Trend, mevsimsellik ve serinin seviyesi için üç ayrı denklem oluşturur ve buradan elde edilen değerleri de bir ana “tahmin denklemi” içinde kullanır. Genel olarak;

5

Burada en üstteki denklem tahmin denklemidir. Bu denklemin solunda kalan ifade, serinin tahmin edilmek istenen bir sonraki değerinin tahminidir. Dikkat edecek olursak, bu değer serinin seviyesi, trend ve mevsimsellik ifadelerinin toplamından oluşuyor. Ayrıştırma metodundan da hatırlayacak olursak, bu “additive” yani toplamsal ayrıştırma metodunun temeliydi. Alttakiler ise seri seviyesi, trend ve mevsimsellik unsurlarının ayrı ayrı kendi tahmin denklemleri. Bunlardan elde edilen değerler, en üstteki tahmin denkleminde kullanılarak tahminleme işlemi gerçekleştirilir. Burada “h” ifadesi kaç adım sonrasının tahminleneceğini, “m” ifadesi mevsimsel periodu(örneğin çeyrek verisinde yılda 4 çeyrek olduğu için bu değer 4’tür), alfa, beta ve gamma ifadeleri ise içlerinde bulundukları denklemlerin unsurlarının düzeltme katsayılarını temsil eder. Unutmamak gerekir ki serinin tahminlenebilmesi için, önce içindeki unsurların tahminlenmesi gerekir. Unsurların denklemlerinin içlerini incelediğimizde, örneğin trend unsuru için, serinin t anındaki seviyesi ve t-1 anındaki seviyesinin farkına, t-1 anındaki trend değeri eklenerek bir düzeltme yapılıyor ve bir sonraki yani t anındaki trend değeri tahminleniyor. Mevsimsellik için de aynı şey geçerli.

Tabii ki bu toplamsal model içindi, aynı denklemler çarpımsal model için de yazılabilir. Verideki mevsimselliğin büyüklüğü, serinin büyüklüğüyle beraber değişiyorsa, çarpımsal modellerin daha uygun olduğunu söylemiştik. Çarpımsal model için Holt-Winter’s Seasonal method denklemleri aşağıdaki gibi olur:

6

Evet denklemlerin çarpımsal modele göre değiştiğini görüyoruz, fakat mantık tamamiyle aynı.

Burada önemli bir not düşelim. Denklemlerdeki düzeltme katsayıları,(alfa, beta, gamma) ilgili unsurların değişimini belirtir. Örneğin düşük beta değeri, trendin çok yavaş değiştiğini, yüksek gamma değeri, mevsimselliğin hızlı değiştiğini gösterir. Dolayısıyla bu katsayıların değerleri önemlidir ve çıktıda yorumlanabilir. Burada akla çok doğal bir soru gelebilir. Peki bu değerleri nasıl belirliyoruz? Bu konuda da tek yöntem yok. İsterseniz kendi bilginiz dahilinde kendi değerlerinizi seçebilirsiniz, isterseniz istatistik yazılımlarının kendi “default” değerlerini kullanabilirsiniz, isterseniz de makine öğreniminde olduğu gibi bir hata metriğini en düşük yapan düzeltme katsayılarını hesaplayarak onları seçebilirsiniz. Tabii ki böyle bir durum söz konusuysa “overfitting” riskine karşı da önleminizi almalısınız.

Evet bu kadar teorik arka plan yeterli. Artık verinin tahminlenme aşamasına geçelim. Veriye baktığımızda, hem trend, hem mevsimsellik unsurlarının bulunduğunu ve mevsimselliğin de serinin seviyesi değiştikçe değiştiğini söylemiştik. Bu yüzden “Çarpımsal(Multiplicative) Holt-Winter’s Seasonal Method’ üzerinden tahminleme gerçekleştireceğiz. Fakat diğer metodların da nasıl performans göstereceğini görmek adına bir karşılaştırma yapabiliriz.

Aşağıdaki R kodu ile önce modelleri belirleyip, sonra da “time series cross-validation” metodunu kullanarak hata metrikleri vasıtasıyla karşılaştırma yapalım.

Model_SES <- tsCV(Data_ts, ses, h = 22)
Model_Holt <- tsCV(Data_ts, holt, h = 22)
Model_Holt_D <- tsCV(Data_ts, holt, damped = TRUE, h = 22)
Model_HW <- tsCV(Data_ts, hw, seasonal = 'multiplicative', h = 22)
Model_HW_D <- tsCV(Data_ts, hw, damped = TRUE, seasonal = 'multiplicative', h = 22)

sqrt(mean(Model_SES^2, na.rm = TRUE))
sqrt(mean(Model_Holt^2, na.rm = TRUE))
sqrt(mean(Model_Holt_D^2, na.rm = TRUE))
sqrt(mean(Model_HW^2, na.rm = TRUE))
sqrt(mean(Model_HW_D^2, na.rm = TRUE))

mean(abs(Model_SES), na.rm = TRUE)
mean(abs(Model_Holt), na.rm = TRUE)
mean(abs(Model_Holt_D), na.rm = TRUE)
mean(abs(Model_HW), na.rm = TRUE)
mean(abs(Model_HW_D), na.rm = TRUE)

İlk kısımda, “tsCV” komutu, içerisine verilen modelleri time-series cross-validation işlemine tabi tuttu. Bu işleme kısaca değinecek olursak, veriyi direkt olarak train-test setler olarak ikiye ayırmak yerine, birden fazla test set oluşturur ve her test set sadece tek gözlemden oluşur. Daha sonra, bu test setten önceki gözlemlerin tamamı da train seti oluşturur. Train set üzerinde model eğitilip, test setteki gözlem tahmin edilmeye çalışılır ve bu şekilde tüm seri tahmin edildikten sonra, test setlerin tahminlerinin hatalarının ortalamaları alınır ve sonuç modelin başarısını gösterir. İlk birkaç gözlem test set olarak seçilmez çünkü bunların öncesinde çok az gözlem olacağından model eğitmek için yeterli değildir.

Dikkat edersek üstteki kod bloğunda 5 farklı model kullandık. “SES” komutunu Simple Exponential Smoothing, “Holt” komutunu trend içeren seriler için kullanılan “Holt’s Linear Method” ve “HW” komutunu da “Holt-Winter’s Seasonal Method” için kullandık. “h” argümanı kaç adım ilerisinin tahmin edileceğini gösteriyor ve test set 22 gözlemden oluştuğu için biz de 22 adım ilerisini tahminlemek istiyoruz. “damped = TRUE” argümanı ise, seri tahminlenirken “damped” yani aşağı doğru bükülmüş bir trend kullanmak istediğimizi belirtiyor. Eğer bu argüman “TRUE” değerini almazsa, serinin gelecekte sürekli yükselen bir trendi olduğunu varsayarak tahminleme yapmış oluruz. Gerçek serilerde ise durum çoğu zaman tersi olduğu için, trendin ileride durgunlaşacağını ve aşağıya doğru büküleceğini öngörüyoruz. Bu yüzden “damped = TRUE” argümanını kullandık. Holt ve Holt-Winter metodları için bir tane damped=TRUE kullanarak ve bir tane de kullanmayarak yaptığımız için denediğimiz model sayısı 5’e çıktı.

Kod bloğunun geriye kalan kısmında ise, bir üstteki “tsCV” komutunun ürettiği hatalar üzerinden RMSE ve MAE metriklerini hesaplattık. Sonuçları inceleyelim:

RMSE için:

7

MAE için:

8

Evet hem RMSE hem de MAE hata metriklerinde “Holt’s Linear Method” ve “Holt-Winter’s Seasonal Method” birbirlerine yakın ve diğerlerinden daha iyi sonuçlar verdi. Fakat bakalım tahminleme aşamasında bu durum nasıl olacak.

Tahminleme yapmak adına, veriyi tekrar train ve test setler olarak ikiye ayırıp, train set üzerinde modeli eğitelim ve test set üzerinde de testini gerçekleştirelim. Aşağıdaki kod bloğuyla veriyi ayıralım:

train_ts <- window(Data_ts, end = c(1973, 12))
test_ts <- window(Data_ts, start = c(1974, 01))

“window” komutuyla 1973 aralık ayına kadar olan kısmı train, 1974 ocak ayından sona kadar olan kısmı da test set olarak ayırdık. Sıra geldi eğitim aşamasına. Şimdi train set üzerinde modelleri kuralım:

SES <- ses(train_ts, h = 22)
HOLT_D <- holt(train_ts, damped = T, h = 22)
HW_D <- hw(train_ts, damped = T, seasonal = 'multiplicative', h = 22)

Üstteki hata metrikleri bazında en iyi sonuçları çıkaran Holt’s Linear Method ve Holt-Winter’s seasonal metoda ek olarak, SES metodunu da görsel olarak
sonuçlarda görmek amacıyla veri üzerinde eğittim. “ses” komutu “”Simple Exponential Smoothing metodunu “h=22” argümanıyla beraber 22 adım ötesini tahmin etmek için kullanıyor. Buradaki 22 de tabii ki test set uzunluğu. “holt” metoduyla ise Holt’s Linear Method’u uyguladık ve “damped = T” argümanıyla tahminlenen trendin ileride aşağı bükülmesini sağladık. Yine “h = 22” argümanıyla 22 adım ötesini tahminledik. Son olarak, “hw” komutu ise Holt-Winter’s Seasonal Method’u uyguladı ve yine “damped = T” argümanını verdikten sonra, bu kez “seasonal = ‘multiplicative'” diyerek verinin mevsimselliğinin değişik noktalarda artarak gittiğini ve tahminlemelerin de buna göre olması gerektiğini belirttik. Yine 22 adım ötesini tahminledik.

Şimdi bu 3 farklı metodun metriklerini daha detaylı olarak karşılaştıralım:

accuracy(SES, test_ts)
accuracy(HOLT_D, test_ts)
accuracy(HW_D, test_ts)

“accuracy” komutu ile, oluşturulan modellerin hem train hem de test setler üzerindeki hata metriklerini hesapladık. Sonuçları görelim:

9

Sonuçlara bakacak olursak, test set başarısında RMSE, MAE, MAPE ve MASE bazında Holt-Winter’s Seasonal Method’un en başarılı olduğunu görüyoruz. Bu da genel olarak en başarılı metodun bu olduğunu gösteriyor.

Sonuçları görmenin en iyi yolu, bunları görsel olarak görmektir. Aşağıdaki kod bloğuyla sonuçları grafik üzerinde görelim:

autoplot(Data_ts) +
autolayer(SES, series="SES", PI = FALSE) +
autolayer(HOLT_D, series="Holt", PI = FALSE) +
autolayer(HW_D, series="HW", PI = FALSE) +
ggtitle("Model Tahminleri") + xlab("Yıl") +
ylab("Silahlı Soygunlar") +
guides(colour=guide_legend(title="Method"))

En alt katmana verinin kendisini çizdirip, daha sonra her modelin tahminlerini bu verinin üstüne “autolayer” komutu ile tabaka tabaka ekledik. “series” komutu ile isimlerini verdik, “PI = FALSE” komutu ile de güven aralıklarını istemediğimizi belirttik. Sonucu görelim:

10

Evet, SES ve Holt’s Linear metodlarının aslında çok basit tahminler ürettiğini görüyoruz. SES direkt bir düz çizgi üretirken, Holt’s Linear ise yükselen bir düz trend çizgisi üretiyor. Bu, modellerin doğasında var. Hatırlarsanız üstteki metriklerde de ME(Mean Error) yani ortalama hata bazında bu ikisi Holt-Winter’s Seasonal Method’dan üstündü. Bunun sebebi gördüğünüz gibi düz bir çizgi çektiklerinden, test set gözlemlerinin ortalarından geçmeleri ve dolayısıyla da hepsine nerdeyse eşit mesafede olmaları. Holt-Winter’s Seasonal ise diğerlerine göre çok daha belirgin ve güzel tahminler ortaya koymuş durumda. Görsel olarak da verinin trendini çok daha iyi takip etmiş.

Görsellere ek olarak, bir de ürettiği rakamlara bakalım ve gerçek rakamlar ile karşılaştıralım:

Öncelikle modelin kendi ürettiği verileri inceleyelim:

11

Evet her ay için bir nokta tahmini, bir de %80 ve %95 güven aralıklarında üst ve alt limitler görüyoruz. Örneğin ocak 1974 için, nokta tahmini 313.3948 iken, %80 olasılıkla verinin 233.06 ve 393.72 aralığına düşeceğini model bize söylüyor. Aynı şekilde, %95 olasılıkla da 190.54 ve 436.24 aralığında olacak diyor. Zaten güven aralığı büyüdükçe sınırların da genişlediğini açık ve net bir biçimde görebiliyoruz. Buradaki %80 ve %95 değerlerini fonksiyon içerisinde değiştirebilirsiniz.

Şimdi üretilen nokta tahminlerini, test set ile karşılaştıralım:

Results <- data.frame(TestSet = test_ts, HW = HW_D$mean)
Results

“Results” adında bir data.frame nesnesi oluşturduk ve içine test set değerlerini bir kolon, HW metodunun nokta tahminlerini de bir kolon olarak ekledik. Buradaki “HW_D$mean” ifadesi, modelin nokta tahminlerini alıyor. Aynı şekilde üst ve alt tahminleri de “HW_D$upper” ve “HW_D$lower” ifadeleriyle alabilirsiniz. Sonuçlar:

12

Evet modelin bazı noktalarda çok iyi tahminler çıkardığını, bazı noktalarda ise gerçek değerlerden uzaklaştığını görüyoruz. Zaten grafiğe baktığımızda da durum bu şekildeydi. Burada modelin hiperparametreleri için farklı değerler denenerek, model performansı artırılabilir. Biz burada yazıyı uzatmamak için bunu yapmadık. Fakat üstte gösterdiğimiz “time-series cross-validation” metodu, hiperparametre optimizasyonu için kullanılmaya uygun. Hiperparametrelerden kastımızın ne olduğunu anlamak için ise, modelin kendisini inceleyelim:

HW_D$model

Sonuç:

13

Evet, modelin detaylarını “HW_D$model” komutu ile aldık. “Initial states” başlığının altındaki l, b ve s ifadelerini üstte verdiğimiz denklemlerden hatırlayabilirsiniz. Hepsinin ayrı bir denklemi vardı ve bu denklemler en sonunda tahminleme denklemini oluşturuyordu. “Smoothing parameters” başlığının altındakiler ise “Initial states” başlığı altındakilerin kendi denklemleri içerisinde bulunan değişkenlerdi. Bunları da yukarıdaki denklemlerde görebilirsiniz.

Burada l,b ve s ifadelerini model eğitime başlamadan önce belirleyip, alpha, beta, gamme ve phi değerlerini ise kendisi tahminliyor. Siz bu değerlerin tamamını kendiniz belirleyebilir veya farklı değerleri deneyebilirsiniz. Bu da performans optimizasyonu için etkin bir yöntem olabilir.

Evet serinin ikinci yazısının da sonuna geldik. Üçüncü ve son yazıda, yine başka ve çok kullanılan bir zaman serisi tahminleme metodu olan ARIMA modelleri üzerinde duracağız.

NOTLAR

1. Serinin bu ikinci yazısında, üstel düzeltme metodları üzerinde çalıştık. Üstel düzeltme metodları, çokça kullanılan ve etkin metodlardır.

2. Üstte kullandığımız üstel düzeltme metodlarında, hiperparametre optimizasyonu yapılırsa veri üzerinde daha başarılı tahminlere ulaşılabilir. Başlangıç değerlerini belirlemek için her yazılımın fonksiyonları kendi “default” yöntemlerini kullanır. Bunları bu şekilde bırakmak yerine, konfigürasyon yapılırsa model performansı artabilir.

3. Üstel düzeltme metodlarını kullanmak için, R üzerinde bulunan, “ETS” adı verilen ve içerisindeki argümanların çok daha detaylı olduğu bir komut dizisi bulunuyor. Bu komut dizisinin içerisinde sadece argümanlar değiştirilerek her türlü üstel düzeltme metodu tek fonksiyon ile gerçekleştirilebilir durumda. Bunların bilinmesi de faydanıza olacaktır. İnternette bununla ilgili birçok kaynak bulunuyor.

REFERANSLAR

fpp2.pdf erişimi için tıklayın

https://people.duke.edu/~rnau/411avg.htm

https://otexts.com/fpp2/expsmooth.html