R'de tahmin
sinir ağları için nnet paketi ile
Sinir ağları çok önemlidir ve makine öğreniminde yaygın olarak kullanılırlar. Görevlerini gerçekleştirdikleri girdi verilerinden özellikleri otomatik olarak öğrenme yeteneğine sahiptirler .
Sinir ağları aynı zamanda yapay sinir ağları olarak da adlandırılır .
Bir sinir ağı kullanarak analiz etmek istediğim bazı ayırma verilerim var, ancak işlerin R tarafına geçmeden önce sıklıkla kullanılan birkaç cümleyi temizlemenin uygun olacağını düşündüm.
Sinir ağları nasıl çalışır:
Sinir ağları, birbirine bağlı çok sayıda nöron kullanarak çalışır. (yapay nöronlar) model eğitim sürecinde öğrenilen aktivasyon fonksiyonlarını ve ağırlıkları kullanarak girdi verilerini işlemek ve dönüştürmek için. Amaç, bir kayıp / maliyet fonksiyonunu en aza indiren çıktılar üretmektir.
Adımlar şunları içerir:
- Giriş katmanı: giriş verileri
- Gizli katmanlar: ağın karmaşıklığını kontrol etmek için değiştirilebilir.
- Etkinleştirme işlevleri: sigmoid işlevi , hiperbolik teğet işlevi ve düzeltilmiş doğrusal birim (ReLU) işlevi .
- Ağırlıklandırma ve yanlılık terimleri
- Yayılma: ileri yayılma.
- Eğitim: rastgele başlatıldı
- Değerlendirme: bir test setinde değerlendirildi
Başlamadan önce aşağıya birkaç tanım ekledim.
- İleriye Yayılma - bir çıktı üretmek için girdi verilerini bir sinir ağından geçirme süreci.
- Geri yayılım — tahminlerin olabildiğince doğru olması için modelin ağırlıklarını ve yanlılıklarını eğitmek için kullanılan bir algoritma. Amaç, tahmin edilen çıktı ile gerçek çıktı arasındaki farkı ölçen bir kayıp fonksiyonunu en aza indirmektir.
- Yakınsama - bir modelin parametrelerinin, bir kayıp fonksiyonunu en aza indiren bir dizi optimal değere yaklaşma süreci; amaç, mümkün olan en düşük kayıp fonksiyonunu üreten ağırlıkları ve yanlılıkları bulmaktır.
- Düğüm — bir nöronu temsil eden matematiksel bir birim.
- Aktivasyon fonksiyonları — modele doğrusal olmamayı eklemek için kullanılan matematiksel fonksiyonlar. Ağdaki her düğümdeki girdilerin ağırlıklı toplamına uygulanırlar ve aktivasyon fonksiyonunun çıktısı düğümün çıktısını belirler .
- Ağırlıklar — bağlantıların gücünü temsil eden nöronlar / düğümler arasındaki bağlantılara atanan değerlere bakın.
- Kayıp işlevi — maliyet işlevi olarak da bilinir; modelin tahmin edilen çıktısı ile gerçek çıktısı arasındaki farkı ölçmek için kullanılan matematiksel bir işlevdir.
library(knitr)
library(tidyverse)
opts_chunk$set(fig.width=9, fig.height=7)
opts_chunk$set(comment="", fig.align="center", tidy=TRUE, fig.retina=2, cache = TRUE)
library(broom)
library(yardstick)
library(parsnip)
library(nnet)
library(patchwork)
library(rsample)
library(recipes)
data <- read_csv("https://raw.githubusercontent.com/NicJC/Hotel-reservations/main/Hotel_Reservations.csv")
data %>% names()
booking <- data.frame(
No_Adults = data$no_of_adults,
arrival_day = data$arrival_date,
arrival_month = data$arrival_month ,
year = data$arrival_year,
Qty_weekNights = data$no_of_week_nights,
Qty_weekendNights = data$no_of_weekend_nights,
room_type = data$room_type_reserved,
AvgPricePerRoom = data$avg_price_per_room
)
booking %>% head(n=8)
skimr::skim(booking)
Verilere biraz göz atmak istiyorum:
booking %>% ggplot() +
geom_point(mapping = aes(
y= Qty_weekendNights ,
x = No_Adults ,
col = as.factor(arrival_month),
size = as.factor(year))) +
labs(title = "Weekend Nights booked by quantity of adults per month",
color = "Arrival Month",
x = "Number of Adults",
y = "Weekens Nights booked",
size = "year"
)
Rezervasyon verilerini değerlendirmek için 5 model oluşturacağım. Hedef değişken yapacağım “Qty_weekendNights” değişkeni veya yanıtı ile ilgileniyorum.
Ayrıca verileri bir eğitim ve test setine ayırmam gerekiyor. %25 / 75'lik bir pay kullanacağım:
set.seed(1784)
split <- initial_split(booking, prop=3/4)
train <- training(split)
test <- testing(split)
Tohumu tekrarlanabilirlik amacıyla ayarladım. Aynı deneyi yapmak istersem, aynı tohumu kullanabilirim.
Şimdi ilk model:
set.seed(2982)
model1<- nnet(Qty_weekendNights ~ ., data = train, linout=TRUE, size=11)
Boyut, gizli katmandaki birim sayısını ifade eder. 11 çok fazla.
set.seed(7365)
model2<- nnet(Qty_weekendNights ~ ., data = train,
linout=TRUE,
size=6,
decay=0.01,
maxit=1000
)
Gizli katmandaki birimlerin optimal sayısı (boyutu), etkili tahmin edicilerin sayısı (7) 2'ye bölünerek yukarı yuvarlanmış olmalıdır. 4 iyi bir sayı olmalı.
set.seed(8)
model3<- nnet(Qty_weekendNights ~ ., data = train, linout=FALSE, size=4)
set.seed(168)
model4<- nnet(Qty_weekendNights ~ ., data = train,
linout=TRUE,
size=4,
decay = 0.01 ,
maxit = 1000,
Hess = TRUE)
Modelin, eğitim verilerinde düşük hata üreten bir ağırlık seti bulması nedeniyle yerel minimumlar sorunlu olabilir, ancak bu hata mümkün olan en düşük hata olmayabilir. İdeal olarak, küresel minimumu isteriz.
Hess = DOĞRU ise, en iyi ağırlık setini döndürmeyi umuyoruz.
Bir sinir ağını uydurmanın ve ölçümleri almanın başka bir yolu. Modelleri bu şekilde takmak için yaban havucu paketi gerekir.
set.seed(814)
model5 <- mlp(mode="regression", engine="nnet", hidden_units=4, penalty=0.01,
epochs = 1000)
fit1 <- model5 %>% fit(Qty_weekendNights ~ ., data=train)
fit1 %>% extract_fit_engine() %>% pluck("convergence")
pred1 <- fit1 %>% augment(new_data=test)
pred1 %>% metrics(truth=Qty_weekendNights, estimate=.pred)
Yukarıdaki 0, model birleşirse bir 0 veya maksimum yinelemelere ulaşılırsa bir "1" üretecek olan pluck ("yakınsama") anlamına gelir.
1-4 modelleri için model metriklerini kontrol edeceğim:
modeli 4
pred <- test %>%
bind_cols(pred = predict(model4, newdata=test) %>% as.numeric())
pred %>%
metrics(truth=Qty_weekendNights, estimate=pred)
pred2 <- test %>%
bind_cols(pred = predict(model3, newdata=test) %>% as.numeric())
pred2 %>%
metrics(truth=Qty_weekendNights, estimate=pred)
pred3 <- test %>%
bind_cols(pred = predict(model2, newdata=test) %>% as.numeric())
pred3 %>%
metrics(truth=Qty_weekendNights, estimate=pred)
pred4 <- test %>%
bind_cols(pred = predict(model1, newdata=test) %>% as.numeric())
pred4 %>%
metrics(truth=Qty_weekendNights, estimate=pred)
pred1 <- fit1 %>% augment(new_data=test)
pred1
Çözüm
Birkaç sinir ağı yerleştirdim ve daha iyi bir uyum elde etmek için birkaç parametre kullandım.
maliyet/kayıp fonksiyonunuzu etkileyeceği için bozulma gerçekten önemlidir. Ağırlık azaltma, maliyet fonksiyonuna bir ceza terimi ekleyerek fazla uyumu önlemeyi amaçlayan bir tekniği ifade eder. Aşırı uyum, bir model çok karmaşık hale geldiğinde ve eğitim verilerine çok iyi uyduğunda ortaya çıkar. Bozulma parametresi için 0,01 genellikle kullanmak için iyi bir sayıdır.
Parametrelerle oynamaya ve model metrikleri aracılığıyla birbiriyle karşılaştırdığınız birkaç model oluşturmaya değer.
Kodumda pipe %>% operatörünü çok kullandım, borulama hakkında daha fazla bilgi edinmek istiyorsanız, aşağıdaki makaleme göz atın:
R ile borulamaUmarım makaleyi beğenmişsinizdir ve faydalı bulmuşsunuzdur.
R, Julia, Python ve uygulamalı istatistikler hakkında daha fazla makale için beni takip edin!

![Bağlantılı Liste Nedir? [Bölüm 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































