R ile Makine Öğrenmesi Uygulamaları: Temel Bileşen Regresyonu(PCR)

Temel Bileşen Regresyonu

Elinizde bir ürün olduğunu düşünelim;

Bu ürünün fiyatlandırmasını yapacaksınız ve bu fiyatlandırma üzerine bir model kurmak istiyorsunuz. Bu ürünün fiyatı üzerinde etkisi olduğunu düşündüğünüz değişkenleri belirlediniz ve bu değişkenler hakkında veriler toplamaya başladınız. Eğer büyük veriyi işleyecek, modelleyecek ve canlı sistemlere entegre edebileceğiniz teknolojik altyapınız var ise bu değişken sayısı 1000-2000, 10000-20000 bile olabilir. Bu çeşitliliğin getirdiği faydalara rağmen, ortaya çıkardığı problemler de vardır. Bu problemlerin en önemlisi Çoklu Doğrusal Bağıntı’dır. Çoklu Doğrusal Bağıntı kısaca, değişkenlerin birbirlerini açıklaması durumudur. Yani değişkenler arasında negatif veya pozitif güçlü kolerasyonlar vardır. Bu problemi önlemek, birbirleriyle tamamen bağımsız değişkenler ortaya çıkarmak ve bunları modellemek için  Temel Bileşen Regrsyonu kullanılır.

Temel Bileşen Regresyonu, Temel Bileşen Analizi ile seçilen bileşenler ile bir model kurmak üzerine çalışmaktadır. Temel Bileşen, elimizdeki p adet bağımsız değişken içerisinden k adet bileşen seçilmesine dayanır. k değişkeni seçilirken, p adet bağımsız değişkenin içinde sakladığı bilgiyi en yüksek şekilde barındırması istenir. Örneğin, 100 adet bağımsız değişkeni olan bir veriyi düşünelim, bu değişkenlerin içerisindeki değişkenlikler bu verinin karakteristiğidir. Bu karakteristik hakkında elimizde bulunan bilgi seviyesi 4 bağımsız bileşene indirgenip bu 4 değişken ile model kurulur ve tahminlemeler yapılır.

  • Çoklu Doğrusal Bağıntı : Multicollinearity
  • Temel Bileşen Regresyonu : Principal Component Regression(PCR)

Kullanılan Kütüphaneler

library(caret)
library(tidyverse)
library(pls)
library(AppliedPredictiveModeling)
library(elasticnet)
library(broom)
library(glmnet)
library(MASS)
library(ISLR)
library(PerformanceAnalytics)
library(funModeling)
library(Matrix)

Veri Okuma

Hitters hazır veri setini kullanacağız. Bu veri, bir basketbol oyuncusunun maaşını etkilediği düşünülen değişkenler ile oluşturulmuştur.

df <- Hitters 

# Eksik verileri siliyoruz 
df <- na.omit(df)

Veriyi Eğitim-Test Olarak Ayırma

Verimizi modellemek, modelin tahmin performansını ölçebilmek ve kullanım kolaylığı açısından veriyi parçalara ayırıyoruz. Verinin 0.2’lik kısmını test için, 0.8’lik kısmı da train için ayırıyoruz.

train_indeks <- createDataPartition(df$Salary, 
                                    p = 0.8,
                                    list = FALSE,
                                    times = 1) 

train <- df[train_indeks,]
test <- df[-train_indeks,] 

train_x <- train %>% dplyr::select(-Salary)
train_y <- train$Salary 

test_x <- test %>% dplyr::select(-Salary) 
test_y <- test$Salary 

training <- data.frame(train_x, Salary = train_y)

Model

Temel Bileşen Regresyonunu uygulamak için kullanacağımız fonksiyon pcr() fonksiyonudur.

pcr_fit <- pcr(Salary~.,
               data = training, 
               scale = TRUE, 
               validation = "CV") 

summary(pcr_fit)

summary() fonksiyonu ile elde ettiğimiz model çıktısı bize her bir bileşenin açıkladığı varyans değerini göstermektedir. Çıktı biraz karmaşık olsa da fikir vermesi için incelenebilir. Görsel olarak hangi bileşen ile en az hata yapıldığını görmek için aşağıdaki fonksiyon kullanılır.

validationplot(pcr_fit, val.type = "MSEP")
# Her bir bileşen için, MSEP hata metriğine ait değerler

Bileşen sayısının en az hata ile tahmin ettiği değeri bulmak için aşağıdaki fonksiyon kullanılır.

# Bileşen sayısı için 
pcr_fit$ncomp 

# pcr_fit değişkeninin içinde bulunan istatistiklere ulaşmak için
names(pcr_fit)

Tahmin

Modeli kurduk ver pcr_fit nesnesine kaydettik. Şimdi bu modeli test etmek için test olarak ayırdığımız bağımsız değişkenleri bu modele sokup sonuçlarını görebiliriz.

# Her bileşen için tahminler yapmak için
predict(pcr_fit,test_x)
# İstenilen sayıdaki bileşen ile tahmin yapmak için
# text_x veri setinin ilk 5 satırı için 1 ve 2 komponent ile tahmin yapar
predict(pcr_fit,test_x[1:5,], ncomp = 1:2)

Test Hatasının Hesaplanması

Test hatasını hesaplamak için En Küçük Kareler yöntemi kullanılır. Bu yöntemin kullanımı hakkında ayrıntılı bilgi için R ile Makine Öğrenmesi: Doğrusal Regresyon yazısını inceleyebilirsiniz.

  • obs olarak atanan gerçek değerler, pred olarak atanan ise test verisi kullanılarak tahmin edilen değerdir.
  • ncomp parametresi ise istenilen bileşen sayısını belirtir. Burada istediğiniz değerleri girerek istediğiniz sayıda bileşenin oluşturduğu hatayı gözlemleyebilirsiniz.
defaultSummary(data.frame(obs = test_y,
                          pred = as.vector(
                                           predict(pcr_fit, 
                                                   test_x, 
                                                   ncomp = 1:2))))

Cross Validation için Ayarlamalar

Veriyi parçalara ayırma aşamasından sonra cross validation yöntemini kullanarak modelin overfitting yapmasını önlüyoruz. Bunun için k=10 parçanın olduğu bir cross validation yapısı oluşturuyoruz.

ctrl <- trainControl(method = "CV",
                     number = 10)

Model Tuning

  1. train_x’den train_y’yi öğren,
  2. Bu öğrenmeyi pcr regresyon methodunu kullanarak yap,
  3. Cross validation için ctrl değişkenine atanan kuralı kullan,
  4. tuneLength ile 20 bileşene kadar dene
  5. Preproc ile ölçeklendirme, dönüştürme işlemi yap
set.seed(100)
pcr_tune <- train(train_x, train_y,
                  method = "pcr",
                  trainControl = ctrl,
                  tuneLength = 20,
                  preProc = c("center", "scale"))

pcr_tune

pcr_tune değişkenine atanan değer PCR yöntemi için optimum parametreyi içermektedir.

Bu parametre optimizasyonunu görsel olarak da incelemek için;

plot(pcr_tune)

Tune Edilmiş Model ile Test Hatasının Hesaplanması

Ham veride bulunan 20 değişkeni … bileşen kullanarak en düşük hata ile tahmin edebiliyoruz. Ya da bu … bileşen elimizdeki 20 adetlik değişkenin içerisinde barınan bilgiyi en yüksek derecede taşımaktadır.

defaultSummary(data.frame(obs = test_y,
                          pred = as.vector(
                                           predict(
                                                   pcr_tune, 
                                                   test_x))))

Kaynak Kodları

Kaynaklar

  • Mustafa Vahit Keskin : Udemy, R ile Veri Bilimi ve Machine Learning eğitimi

Yazar Hakkında
Toplam 13 yazı
Mustafa Nayansak
Mustafa Nayansak
Yorumlar (1 Yorum)
ziyaretci
ziyaretci Yanıtla
- 21:07

merhabalar, rassal olarak veriyi ayırmak için şu komutu kullanmak daha pratik olmazmı?
df[sample(nrow(df), nrow(df)*.80), ]

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

×

Bir Şeyler Ara