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
- train_x’den train_y’yi öğren,
- Bu öğrenmeyi pcr regresyon methodunu kullanarak yap,
- Cross validation için ctrl değişkenine atanan kuralı kullan,
- tuneLength ile 20 bileşene kadar dene
- 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
merhabalar, rassal olarak veriyi ayırmak için şu komutu kullanmak daha pratik olmazmı?
df[sample(nrow(df), nrow(df)*.80), ]