Makine öğrenmesi hiç bu kadar kolay olmamıştı: Basit Doğrusal Regresyon

Bilal Kurban
7 min readApr 19, 2020

--

Basit Doğrusal Regresyon en temel makine öğrenme yöntemi ve bir veri bilimcinin başlangıç noktasıdır.

Makine Öğrenmesi

Son yıllarda veri hacminin, çeşitliliğinin ve hızının artmasıyla beraber veriye ilişkin geleneksel tanım ve kavramlar da farklılaşmaya başladı. Doğrusal regresyon, lojistik regresyon, kümeleme vs. geleneksel istatistiksel yöntemler günümüzde makine öğrenmesi (machine learning) üst başlığı altında değerlendirilmektedir.

Yapay zekanın bir alt kümesi olarak görülen makine öğrenmesi, deneyim yoluyla otomatik olarak gelişen bilgisayar algoritmalarıdır. Bunlar geleneksel algoritmalar geliştirmenin zor veya mümkün olmadığı çok çeşitli uygulamalarda kullanılır. Makine öğrenmesi, tahminler yapabilmek ve kararlar alabilmek için örnek verilere (sample ya da günümüz terminolojisiyle, training dataya) dayalı matematiksel model oluşturur.

Klasik makine öğrenmesi, gözetimli (supervised learning) ve gözetimsiz öğrenme (unsupervised learning) olmak üzere ikiye ayrılır. Gözetimli öğrenme, önceden kategorize edilmiş verilerle tahminler yapmak ve tahmin modelleri geliştirmek için kullanılırken gözetimsiz öğrenme ise etiketlenmemiş veriler ile veri yapısını ve örüntüsünü tanımada kullanılır. Gözetimli öğrenme, regresyon ve sınıflandırma problemleri olarak gruplandırılabilir. Her iki problem de hedef, nitelik değişkenlerinden bağımlı özelliğinin değerini tahmin edebilen bir model yapısı oluşturulmasıdır. İkisi arasındaki fark, bağımlı özelliğin regresyon için sayısal ve sınıflandırma için kategorik olmasıdır.

Doğrusal Regresyon

Regresyon analizi, tahmin için en yaygın kullanılan yöntemlerden biridir. Gerçek yaşamda karşılaşabilecek problemler lojistik, karesel (Quadratic) ya da üstel (exponential) de olabilir ancak bu yayında doğrusal ilişki üzerinde durulacaktır. Doğrusal regresyon, muhtemelen en temel makine öğrenme yöntemidir ve her hevesli veri bilimcinin gelişmiş analitik öğrenme yolu için bir başlangıç noktasıdır.
Doğrusal regresyon, iki veya daha fazla değişken arasındaki nedensel ilişkinin doğrusal bir kestirimidir.
Regresyon modelleri, çıkarımlar ve tahminler yapmanın en yaygın yollarından biri olduğu için son derece değerlidir. Bunun dışında, belirli bir sonucu etkileyen faktörleri anlamlı bir şekilde belirlemek ve değerlendirmek için de regresyon analizi kullanılmaktadır.

Doğrusal regresyon bilmek veri bilimciler için bir zorunluluktur. Çünkü gerçek hayat sayısız neden sonuç ilişkileri ile doludur ve bu da bize sayısız doğrusal regresyon örnekleri sunar. Örneğin; harcanılan para miktarı, kazanılan para miktarına bağlıdır. Kazanılan para miktarı ise alınan eğitimlerin toplam süresine …

Regresyon modelinin matematiksel gösterimi aşağıdaki gibidir:

Doğrusal Regresyon Modeli

Bu gösterimde;

  • Y: Bağımlı değişkeni,
  • β0: Sabit bir sayıyı (kesim noktası),
  • β1: Eğimi (doğrunun eğimi),
  • X: Bağımsız değişkeni ve
  • ε: Hata terimini sembolize eder.

Diğer birçok istatistiksel teknikte olduğu gibi, regresyon modelleri örnek verilere dayanarak populasyon hakkında tahminlerde bulunmamıza yardımcı olur.

Katsayı kestirimleri için kullanılacak eşitlik ise aşağıdaki gibidir:

Doğrusal Regresyon Eşitliği

Bu eşitlikte;

  • ŷ: Tahmin değerini,
  • b0: Sabit tahminini,
  • b1: Katsayıyı ve
  • x: Bağımsız değişken örnek verisini sembolize eder.

Hatanın ortalama değeri 0'dır, bu nedenle regresyon denklemine dahil edilmemiştir. Doğrusal regresyon eşitliğimiz basitçe aşağıdaki gibi görünür:

Doğrusal Regresyonun Geometrik Gösterimi

Python ile Basit Doğrusal Regresyon

Uzun sayılabilecek teorik bir girişin ardından artık kod yazmaya geçebiliriz.

Neden Python

Bu yayındaki uygulamalar açık kaynak kodlu bir programlama dili olan python ile gerçekleştirilecektir. Bu seçimin iki nedeni vardır. İlki; python en kolay, en güçlü ve en popüler veri bilimi araçlarından biridir. İkincisi; büyük veri (big data) kavramının ortaya çıkmasıyla beraber geleneksel veri işleme araçlarının özellikle hız konusunda yetersiz kalmasıdır. Python sınırsız yeteneklere ve eşsiz bir hıza sahiptir.

Python kurulumu ve python’da kod yazma işlemi çok basittir. Bilgisayarınıza Anaconda (Python ve R programlama dillerinin paket yönetimini ve dağıtımını basitleştirmeyi amaçlayan ücretsiz ve açık kaynaklı bir dağıtım) platformunu yükleyerek buradaki jupyter notebook (canlı kod, denklemler, görselleştirmeler ve anlatı metni içeren belgeler oluşturmanıza ve paylaşmanıza izin veren açık kaynaklı bir web uygulaması) uygulaması aracılığıyla kod yazmaya hemen başlayabilirsiniz. Basit doğrusal regresyon oluşturabilmek için yazılması gereken kodlar aşağıda adım adım verilmiştir.

Haydi Kodlayalım!

  1. Kütüphaneleri içe aktar

Basit doğrusal regresyon uygulamamız için önce ilgili kütüphaneleri içe aktaralım:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
import seaborn as sns
sns.set()

Yukarıdaki kodu çalıştırdığımızda ilgili kütüphaneler yüklenmiş olacaktır. Kodda içerilen kütüphaneler python paketleridir.

  • NumPy dizilerle (listelerle) matematiksel ve mantıksal işlemler için,
  • Pandas veri analizi için,
  • Matplotlib ve Seaborn çizim ve istatistiksel grafikler yapmak ve
  • Statsmodels modülü de, birçok farklı istatistiksel modelin tahmini, istatistiksel testler ve istatistiksel veri keşfi içindir.

Regresyon analizi için burada kullandığımız Statsmodels paketi teorik ve öğreticidir. Her tahmin edici için kapsamlı bir sonuç istatistikleri listesi sunar. Bu nedenle şu aşamada bu paket tercih edilmiştir. Fakat python’da hem pratik hem de profesyoneller için makine öğrenme kütüphanesi Scikit learn’dür. Bir sonraki yayında analizimiz bu paketle de gerçekleştirilecektir.

2. Veriyi yükle ve göster

tips = sns.load_dataset("tips")
data=tips[['total_bill','tip']]
data.columns=['hesap','bahşiş']
data.head()

Yukarıdaki kod ile sırasıyla:

  • Analizimizde kullanacağımız Seaborn kütüphanesindeki “tips” veri dosyasını yükledik.
  • Bu veri dosyasından basit doğrusal regresyonumuzda kullanacağımız “total_bill” ve “tip” sütunlarını filtreleyerek “data” adında yeni bir veri çerçevesi oluşturduk.
  • Sütun adlarını Türkçeye dönüştürmek amacıyla, oluşturduğumuz “data” adlı veri çerçevesindeki “total_bill” sütununun adını “hesap” ve “tip” sütununun adını “bahşiş” olarak değiştirdik.
  • “data” veri çerçevemizin içindekileri kontrol edebilmek için programdan ilk beş satırını göstermesini istedik.

Programın ürettiği çıktı şu şekildedir:

“Data” Veri Çerçevesinin İlk Beş Satırı

3. Veriyi tanı

data.describe()

Bu yöntem bize çok güzel tanımlayıcı istatistikler verir. Kod çalıştırıldığında aşağıdaki çıktı elde edilir:

“Data” Veri Çerçevesinin Tanımlayıcı İstatistikleri

Analizimiz için kullandığımız “tips” veri seti bir restoranın, 1990 başlarında iki buçuk ay boyunca hizmet verdikleri tüm müşterilerle ilgili kaydettiği verilerden oluşur. Restoran yöneticileri, garsonlara bahşiş verilirken hangi faktörlerin önemli olduğunu bilmek isterler. Bu amaçla, garsonlara verilen bahşişin ödenen hesap miktarına (yemek maliyeti) bağlı olduğunu düşünerek böyle bir model oluşturulmuştur.

Tanımlayıcı istatistiklerden; verinin 244 kayıttan oluştuğu, ortalama 20$ hesap ödendiği ve 3$ bahşiş verildiği vs. veriyi tanımamızı sağlayacak bilgilere ulaşılabilmektedir.

4. Regresyon değişkenlerini tanımla ve veriyi keşfet

Verimizi tanıdıktan sonra sıra geldi regresyonumuzu oluşturmaya. Regresyon denklemimizi oluşturabilmemiz için ilk yapmamız gereken bağımlı ve bağımsız değişkenlerimizi belirlemektir. Örneğimizde verilen bahşiş miktarı tahmin edilmeye (kestirilmeye) çalışılmaktadır. Bu yüzden bağımlı değişkenimiz “bahşiş” ve bağımsız değişkenimiz ise “hesap” değişkenleridir.

y = data ['bahşiş']
x1 = data ['hesap']
plt.scatter(x1,y)
plt.xlabel('Hesap', fontsize = 20)
plt.ylabel('Bahşiş', fontsize = 20)
plt.show()

Yukarıdaki kodda sırasıyla:

  • Regresyon denklemimizi takiben bağımlı değişkenimizi (y) “bahşiş” olarak belirttik.
  • Benzer şekilde, bağımsız değişkenimizi (x) “hesap” olarak atadık.
  • İkisi arasındaki ilişkiyi görmek için saçılım grafiğini çizdik (önce yatay ekseni, sonra dikey ekseni koyduk).
  • Grafiğin x eksenini adlandırdık.
  • Grafiğin y eksenini adlandırdık.
  • Grafiği göster dedik.

Sonuç olarak bize aşağıdaki görsel program tarafından çıktı olarak verilir.

Verilen Bahşiş (y) ve Ödenen Hesap (x) Saçılım Grafiği

Grafikten, “bahşiş” ile “hesap” arasında pozitif yönde doğrusal bir ilişki olduğu sonucuna varılabilir. Saçılım grafiği sonucunda değişkenlerimiz arasında doğrusal bir ilişki görünmüyorsa regresyon analizi yapmamızın da bir anlamı yoktur. Çünkü doğrusal regresyonun ilk varsayımı adı üstünde doğrusallıktır. Bizim durumumuzda, ödenen hesap arttıkça verilen bahşiş miktarı da artmaktadır. Artık regresyonumuzu oluşturabiliriz.

5. Regresyonun kendisi

x = sm.add_constant(x1)
results = sm.OLS(y,x).fit()
results.summary()

Yukarıdaki kodlar sırasıyla:

  • Sabitimizi ekledik. Esasen, yalnızca 1'lerden oluşan x’in uzunluğuna eşit yeni bir sütun ekledik. Regresyon oluşturmak için Statsmodels modülünü kullanıyorsak ve modelimizde bir sabit olmasını istiyorsak bu kod mutlaka içerilmelidir.
  • Bağımlı değişken y ve bağımsız bir x ile OLS (Ordinary Least Squares — sıradan en küçük kareler, ) yöntemine göre modelimizi uydurduk.
  • Regresyonumuzun güzel bir özetini yazdırdık. statsmodels modülünün en güçlü noktalarından biri bu özet tablodur.
statsmodels Özet Tablosu

6. Regresyon denklemi

Nihayetinde sadece 5 adımda regresyonumuzu oluşturmuş olduk. Özet tablodan da görülebileceği üzere katsayılarımız (coef); bo=0,9203 ve b1=0,1050'dir. Bu durumda regresyon denklemimiz:

ŷ= 0,9203+0,105x

Yani modelimize göre:

  • 1$’lık bir hesap için (0,9203+0,105*1) 1,0253$,
  • 10$’lık bir hesap için (0,9203+0,105*10) 1,9703$,
  • 20$’lık bir hesap için (0,9203+0,105*20) 3,0203$ bahşiş verileceği öngörülmektedir.

7. Regresyon doğrusu

Peki ya oluşturduğumuz doğrusal regresyon denklemimiz nasıl görünüyor? Bunu anlamak için aşağıdaki kodu çalıştırabiliriz.

plt.scatter(x1,y)
yhat = 0.1050*x1 + 0.9203
fig = plt.plot(x1,yhat, lw=4, c='orange', label ='regression line')
plt.xlabel('Hesap', fontsize = 20)
plt.ylabel('Bahşiş', fontsize = 20)
plt.show()

Kod sırasıyla aşağıdakileri yapar:

  • Önce yine “hesap” ve “bahşiş” saçılım grafiğimizi oluşturduk.
  • Ardından, sonrasında çizdirebilelim diye regresyon denklemini tanımladık.
  • Regresyon çizgisini bağımsız değişkene (hesap) göre turuncu renkte çizdirdik.
  • Grafiğin x eksenini adlandırdık.
  • Grafiğin y eksenini adlandırdık.
  • Grafiği göster dedik.

Programın oluşturduğu görsel aşağıdadır:

Regresyon Çizgisi

Sonuç ve Değerlendirme

Bu yayında, bir veri bilimci için teoriğinin ve pratiğinin bilinmesi bir seçenekten öte zaruriyet olan en temel makine öğrenme uygulaması basit doğrusal regresyonu python ile uyguladık. Bunun için seaborn kütüphanesindeki hazır “tips” veri setini kullanarak bir basit doğrusal regresyon modeli oluşturduk. Bu model, veri setindeki ödenen hesap değişkeninden verilen bahşiş miktarını tahmin etmek üzere geliştirildi. Tabii ki verilen bahşiş miktarına etki eden tek faktör ödenen hesap değildir. Restoran yoğunluğu, restorana gelinen zaman, masanın konumu vs. bahşiş miktarını etkileyen bir çok faktör vardır. Fakat bu yayında sadece basit doğrusal regresyon uygulamasının python ile nasıl oluşturulabileceği üzerinde durulmuştur.

Oluşturulan regresyon modelinin doğruluğunu ve kalitesini geliştirebilmek amacıyla mutlaka regresyon varsayımları (normallik, sabit varyans, otokorelasyon, multicollinearity, içsellik vs.) kontrol edilmelidir.

Bu yayının okunabilirliğini arttırabilmek adına regresyon sonuçlarının değerlendirilmesine ve regresyon varsayımlarının sınanmasına burada fazla değinilmemiştir. Bunlara, sklearn modülü ile geliştirilecek olan bir sonraki yayındaki regresyon oluşturma uygulamasında detaylı yer verilecektir.

--

--

Bilal Kurban

Veri bilimi ve makine öğrenmesi konularında son derece tutkulu bir istatistikçi