Anasayfa / Büyük Veri / R ile Makine Öğrenmesi Uygulamaları: Doğrusal Regresyon

R ile Makine Öğrenmesi Uygulamaları: Doğrusal Regresyon

Rolls Royce Büyük Veriyi Nasıl Kullanıyor?

Rolls Royce, 500 havayolu ve 150’den fazla askeri kuvvet tarafından kullanılan çok büyük motorlar imal eden çok bir şirket. Bu motorlar muazzam büyüklükte güç üretiyorlar ve böyle büyük rakamlarla iş gören bir şirketin Büyük Veri’yi bağrına basması hiç şaşırtıcı değil.

Bu sektör, arızaların ve hataların milyarlara ve insan hayatına mal olabildiği, son derece ileri teknolojilerin kullanıldığı bir sektördür. Dolayısıyla şirketin, ürünlerinin sağlık durumunu takip etmesi ve potansiyel sorunları daha gerçekleşmeden saptaması çok önemlidir.

Şirketin baş bilim sorumlusu Paul Stein şöyle açıklıyor: ” Tasarım sürecinde kullanılan yüksek güçlü bilgisayar gruplarımız var. Jet motorlarımızın simülasyonu için onlarca terabayt veri üretiyoruz. Ardından oldukça gelişkin bilgisayar teknikleri kullanarak bu büyük veri setini inceliyor ve tasarladığımız o ürünün iyi mi yoksa kötü mü olduğunu görselleştirebiliyoruz. Büyük Veri’nin görselleştirilmesi, en az onu incelemek için kullandığımız teknikler kadar önemli.”

Doğrusal Regresyon

Günlük hayat içerisinde beynimiz, çeşitli karar verme süreçlerinde, geçmiş tecrübelerinden faydalanarak karmaşık problemleri çözüp kararlar verebilmektedir. Bu kararların niteliği, karşılaşılan problemden probleme değişiklik gösterse de, beynimiz elindeki seçenekleri, öğrendiğimiz gerçeklik süzgecinden geçirip karar vermektedir . Burada anahtar kelime “öğrenme” kelimesidir.

İnsanlar ve makinelerin ortak özelliklerinden bir tanesi öğrenme sürecini verilerden faydalanarak gerçekleştirmesidir. Hayatımızda bir konu ile ilgili ne kadar fazla ve çeşitli kararlar vermişsek bu konu ile ilgili tecrübemiz, karar verme hızımız, kurduğumuz modelin doğruluğuna olan inancımız da aynı oranda artacaktır. Gelişen teknoloji ile birlikte makineler hem daha çok veri barındırabiliyor hem de öğrendikleri kaynaklar çeşitlenebiliyor; yazılı, sayısal, görsel veya işitsel kaynaklar gibi. Bu makineler bizim analiz edemeyeceğimiz kadar büyük ve karmaşık haldeki veriyi analiz edebiliyor, gözle göremeyeceğimiz ayrıntılara ulaşabiliyor, optimizasyon süreçlerinde baş rolü oynayabiliyor.

Doğrusal Regresyon ise insan düşünce yapısını makinelere öğretme aşamasında en somut örnekleri barındırıyor. Bir evin satış fiyatını etkileyen faktörleri düşündüğümüzde o evin konumu, genişliği, oda sayısı gibi değişkenleri ekleyip o evin fiyatı hakkında aşağı yukarı bir tahminleme yapabiliyoruz. Çünkü beynimiz bu değişkenler arasındaki doğrusal ilişkiyi kurabiliyor ve hayal gücümüzde canlandırabiliyor.

Bu yazıda, en temelinde bizim düşünce yapımızı taklit edebilen ve bizim için düşünebilen bilgisayarlara nasıl öğreteceğimizden, Makine Öğrenmesinden bahsedeceğiz. Ve bu öğrenmenin mantığını en iyi anlatacak olan, doğrusal regresyondan.

Uygulamanın İçeriği

  1. Veri Ön İşleme
  2. Eksik ve Aykırı Gözlem Tespiti
  3. Keşifçi Veri Analizi
  4. Doğrusal Regresyon Modeli
  5. Varsayımların Kontrol Edilmesi
  6. Stepwise Yöntemler
  7. Tahmin
  8. Veriyi Test ve Train Olarak Ayırma
  9. Cross Validation Yöntemi

Kullanılan Paketler

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

Çalışmanın Amacı

Bir bina inşaatı için kullanılan harcın sağlamlığı üzerinde etkili olduğu düşünülen bağımsız değişkenler ile bir regresyon modeli kurmak, kurulan modelin ve değişkenlerin anlamlılıklarını test etmek, en iyi modeli bulmak, kurulan modelin tahmin performansını ölçmek.

1. Veri Ön İşleme

# Verinin yer aldığı director bölümünü seçmeyi unutmayın
df <- read_xlsx("C:/Users/Asus/Desktop/R ile ML Uygulamaları/Doğrusal Regresyon/data.xlsx")
head(df)

# Veride bazı değişkenler karakter verisi olarak kaydedildiği için numeric olarak değiştirdim
saglamlik <- as.numeric(df$Saglamlık)
cimento <- as.numeric(df$Cimento)
mucur <- as.numeric(df$Mucur)
kul<- as.numeric(df$Kül)
kaba_agr<- as.numeric(df$Kaba Agr)
ince_agr<- as.numeric(df$İnce Agr)

veri <- data.frame(
  saglamlik,
  cimento,
  mucur,
  kul,
  kaba_agr,
  ince_agr
)

2. Eksik ve Aykırı Gözlem Tespiti

# EKSİK VERİLERİN TESPİT EDİLMESİ
sum(is.na(veri))

Veri kullanılabilir hale getirildikten sonra “veri” değişkenine atandı ve eksik verilerin olmadığı belirlendi. Şimdi sıra aykırı gözlem tespitinde.

# BAĞIMLI DEĞİŞKEN İÇİN AYKIRI GÖZLEM TESPİTİ
summary(saglamlik)

Doğrusal regresyonun varsayımlarını ilerde kontrol edeceğiz ama ön bilgi olarak bilmemiz gereken analize başlamadan önce bağımlı değişkenin normal dağılıp dağılmadığını kontrol etmek. Normal dağılımın en bilindik özelliklerinden bir tanesi, bu dağılımın simetrik olmasıdır. Dolayısıyla Mean, Mode, Median istatistikleri birbirine yakın değerler almaktadır. summary() fonksiyonu ile değişkenin özet istatistiğini çıkardığımızda ortalama ile medyan değerlerinin çok farklı olduğunu görüyoruz. Yani sapan değerler olabileceği kanısına varıyoruz.

hist(x = veri$saglamlik,freq = T)
veri <- veri[-which(saglamlik>60),]

Değişkenin histogramını çizdirdiğimizde median değerinin sağ tarafında bir kaç tane sapan değer olduğu belirleniyor. Sağlamlık değişkenini incelediğimizde 60’değerinin üzerindeki değerlerin sapan değer oldukları belirleniyor ve bu değerler çıkarılıyor.

3. Keşifçi Veri Analizi

## Veri setinin genel yapısı hakkında bilgiler için glimpse() fonksiyonu
glimpse(veri)

## Verideki sürekli değişkenlerin özet istatistikleri için profiling_num()
profiling_num(veri)

## Değişkenler arasındaki kolerasyonu incelemek için aşağıdaki fonksiyon kullanılır. 
chart.Correlation(veri)

Doğrusal regresyon değişkenler arasındaki doğrusal ilişkiyi ölçer demiştik. Korelasyon istatistiği de aynı şekilde bu değişkenler arasındaki doğrusal ilişkiyi incelediğinden bu önemli bir istatistiktir.

Kolerasyon + yönde olduğunda değişkenler arasında pozitif yönlü bir ilişki vardır, yani bir değişken içerisindeki değer artış gösterdiğinde diğer değişken değeri de belirli bir oranda artmaktadır. Bu değerin 0 değerine yaklaşması ise bu değişkenler arasında herhangi bir doğrusal ilişki yoktur yorumu yapılabilir.

“Şirketin üretim sistemleri, gittikçe daha fazla ağ bağlantılı hale geliyor ve ‘Nesnelerin Interneti(IoT)’ adı verilen ağ tabanlı endüstri ortamında birbirleriyle iletişim kurabiliyor. İnovasyon sadece son derece gelişkin ve akıllı sistemler olan metal işleme süreçlerinde değil, otomatik ölçüm düzenlerimizde ve fabrikalarda ürettiğimiz bileşenlerin kalite kontrolünü denetleme şeklimizde de gerçekleşiyor.”

Paul Stein

4. Doğrusal Regresyon Modeli

model <- lm(veri$saglamlik~
              veri$cimento+
              veri$mucur+
              veri$kul+
              veri$kaba_agr+
              veri$ince_agr)
summary(model)

Tüm değişkenleri içeren bir model kurduk ve özet istatistiklerini çıkartır.

Bu bölümde modele eklenene değişkenlerin model için ne kadar anlamlı olduklarını inceleyebiliyoruz. Hata oranını 0.05 olarak aldığımızda Çimento, Mucur ve Kül değişkenlerinin anlamlı olduklarını görebiliyoruz. Yani bu değişkenleri modelden çıkarmak, modelin açıklayıcılığını azaltabilir yorumunu yapıyoruz.

Bu katsayıların anlamlılıklarını hem T test istatistiğini kullanarak, hem de güven aralıklarını hesaplayarak test edebiliriz.

confint(model)

confint() fonksiyonu yardımı ile modele eklenen değişkenlerin anlamlılıklarını incelemek mümkün. Bu fonksiyon bir sayı aralığı döndürür ve bu aralığın 0 değerini içermemesi beklenir. Eğer 0 değerini içeriyorsa değişken o güven düzeyinde anlamsızdır yorumu yapılabilir.

5. Varsayımların Kontrol Edilmesi

# par() fonksiyonu ile çıktı ekranını 2x2'lik 4 parçaya ayırıyoruz
par(mfrow=c(2,2))

# plot model ile modelin çıktısını elde ediyoruz
plot(model)
  • 1. Grafik için; Varyans homojenliği var mı yok mu diye bakıyoruz. Noktaların 0 etrafında rasgele dağılması istenir – gözlem sayısının az olması sebebi ile grafikler subjektiftir, yapılan yorumlar yanlıdır.
  • 2. Grafik için; Artıkların normal dağılıp dağılmadığını belirtir. Bir doğru üzerinde olması istenir. Görsel olarak normal dağılıyor denilebilir ama test yapılması gerekmektedir.
  • 3. Grafik için; Standartlaştırılmış artık değerler için ve fitted valuelar için inceliyoruz. 1. grafikle benzer yapıdalar.
  • 4. Grafik için; Standardizied residuals kısmı uç değerlerin veya aykırı gözlem etrafında olup olmadığını gösterir. Standardized gözlemlerin +3 ve -3 değerleri arasında olup olmadığı incelenir.
  • 4. Grafik için; Leverage ile etkin gözlem olup olmadığına bakıyoruz.- Leverege için kriter 2*p/n. Hesaplanan değer bu kriteri geçiyor ise etkin gözlemdir. Yani modelin başarısını doğrudan etkiler yorumu yapılabilir.

Bağımlı Değişkenin yayılımını incelemek, gözlemlerin arasındaki rassallığı görselleştirmek ve bu değişken hakkında genel bilgilere sahip olmak için;

Bu bölümde sadece 2. grafik için; gözlemler arasında herhangi bir örüntünün olmaması, birbirini takip eden gözlem birimlerinin olmaması istenir. Rassallık, yapılan her analiz için çok önemlidir. Eğer rassallık olmaz ise yapılan analizler yanlı olacaktır.

Normallik testi;

ols_test_normality(saglamlik)

Bu bölümde çeşitli normallik testlerine göre bağımlı değişkenin dağılımının normal olup olmadığını inceliyoruz. p değerlerinin 0’a çok yakın olması demek, H0:Değişkenin dağılımı normal değildir, hipotezini reddetmemiz anlamına gelmektedir. Yani bu bağımlı değişken ile bir doğrusal regresyon modeli kurulabilir.

Varyans homojenliği testi;

Yukarıda belirttiğim gibi varyansın homojen olması, gözlemlerin belirli bir örüntü oluşturmaması gerekiyor. Bunu istatistiksel olarak kontrol etmek için;

ols_test_breusch_pagan(model)

Burada kurulan hipotezi de görmekteyiz. P değerinin 0.05 değerinden küçük olması sebebiyle H0 hipotezini reddediyoruz ve varyans sabit değildir yani değişkendir yorumunu yapıyoruz.

Çoklu doğrusal bağıntı problemi için;

ols_coll_diag(model)

Çoklu doğrusal bağıntı problemi, bir modelde birbirini açıklayan değişkenlerin olduğu durumda görülmektedir. Bu problem 1000, 2000 tane bağımsız değişkenin oluşturduğu bir model için kaçınılmazdır. Biz de büyük veriler ile uğraştığımız için bu problemle karşılaşıyoruz. Bu fonksiyonun çıktısı olduğu için buraya eklemiyorum.

Bu fonksiyon Tolerans ve VIF adında 2 adet istatistik dönderiyor.

Tolerans = 1-p(x,y)^2  (1 – Değişkenler arasındaki kolerasyonun karesi)

VIF = 1/Tolerans

Eğer VIF değeri 10 değerinden küçük ise o değişkenler arasında çoklu doğrusal bağıntı problemi yoktur yorumu yapılır.

“Rolls Royce, özel depolama yaklaşımına sahip güçlü ve güvenli bir özel bulut aracı kullanıyor. Bu sistem, işlem verimliliğini optimize ederken, çevrim dışı inceleme için de bir veri havuzu sağlıyor. İleride, IoT’den elde edinilen veriler dahil olmak üzere daha fazla veri kaynağı birleştirildiğinde, bulut depolama daha da fazla kullanılacak ve şirket müşterileri için yeni hizmetler yaratılacak”

6. Stepwise Yöntemler

Stepwise yöntemler bir istatistik modeli için vazgeçilmezdir. Çünkü bir modele hangi değişkenin ne kadar katkı sağladığını, olası tüm değişken kombinasyonlarını inceleyerek görebilirsiniz. İleriye doğru seçme, geriye doğru eleme ve çift yönlü seçme olarak 3 şekilde bu yöntemleri kullanabilirsiniz.

model <- lm(saglamlik~.,data = veri)
a <- ols_step_all_possible(model)
a 
data.frame(a$predictors,a$adjr)

Şekilde görüldüğü gibi kül değişkeninden başlayarak olası kombinasyonları ve bu kombinasyonalara ait düzeltilmiş Düzeltilmiş RKare değerlerini görebilirsiniz. Sığmadığı için 21 tanesini gösterebildim fakat toplamda 31 tane kombinasyon var ve tüm değişkenler modele eklendiğinde Düzeltilmiş RKare değeri 0.7737 oluyor.

Düzeltilmiş RKare kullanmamızın sebebi RKare değerinin eklenen değişkenlere karşı artan bir yapıda olmasıdır. Yani değişken eklendiğinde modele çok çok az bir katkısı olsa dahi RKare değeri artmaktadır.

Bu sebeple daha hassas ölçümü olan Düzeltilmiş RKare değerini kullanıyoruz.

İleri Doğru Seçme

ols_step_forward_aic(model)

Bu işlem ile modele en çok katkısı olan değişken ilk girer, sonra diğerleri kümülatif olarak eklenerek devam eder.

 Algoritma sizin kullanabileceğiniz olası kombinasyonu belirler ve RKare sonucunu gösterir. Burada Kül, Çimento ve Mucur değişkenlerini modele eklersek Adj.RKare değerinin 0.77690 olacağını görmekteyiz.

Geriye Doğru Eleme

ols_step_backward_aic(model)

Burada ise ilk önce tüm değişkenlerin olduğu full modelden başlayarak modele katkısı en düşük olan değişkenler modelden çıkarılır. Sonrasında kalan değişkenler ile model kurulur.

 İlk önce kaba kum, sonra ince kum modelden çıkarılırsa modelin Adj.RKare değeri 0.77690. Bu değişkenler çıkarıldıktan sonra modelde kalan değişkenler Kül, Çimento ve Mucur değişkenleri olur yani yukarıda yaptığımız ileriye doğru seçme işleminde döndürülen RKare ile aynı sonucu elde ederiz. Sonuç olarak bu yöntemler birbirini tamamlayan bir yapıdadır yorumu yapılabilir.

Çift Yönlü Seçme

Hem ileriye doğru seçme, hem de geriye doğru eleme işlemleri birlikte uygulanır.

 Yine Kül, Çimento ve Mucur değişkenleri modelde kalmış ve yine Adj.RKare deperinin 0.77690 olduğu gözlemlenmiştir.

Yeni Modelin Kurulması

Stepwise yöntemlerde sadece anlamlı değişkenlerle bir işlem yapılması gerekiyordu fakat konunun tam olarak anlatılması için tüm değişkenleri kullandık. Mucur değişkeni ilk modeli kurduğumuzda anlamsız olduğu için şimdi bu değişken olmadan sadece Kül ve Çimento değişkenleri ile bir model kuruyoruz.

model1 <- lm(saglamlik~cimento+kul,data = veri)
summary(model1)

Değişkenlerin anlamlılıklarına baktığımızda model için gayet uygun değişkenler oldukları görünüyor. Adj.RKare değeri de 0.766 olarak verilmiş, bu da güzel bir sonuç. İdeal modelimizi bulduk artık tahmin işlemine geçebiliriz.

7. Tahmin

Artık elimizde 1 bağımlı değişken ve 2 bağımsız değişkenden oluşan bir model var. Bu modeldeki bağımsız değişkenler, bağımlı değişken olan sağlamlık değişkenindeki değişimin 0.776’sını açıklıyor. Tahmin için rastgele kül ve çimento değeri ekleyip, karılan harcın sağlamlık değerini tahmin edelim.

new_obs <- data.frame(cimento=340, kul=180)
predict(model1, new_obs)
[1] 48

Cimento değeri 340 birim ve kül değeri 180 birim olan bir harcın sağlamlık değeri 48 birimdir. Bu tahmini yapmak için predict() fonksiyonundan yararlanılır.

%95 güvenle tahmin yapmak istersek;

predict(model1, new_obs, interval = "confidence")
fit lwr upr
1  48  46  50

%95 güvenle bu değerlere sahip bir harcın sağlamlık değerinin alt sınırı 46, üst sınırı 50 ve tahmin değeri 48’dir.

8. Train ve Test Veri Seti Olarak Ayırma

# Yeni model için kullanacağımız veri seti
veri_yeni <- data.frame(
  saglamlik,
  cimento,
  kul
)

set.seed(1234)

train_indeks <- createDataPartition(veri_yeni$saglamlik,
                                    p = .8, 
                                    list = FALSE, 
                                    times = 1)

Veri setini %20’ye %80 olarak ayırmak istiyoruz. createDataPartition() fonksiyonu ile veriyi 20’ye 80’olacak şekilde indislere ayırıyoruz.

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

Test ve train datasına bi indisleri dağıtıyoruz ve iki ayrı veri setine sahip oluyoruz. Ancak bu yeterli olmuyor çünkü bağımlı ve bağımsız değişkenlerin de kullanım kolaylığı için ayrılması gerekiyor.

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

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

Veriyi 4 parçaya böldükten sonra bir de training(eğitim) verisi oluşturuyoruz

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

Training(eğitim) verisi ile bir model kurma işlemi yapıyoruz

model2 <- lm(Saglamlik~kul+cimento, data = training)

Modeli eğittikten sonra test ve train hatası hesaplıyoruz

defaultSummary(data.frame(obs = training$Saglamlik,
                          pred = model2$fitted.values))

defaultSummary(data.frame(obs = test_y,
                          pred = predict(model2, test_x)))

 Doğrusal Regresyon hata kareler ortalamasını en küçüklemeyi amaçlayan bir yöntemdir. Dolayısıyla model tahmin performanslarını karşılaştırırken RMSE(Root Means Squared Error), RKare, veya MAE(Mean Absolute Error) istatistikleri kullanılır. RMSE değerinden gidersek, test verisini tahmin için kullandığımızda hatanın arttığını görüyoruz.

9 – Cross Validation Yöntemi

Bu yöntem, bu problem için modelin overfitting yani gözlem değerlerini ezberlemesi durumunun önüne geçiyoruz. Modeli k adet parçaya ayırdıktan sonra o parça test seti olarak ayrılır ve diğer parçalar train seti olarak modeli eğitir. Bu işlem k kez devam eder ve bu işlemlerin ortalamasını alarak bir sonuç döndürür.

ctrl <- trainControl(method = "cv", number = 10)
model_val <- train(x = train_x, y = train_y,
                   method = "lm",
                   trControl = ctrl)
summary(model_val)

Cross Validation yöntemini kullan, veri setini 10 parçaya bölme methodunu uygula ve “ctrl” değişkenine aktar.

x_train setinden y_train’i öğren, bu öğrenme işlemi için Linear Model yapısını kullan ve ctrl kontrolü ile hareket et.

Yukarıda yaptığımız tahmin işlemlerinin aynısını model2 için değil de model_val modeli için değiştirip CV yönteminin ne kadar faydalı bir yöntem olduğunu test edebilirsiniz.

Şansınız bol, Hata Kareler Ortalamanız düşük olsun 🙂

Shiny

Shiny videolar serimizin 8. videosu ile devam ediyoruz. Bu bölümde Iris veri setini kullanarak basit keşifçi veri analizi işlemleri yapılmıştır. R’da hazır halde bulunan verilerin veya .csv uzantılı olarak çekilen verinin içerisindeki değişkenleri seçme ve bu değişkenler ile işlemler yapma konuları hakkında bilgi sahibi olabilirsiniz.

Rolls Royce bir endüstri devi olarak, inovasyonun çelik ve terle geleceği şekillendirmek anlamına geldiği “eski çağ”dan, veri destekli gelişim ve verimlilik “yeni çağı”na geçişin önemli bir örneğini sunuyor. Stein’in söylediği gibi “Rolls Royce, pek çok başarılı sanayi firması gibi dijital açıdan gittikçe daha bilinçli hale gelmek zorunda. Rolls Royce’un dijitalleşmesi tartışmaya açık bir konu değil; soru  bunun olup olmayacağı değil, ne kadar hızlı olacağı.

Kaynaklar

Hakkında Mustafa Nayansak

Mustafa Nayansak, Dokuz Eylül Üniversitesi - İstatistik bölümü mezunu. İstatistiğin teorik ve uygulamalı altyapısına sahip ve bu altyapının üzerine Veri Bilimi, Büyük Veri kavramlarını inşa etmek için R programlama dilini kullanan istekli bir öğrencidir. R programlama dilini sadece istatistiksel analizler yapmak için değil Shiny, RMarkdown gibi özelliklerin de kullanılmasının önemine inanır. Bu düşüncenin temel sebebi ise çalışmaları daha etkileyici bir şekilde sunmak, daha ilgi çekici detaylarla zenginleştirmek ve bir programlama dilini daha etkin kullanabilmek.

GÖZ ATMAK İSTEYEBİLİRSİNİZ

Parametrik Testlerden T Testi ile Merhaba

Giriş Veri Bilimi Okulu okuyucularına merhaba! Uzun süredir Veri Bilimi Okulu’nun teknik alt yapısı görevlerimin …

4 yorumlar

  1. Merhaba Mustafa,

    Çalışmanın verisini paylaşabilir misin ?

  2. Merhaba veriyi bana da gönderebilir misiniz?

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir