Python ile Makine Öğrenmesi: Basit Doğrusal Regresyon ve R2 İstatistiği

P

Bu makalede basit doğrusal regresyon modeli yardımıyla python ile makine öğenmesi algoritması üzerinde durulacaktır. Basitleştirici varsayım olarak kurulan modelin/verilerin klasik doğrusal regresyon modelinin tüm varsayımlarını sağladığı kabul edilmiştir. Makalede basit doğrusal regresyon modelinin bilimsel temelleri kısaca tanıtılacaktır. Sonrasında basit bir model üzerinden python ile makine öğrenmesi uygulaması yapılacaktır.

Not 1: Bu makaledeki uygulamalar Python 3.9 sürümünde, Anaconda Navigator üzerinden Spyder IDE’si kullanılarak yapılmıştır.

Not 2: Bu makalede kullanılan modellerin matematiksel ispatları üzerinde durulmayacaktır. Modellerin daha detaylı matematiksel ispatları için EKONOMETRİ bölümünü ziyaret edebilirsiniz.

1.  Giriş ve Örnek Veri Seti

Yıllık deneyime göre ödenen ücretlerden oluşan aşağıdaki gibi bir veri setimiz olsun. Veri setimizi eğitim seti ve test seti olarak aşağıdaki gibi iki bölüme ayırıyoruz.

Eğitim Seti
DeneyimÜcret
 1.139343.00
1.346205.00
2.043525.00
2.239891.00
2.956642.00
3.060150.00
3.254445.00
3.264445.00
3.963218.00
4.055794.00
4.056957.00
4.157081.00
4.561111.00
4.967938.00
5.383088.00
5.981363.00
6.093940.00
6.891738.00
7.198273.00
8.2113812.00
8.7109431.00
9.0105582.00
9.5116969.00
9.6112635.00
10.5121872.00

Modelimizi yukarıdaki eğitim seti ile eğitip aşağıdaki test seti ile de ne kadar başarılı olduğunu test edeceğiz.

Test Seti
DeneyimÜcret
1.537731.00
3.757189.00
5.166029.00
7.9101302.00
10.3122391.00

Takip eden bölümlerde makine öğrenmesinde yararlanılacak olan basit doğrusal regresyonun (yukarıdaki veri seti esas alınarak) kuramsal yönü ele alınacaktır. Son bölümde ise kuramsal çerçevede ele alınan konular, python ile makine öğrenmesi algoritmasına dönüştürülecektir.

2.  Parametrelerin Elde Edilmesi

Yıllık deneyimin ücretler üzerindeki etkisini araştırmak istediğimizi, yani modelimizi yukarıdaki eğitim seti ile eğiteceğimizi varsayalım. Eğitimde kullanacağımız modelimiz şu şekilde olacaktır.

\displaystyle {Y_i} = {\beta _0} + {\beta _1}{X_{1i}} + {\varepsilon _i}

Makine öğrenmesi literatüründe \displaystyle {Y_i} ifadesinin yerine aşağıdaki ifadeyle de karşılaşılabilir. Bu sadece bir notasyon farklılığıdır. Kurulan modelin başlangıçta bir hipotez olduğu vurgulanmış olur. Aşağıda modelin neden hipotez olduğu açıklanacaktır.

\displaystyle {h_0}\left( {{X_{1i}}} \right) = {\beta _0} + {\beta _1}{X_{1i}} + {\varepsilon _i}

Yukarıdaki modelde \displaystyle {Y_i} açıklanan/bağımlı değişken, \displaystyle {X_{1i}} açıklayıcı/bağımsız değişken ve \displaystyle {\varepsilon _i} ifadesi ise hata terimleridir. Y, X ve \displaystyle \varepsilon  ifadelerinde yer alan “i” harfleri gözlem sırasını temsil etmektedir. Hata terimlerinin doğrudan gözlemlenebilen değerleri olmamakla birlikte (birazdan açıklanacak olan) tahmin edilen değerleri kullanılır.

\displaystyle {X_{1i}} değişkeni yıllık deneyim belirli bir değeri aldığında mümkün olan en az hata/fark ile \displaystyle {Y_i} değişkeni olan ücretin değerini tahmin etmek istiyoruz. Python ile scatter şeklinde aşağıdaki gibi görselleştirdiğimiz veri setini incelediğimizde, amacımızın aşağıdaki veri setine en iyi uyumu gösteren (onu en iyi “fit” edilebilen) bir doğruyu elde etmek olduğunu söyleyebiliriz.

Veri setine en iyi uyumu gösteren (en iyi “fit” edilebilen) bir doğruyu elde etmenin diğer bir ifadesi ise \displaystyle {Y_i} ifadelerinin gerçek değerleri ile fit edilen doğru üzerindeki noktalar arasındaki her bir farkın minimum olmasıdır.

\displaystyle {Y_i} ifadelerinin gerçek değerleri ile fit edilen doğru üzerindeki noktalar arasındaki her bir farkın minimum olması, hata teriminin varyansının minimum olması gerektiğini ifade eder. Gözlem değerlerinin her birinin kusursuz bir şekilde doğru üzerinde yer aldığını ve 5 adet hayali gözlemimiz olduğunu varsayalım. Hata terimlerinin ortalamasının (veya toplamının) daima sıfıra eşit olduğu bilgisi de göz önünde bulundurulursa, hayali serimizin hata terimlerinin varyansı veya kareleri toplamı da (her bir gözlem değerinin doğru üzerinde mükemmel bir şekilde yer aldığı gerçek dışı varsayımımız gereği) sıfır olur. Aşağıdaki varyans denkleminde hayali serimizin hata değerlerini yerini yazarsak, varyansı da 0 olacaktır.

\displaystyle Var\left( {{\varepsilon _i}} \right) = \frac{1}{n}\sum\limits_{i = 1}^n {{{\left( {{\varepsilon _i} - \bar \varepsilon } \right)}^2}}

\displaystyle Var\left( {{\varepsilon _i}} \right) = \frac{{{{\left( {0 - 0} \right)}^2} + {{\left( {0 - 0} \right)}^2} + {{\left( {0 - 0} \right)}^2} + {{\left( {0 - 10} \right)}^2} + {{\left( {0 - 10} \right)}^2}}}{5} = 0

Not: Hata teriminin varyansı elde edilirken kullanılan tahmin ediciye göre paydası, gözlem sayısı n veya n’den farklı bir değer olabilir. Burada basitçe paydanın n’e eşit olduğu kabul edilmiştir.

Ancak gerçekte verilerin doğru üzerinde sıfır hata ile mükemmel bir şekilde konumlanması söz konusu olmaz. Yukarıdaki şekilde gösterildiği gibi gerçek değerler ile doğru üzerinde gerçek değerlerin karşılık geldiği tahmin değerleri arasında pozitif veya negatif farklar vardır. Amaç bu farkların her birinin minimize edilmesidir. Hata değerlerinin toplamı ise daima sıfıra eşit veya ona çok yakındır. Farkların her birinin minimize edilmesi ise hata terimninin varyansının minimize edilmesini ifade eder. O halde hata terimlerinin ortalaması (veya toplamı) daima sıfır olduğundan, hata terimlerinin kareleri toplamı doğrudan varyansının bir ölçüsü olacaktır.

\displaystyle {Y_i} = {\beta _0} + {\beta _1}{X_{1i}} + {\varepsilon _i}

Yukarıdaki modelde hata terimi yalnız bırakılır.

\displaystyle {\varepsilon _i} = {Y_i} - {\beta _0} - {\beta _1}{X_{1i}}

Eşitliğin her iki tarafının da karesi alınarak toplam sembolü ile ifade edilir.

\displaystyle {\left( {{\varepsilon _i}} \right)^2} = {\left( {{Y_i} - {\beta _0} - {\beta _1}{X_{1i}}} \right)^2}

\displaystyle \sum\limits_{i = 1}^n {{{\left( {{\varepsilon _i}} \right)}^2}}  = \sum\limits_{i = 1}^n {{{\left( {{Y_i} - {\beta _0} - {\beta _1}{X_{1i}}} \right)}^2}}

Temel amaç, modelin hata terimlerinin kareleri toplamını minimize etmek yoluyla \displaystyle \beta  katsayılarını tahmin etmek olduğu için yukarıdaki denklem, \displaystyle {\beta _0} ve \displaystyle {\beta _1} parametrelerinin bir fonksiyonu olarak ifade edilebilir. Henüz hata terimlerinin \displaystyle {\varepsilon _i} değerlerini bilmediğimize/elde etmediğimize dikkat edin. Bu yüzden \displaystyle {\varepsilon _i} değerlerini kullanarak parametreler için denklemi çözemeyiz.

\displaystyle f\left( {{\beta _0},{\beta _1}} \right) = \sum\limits_{i = 1}^n {{{\left( {{\varepsilon _i}} \right)}^2}}  = \sum\limits_{i = 1}^n {{{\left( {{Y_i} - {\beta _0} - {\beta _1}{X_{1i}}} \right)}^2}}

Gradyan Azalma (Gradient Descent):

Not: Aşağıdaki işlemler bir gradient descent sürecidir. Makine öğrenmesinde sıklıkla kullanılan bir kavramdır. Sonraki makalelerde gradient descent süreci ayrıca ele alınacaktır. Şimdilik aşağıdaki sürecin bir gradient descent olduğuna ilişkin bir farkındalık  yeterlidir.

Yukarıdaki denklemin üç boyutlu görünümü aşağıdaki şekilde gösterildiği gibidir. Şekilde yer alan “cost” ifadesi hata terimini, yani modelin hata maliyetini (hata teriminin varyansını) temsil etmektedir. Her \displaystyle {Y_i} ve \displaystyle {X_{1i}} değerine karşılık gelen bir hata varyansı vardır. Amaç “cost”u yani hata teriminin varyansını minimum yapan \displaystyle {\beta _0} ve \displaystyle {\beta _1} parametrelerini elde etmektir.

Örneğin A noktası \displaystyle {\beta _1} parametresinin rassal bir değerini temsil ettiğini varsayarsak, hata teriminin varyansını minimum yapan global minimum (B) noktasına karşılık gelen \displaystyle {\beta _1} değerini arıyoruz. Şekilde tek bir lokal mimimum olduğu için lokal mimimum (B noktası) aynı zamanda da global minimumdur. Aynı açıklamalar \displaystyle {\beta _0} parametresi için de geçerlidir.

Makalenin başlangıcında bahsedilen modelin bağımlı değişkeni \displaystyle {Y_i} ifadesi yerine, \displaystyle {h_0}\left( {{X_{1i}}} \right) ifadesinin kullanıldığı form aşağıdaki gibiydi.

\displaystyle {h_0}\left( {{X_{1i}}} \right) = {\beta _0} + {\beta _1}{X_{1i}} + {\varepsilon _i}

Örneğin \displaystyle {\beta _1} parametresine A noktasındaki bir değeri verdiğimizi düşünelim. Sonrasında \displaystyle {\beta _1} parametresine A noktasının hemen altında daha küçük bir değer verdiğimizi düşünelim ve başlangıçtaki hata değeri ile ilk adımdaki hata değerini karşılaştıralım. Eğer ilk adımdaki hata değeri başlangıçtaki (A noktasındaki) hata değerinden küçükse, ikinci adımda \displaystyle {\beta _1} parametresine daha küçük bir değer verdiğimizi düşünelim. Benzer şekilde ikinci adımdaki hata değeri ilk adımdaki hata değerinden küçükse, üçüncü adımda \displaystyle {\beta _1} parametresine daha küçük bir değer verdiğimizi düşünelim. n. adımdaki hata değeri (n-1). adımdaki hata değerinden büyükse, (n-1). adımda verilen \displaystyle {\beta _1} parametresinin değerinin hata değerini mimimum yaptığı anlamına gelecektir. Bu sebeple makine öğrenmesi literatüründe, sürecin bir deneme-yanılma (öğrenme) hipotezi süreci olduğunun vurgulanması amacıyla, bağımlı değişken \displaystyle {Y_i} ifadesi yerine \displaystyle {h_0}\left( {{X_{1i}}} \right) ifadesi de kullanılabilmektedir. Ancak söz konusu sürecin matematiksel karşılığı, denklemin \displaystyle {\beta _0} ve \displaystyle {\beta _1} parametrelerine göre kısmi türevlerinin alınarak sıfıra eşitlenmesidir. Bu işlem yukarıdaki modelde hata terimlerinin karelerini toplamının (diğer bir ifadeyle varyansının) minimize edildiği (yukarıdaki şekillerde yer alan minimum noktalara ulaşıldığı) anlamına gelmektedir.

\displaystyle {\beta _0} parametresinin tahmin edicisini elde etmek için yukarıdaki ifadenin \displaystyle {\beta _0} parametresine göre kısmi türevi alınır.

\displaystyle \frac{{\partial f\left( {{\beta _0},{\beta _1}} \right)}}{{\partial {\beta _0}}} = \frac{{\partial \left( {\sum\limits_{i = 1}^n {{{\left( {{\varepsilon _i}} \right)}^2}} } \right)}}{{\partial {\beta _0}}} = \sum\limits_{i = 1}^n {\left( { - 2{Y_i} + 2{\beta _0} + 2{\beta _1}{X_{1i}}} \right)}  = 0

\displaystyle \frac{{\partial f\left( {{\beta _0},{\beta _1}} \right)}}{{\partial {\beta _1}}} = \frac{{\partial \left( {\sum\limits_{i = 1}^n {{{\left( {{\varepsilon _i}} \right)}^2}} } \right)}}{{\partial {\beta _1}}} = \sum\limits_{i = 1}^n {\left( { - 2{X_{1i}}{Y_i} + 2{\beta _0}{X_{1i}} + 2{\beta _1}X_i^2} \right)}  = 0

 

Sonuçlar aşağıdadır.

 

\displaystyle \frac{{\partial f\left( {{\beta _0},{\beta _1}} \right)}}{{\partial {\beta _0}}} = {\hat \beta _0} = \bar Y - {\beta _1}{\bar X_1}

\displaystyle \frac{{\partial f\left( {{\beta _0},{\beta _1}} \right)}}{{\partial {\beta _1}}} = {\hat \beta _1} = \frac{{\sum\limits_{i = 1}^n {{Y_i}} \sum\limits_{i = 1}^n {{X_{1i}}}  - n.\sum\limits_{i = 1}^n {{Y_i}{X_{1i}}} }}{{{{\left( {\sum\limits_{i = 1}^n {{X_{1i}}} } \right)}^2} - n.\sum\limits_{i = 1}^n {X_{1i}^2} }}

Bir değişkenin üzerinde yer alan düz çizgi o değişkenin aritmetik ortalamasını temsil eder. Örneğin \displaystyle \bar Y ifadesi, \displaystyle {Y_i} değişkeninin aritmetik ortalamasıdır; \displaystyle \bar Y = \frac{1}{n}\sum\limits_{i = 1}^n {{Y_i}}  . Yukarıdaki sonuçlar, \displaystyle {\beta _0} ve \displaystyle {\beta _1} parametrelerinin tahmin edilen değerlerini ifade ettiği için \displaystyle {\hat \beta _0} (beta0 hat) ve \displaystyle {\hat \beta _1} (beta1 hat) notasyonları ile gösterilmiştir. Bir notasyonun üzerindeki hat (şapka) işareti o ifadenin tahmin değeri olduğunu temsil eder.

Başlangıçtaki modelimiz şu şekildeydi.

\displaystyle {Y_i} = {\beta _0} + {\beta _1}{X_{1i}} + {\varepsilon _i}

Modelin tahmin edilmiş gösterimi ile tahmin edilen modelden elde edilen sonuçlar kısaca şu şekildedir.

\displaystyle {Y_i} = {\hat \beta _0} + {\hat \beta _1}{X_{1i}} + {\hat \varepsilon _i}

\displaystyle {Y_i} = \underbrace {{{\hat \beta }_0} + {{\hat \beta }_1}{X_{1i}}}_{{{\hat Y}_i}} + {\hat \varepsilon _i}

\displaystyle {\hat \varepsilon _i} = {Y_i} - {\hat Y_i}

Yukarıdaki ifade (makalenin başlangıcında da bahsedildiği gibi) gözlemlenemeyen hata terimlerinin tahmin edilen değerlerini ifade etmektedir.

\displaystyle {\hat Y_i} = {\hat \beta _0} + {\hat \beta _1}{X_{1i}}

Yukarıdaki ifadede \displaystyle {X_{1i}}, yani deneyim, belirli bir değeri aldığında ücreti \displaystyle {\hat Y_i} olarak tahmin edecektir.

3.  Determinasyon Katsayısı

Modelin genel olarak ne kadar başarılı bir model olduğu, diğer bir ifadeyle modelin genel performansı \displaystyle {R^2}(R kare, R square) olarak da bilinen determinasyon katsayısı (the coefficient of determination) ile ölçülür. Determinasyon katsayısı aşağıdaki kavramlardan hareketle elde edilir.

TSS: Toplam kareler toplamı (Total Sum of Squares)

ESS: Açıklanan kareler toplamı (Explained Sum of Squares)

RSS: Açıklanamayan (hataların) kareler toplamı (Residual Sum of Squares)

\displaystyle TSS = \sum\limits_{i = 1}^n {{{\left( {{Y_i} - \bar Y} \right)}^2}}

\displaystyle ESS = \sum\limits_{i = 1}^n {{{\left( {{{\hat Y}_i} - \bar Y} \right)}^2}}

\displaystyle RSS = \sum\limits_{i = 1}^n {{{\left( {{{\hat \varepsilon }_i}} \right)}^2}}

 

\displaystyle {R^2} = \frac{{ESS}}{{TSS}}

TSS, tanım gereği ESS ve RSS’nin toplamıdır.

\displaystyle TSS = ESS + RSS

\displaystyle \underbrace {\frac{{TSS}}{{TSS}}}_1 = \underbrace {\frac{{ESS}}{{TSS}}}_{{R^2}} + \frac{{RSS}}{{TSS}}

\displaystyle {R^2} = 1 - \frac{{RSS}}{{TSS}}

\displaystyle {R^2} = 1 - \frac{{\sum\limits_{i = 1}^n {{{\left( {{{\hat \varepsilon }_i}} \right)}^2}} }}{{\sum\limits_{i = 1}^n {{{\left( {{Y_i} - \bar Y} \right)}^2}} }}

\displaystyle {R^2} İstatistiğinin Özellikleri:

  • Eğer modelde sabit terim (modelimizde \displaystyle {\beta _0} ile temsil edilen parametre) varsa \displaystyle {R^2} değeri 0 ile 1 aralığında bir değer alır. Eğer modelde sabit terim yoksa\displaystyle {R^2} değeri 0’dan küçük veya 1’den büyük değerler alabilir.
  • \displaystyle {R^2} değerinin 1’e yakın olması modelin performansının iyi olduğunu, 0’a yakın olması ise modelin performansının kötü olduğunu ifade eder.
  • Modelin eğitiminde kullanılan veri sayısı (n) arttıkça \displaystyle {R^2} değeri artabilir.
  • Modele yeni bağımsız/açıklayıcı değişkenler (yani yeni X’ler) ilave edilirse, \displaystyle {R^2} değeri artabilir veya sabit kalabilir; ama kesinlikle azalmaz. İlave edilen değişkenlerin t-istatistiği 1’den büyükse \displaystyle {R^2} değeri artar; 1’e eşitse \displaystyle {R^2} değeri sabit kalır. Bu sebeple \displaystyle {R^2} istatistiği kullanılarak iki model arasında tercih yapılmak istenildiğinde, her iki modeldeki değişken sayısının aynı olmasına dikkat edilmelidir.
  • \displaystyle {R^2} istatistiğinin düşük çıkması, modelde tanımlama hatası yapılmış olabileceğine işaret eder. Tanımlama hatası modelde yer alması gereken değişkenlerin dışarıda bırakılmasından veya modelin matematiksel formunun yanlış seçilmesinden kaynaklanabilir.
  • Zaman serilerinde, açıklayıcı değişkenlerin (X’lerin) ortak trende sahip olması sebebiyle, yatay kesit verilerine göre \displaystyle {R^2} istatistiği daha yüksek çıkar. Literatürde \displaystyle {R^2} istatistiğinin zaman serileri için 0,90’dan, yatay kesit verilerinde ise 0,50’den büyük olması tercih edilir.
  • Genel doğrusal modelin varsayımları, özellkle de hata terimlerinin varyansının sabit ve kovaryansının sıfır olması gerektiği yönündeki varsayımları sağlanmadığında, \displaystyle {R^2} istatistiği sapmalı olur ve \displaystyle {R^2} istatistiğine göre değerlendirme yapmak doğru olmaz. Diğer bir ifadeyle modelde değişen varyans ve/veya otokorelasyon sorunu varsa \displaystyle {R^2} istatistiği güvenilir sonuçlar vermez.

Literatürde \displaystyle {R^2} istatistiği yerine, yukarıdaki sorunların bir kısmını telafi edebilen ve \displaystyle {\bar R^2} notasyonu ile ifade edilen düzeltilmiş (adjusted) \displaystyle {\bar R^2} istastiği kullanılır.

\displaystyle {\bar R^2} = 1 - \frac{{\left( {1 - {R^2}} \right)\left( {n - 1} \right)}}{{\left( {n - k - 1} \right)}}

n eğitimde kullanılan veri sayısını (gözlem sayısını), k ise sabit terim hariç modelde bulunan parametre sayısını ifade eder. Düzeltilmiş (adjusted) \displaystyle {\bar R^2} istastiğinin hesaplanmasında modelde bulunan sabit terim dahil edilmek istenirse, yukarıdaki denklem aşağıdaki şekilde ifade edilir.

\displaystyle {\bar R^2} = 1 - \frac{{\left( {1 - {R^2}} \right)\left( {n - 1} \right)}}{{\left( {n - k} \right)}}

Düzeltilmiş \displaystyle {\bar R^2} (\displaystyle R_{Adj}^2) İstatistiğinin Özellikleri:

  • Düzeltilmiş \displaystyle {\bar R^2} istatistiği genellikle \displaystyle {R^2} istatistiğinden küçüktür.
  • Modelde sabit terim (modelimizde \displaystyle {\beta _0} ile temsil edilen parametre) varsa, düzeltilmiş \displaystyle {\bar R^2} istatistiği de 0’dan küçük çıkabilir.
  • Modele yeni bağımsız/açıklayıcı değişkenler (yani yeni X’ler) ilave edilirse, düzeltilmiş \displaystyle {\bar R^2} değeri artabilir, azalabilir veya sabit kalabilir. İlave edilen değişkenlerin t-istatistiği 1’den büyükse düzeltilmiş \displaystyle {\bar R^2} değeri artar; 1’den küçükse düzeltilmiş \displaystyle {\bar R^2}azalır ve 1’e eşitse düzeltilmiş \displaystyle {\bar R^2} değeri sabit kalır.
  • İki model arasında kıyaslama yapılacaksa düzeltilmiş \displaystyle {\bar R^2} istatistiği kullanılır. Ancak düzeltilmiş \displaystyle {\bar R^2} istatistiği kullanılarak iki model arasında tercih yapılmak istenildiğinde, her iki modeldeki değişken sayısının aynı olmasına dikkat edilmelidir.
  • Genel doğrusal modelin varsayımları, özellkle de hata terimlerinin varyansının sabit ve kovaryansının sıfır olması gerektiği yönündeki varsayımları sağlanmadığında, düzeltilmiş \displaystyle {\bar R^2} istatistiği de sapmalı olur ve düzeltilmiş \displaystyle {\bar R^2} istatistiğine göre değerlendirme yapmak doğru olmaz. Diğer bir ifadeyle modelde değişen varyans ve/veya otokorelasyon sorunu varsa düzeltilmiş \displaystyle {\bar R^2} istatistiği de güvenilir sonuçlar vermez.

4.  Python ile Makine Öğrenmesi: Basit Doğrusal Regresyon

Aşağıdaki kodlarda bir satırın solunda yer “#” işareti o satırın derleyici tarafından okunmadığını ifade eder. Benzer şekilde ‘’’ ile ‘’’ işaretleri arasında yer alan satır veya satırlar da derleyici tarafından okunmaz. Bu işaretler yardımıyla kodların için açıklama/yorum eklenebilmektedir veya bir kod satırı veya bloğunun kolaylıkla kapatılıp açılması mümkün olmaktadır.

Aşağıdaki python algoritmasında verilerin csv uzantılı bir dosyadan okunması, verilerin dönüştürülmesi ve scatter grafiğinin çizilmesi, verilere ols/ekk uygulanması (verilerin regresyon tahminin yapılması),  parametrelerin elde edilmesi ve regresyon doğrusunun çizilmesi süreçleri yer almaktadır. İlave olarak array’lerden değerin scaler olarak çıkarılması ve ondalık hanelerin yuvarlanmasına ilişkin birkaç küçük noktaya da değinilmiştir. Algoritmanın son kısmında ise 15 yıllık deneyime sahip kişinin ücreti tahmin edilmiştir.

# -*- coding: utf-8 -*-
"""
Created on Sat Jun 18 17:09:56 2022

@author: ishakkutlu
"""

#%%
# import library
import numpy as np 
import pandas as pd
import matplotlib.pyplot as plt

# "C:\\" şeklinde çift yan çizgiye DİKKAT ediniz lütfen! Csv dosyamızın bulunduğu dizini tanımlıyoruz.
myTrainingFile = "C:\\Users\...\Salary_Data_Training.csv"
myLabelx ="YearsExperience"
myLabely ="Salary"

# import data (dataya df adını verdik.)
df = pd.read_csv(myTrainingFile, sep = ",") # csv dosyasının seperatorünü belirtiyoruz. Varsayılan olarak "," olur. 
#csv dosyasında seperator olarak ";" kullanılıyorsa "," işaretini ";" işareti ile değiştiriniz.

# convert data (regresyon ve grafikler için datayı kolaylıkla işlenebilir olan array formatına dönüştürüyoruz.)
x = np.array(df.loc[:,myLabelx]).reshape(-1,1)
y = np.array(df.loc[:,myLabely]).reshape(-1,1)

# plot data (veriler için scatter grafiğini çiziyoruz.)
plt.scatter(x=x,y=y)
plt.xlabel(myLabelx)
plt.ylabel(myLabely)
plt.show()

#%%
# sklearn library
from sklearn.linear_model import LinearRegression

# linear regression model
reg = LinearRegression(fit_intercept=True) # ols/ekk işlemcisini reg değişkenine ata.

reg.fit(x,y) #denkleme ols/ekk uygula

#%% prediction
b0 = reg.intercept_
print("b0: ",b0)   # doğrunun y eksenini kestiği nokta; intercept/sabit terim.
b1 = reg.coef_
print("b1: ",b1)   # eğim, X_1'in parametresi

#salary_tahmin = bo + b1*X_1
salary_tahmin = b0 + b1*15 # 15 yıllık deneyime sahip birisinin ücretinin ne kadar olacağını tahmin et.
print("15 yıllık deneyime sahip kişinin ücreti: ", salary_tahmin) # Birinci yöntem: 15 yıllık deneyime sahip birisinin ücretinin tahmini
print("15 yıllık deneyime sahip kişinin ücreti: ", reg.predict([[15]])) # İkinci yöntem: 15 yıllık deneyime sahip birisinin ücretinin tahmini

#İki boyutlu arraydan değerin scaler olarak dışarı çıkarılması. İki adet köşeli parantezin olması arrayın iki boyutlu olduğunu ifade eder.
print("15 yıllık deneyime sahip kişinin ücreti: ", salary_tahmin[0,0])
print("15 yıllık deneyime sahip kişinin ücreti: ", reg.predict([[15]])[0,0])
# Değerleri yuvarla
print("15 yıllık deneyime sahip kişinin ücreti: ", round(salary_tahmin[0,0], 2))
print("15 yıllık deneyime sahip kişinin ücreti: ", round(reg.predict([[15]])[0,0], 1))

# visualize line (train edilen X verileri ile regresyon doğrusunun çizimi)
plt.scatter(x,y)
y_tahmin = reg.predict(x)  # salary tahmini.
plt.plot(x, y_tahmin,color = "red")
plt.show()

Makalenin girişinde sunulan veri setine göre yukarıdaki algoritmanın sonuçları şu şekilde olmalıdır.

Aşağıdaki python algoritmasında ise yukarıdaki süreçlere ilave olarak determinasyon katsayısı olarak da bilinen R2 ve düzeltilmiş R2 istatistikleri hesaplanmıştır.

# -*- coding: utf-8 -*-
"""
Created on Sat Jun 18 17:09:56 2022

@author: ishakkutlu
"""

#%%
# import library
import numpy as np 
import pandas as pd
import matplotlib.pyplot as plt

# "C:\\" şeklinde çift yan çizgiye DİKKAT ediniz lütfen! Csv dosyamızın bulunduğu dizini tanımlıyoruz.
myTrainingFile = "C:\\Users\...\Salary_Data_Training.csv"
myLabelx ="YearsExperience"
myLabely ="Salary"

# import data (dataya df adını verdik.)
df = pd.read_csv(myTrainingFile, sep = ",") # csv dosyasının seperatorünü belirtiyoruz. Varsayılan olarak "," olur. 
#csv dosyasında seperator olarak ";" kullanılıyorsa "," işaretini ";" işareti ile değiştiriniz.

# convert data (regresyon ve grafikler için datayı kolaylıkla işlenebilir olan array formatına dönüştürüyoruz.)
x = np.array(df.loc[:,myLabelx]).reshape(-1,1)
y = np.array(df.loc[:,myLabely]).reshape(-1,1)

# plot data (veriler için scatter grafiğini çiziyoruz.)
plt.scatter(x=x,y=y)
plt.xlabel(myLabelx)
plt.ylabel(myLabely)
plt.show()

#%%
# sklearn library
from sklearn.linear_model import LinearRegression

# linear regression model
reg = LinearRegression(fit_intercept=True) # ols/ekk işlemcisini reg değişkenine ata.

reg.fit(x,y) #denkleme ols/ekk uygula

y_tahmin = reg.predict(x)  # salary tahmini.

#%%
from sklearn.metrics import r2_score   

# Birinci yol; from sklearn.linear_model import LinearRegression kütüphanesi ile
# R^2 
r2=reg.score(x, y)
print("R^2 score: ",r2)
# Adjusted R-squared
adj_r2 = 1 - (1-r2)*(len(y)-1)/(len(y)-(x.shape[1]+1)) # sabit terim dahil edildi.
print("Adjusted R^2 score: ",adj_r2)

# İkinci yol; from sklearn.metrics import r2_score kütüphanesi ile
# R^2 
print("R^2 score: ", r2_score(y,y_tahmin))
#display adjusted R-squared
adj_r2 = 1 - (1-r2_score(y,y_tahmin))*(len(y)-1)/(len(y)-x.shape[1]) # sabit terim dahil edilmedi.
print("Adjusted R^2 score: ", adj_r2)

# visualize line (train edilen X verileri ile regresyon doğrusunun çizimi)
plt.scatter(x,y)
plt.plot(x, y_tahmin,color = "red")
plt.show()

Sonuç aşağıdaki ekran görüntüsünde temsil edilmiştir.

Yukarıdaki süreçlere ilave olarak aşağıdaki algoritmada eğitim seti ile test setinin ayrıştırılmasına, sonuçların analiz edilmesine ve yukarıdaki algoritmalarda yer verilmeyen görselleştirmeye ve veri dönüştürmeye ilişkin birkaç küçük detayı bulabilirsiniz. Ayrıca aşağıdaki algoritmada regresyon tahminleri ile r2 istatistikleri bir arada sunulmuştur.

# -*- coding: utf-8 -*-
"""
Created on Sat Jun 18 17:09:56 2022

@author: ishakkutlu
"""

#%%
import numpy as np 
import pandas as pd
import matplotlib.pyplot as plt

#"C:\\" şeklinde çift yan çizgiye DİKKAT ediniz lütfen! Csv dosyamızın bulunduğu dizini tanımlıyoruz.
myTrainingFile = "C:\\Users\...\Salary_Data_Training.csv"
myTestFile = "C:\\Users\izem\Desktop\Machine Learning Tutorial\Linear Regression -Basic\Salary_Data_Test.csv"
myLabelx ="YearsExperience"
myLabely ="Salary"
# Sadece yukarıdaki değişkenleri uyarlamanız yeterli olacaktır.
# Veri setinizi eğitmek için kodlarda başka herhangi bir değişiklik yapmanıza gerek yoktur.
# Modelin Y=b0+b1X1+e olduğu ve verilerin, seperatorü "," olan bir csv dosyasından çekileceği varsayılmıştır.

myTrainingData = pd.read_csv(myTrainingFile)
myTestData= pd.read_csv(myTestFile)

#print(plt.style.available) # Grafik türlerini konsola yazdır.
plt.style.use('default') # Default bir grafik türü kullanıldı.
#plt.style.use('seaborn-notebook') # Dilerseniz bunu veya print edilen isimlerden herhangi birini seçebilirsiniz.

x = np.array(myTrainingData.loc[:,myLabelx]).reshape(-1,1)
y = np.array(myTrainingData.loc[:,myLabely]).reshape(-1,1)
xTest = np.array(myTestData.loc[:,myLabelx]).reshape(-1,1)
yTest = np.array(myTestData.loc[:,myLabely]).reshape(-1,1)
# Scatter
plt.figure(figsize=[5,5]) # Grafiğin dikey ve yatay boyutunu verir.
'''
plt.scatter(x=x,y=y, color='red', alpha=0.5)
plt.xlabel(myLabelx)
plt.ylabel(myLabely)
plt.show() 
'''
# Veri setinin scatter garafiğini ayrıca istiyorsanız, yukarıdaki ''' işaretlerini siliniz.

#%%
# LinearRegression
from sklearn.linear_model import LinearRegression
reg = LinearRegression(fit_intercept=True)

# Fit
reg.fit(x,y)

# Predict space
predict_space=x
# Predict
predicted = reg.predict(predict_space)
#print(predict_space)
#print(predicted)

b0 = reg.intercept_
b0 = b0[0] # Değeri 1 boyutlu arraydan çıkar. 
#print("b0_: ",b0)   # y eksenini kestigi nokta intercept/sabit terim
b1 = reg.coef_
b1 = b1[0,0] # Değeri 2 boyutlu arraydan çıkar.
#print("b1: ",b1)   # slope/eğim

#b0 ve b1 değerlerini "denklem" isimli metin içinde kullanmak için stringe çevir
b0_str = str(b0)
b1_str = str(b1)
denklem="(Y_hat)_i= " + b0_str + " + " + b1_str + "(X_1)_i"
print(denklem)

# R^2 
r2_score=reg.score(x, y)
print('R^2 score: ',r2_score)
# Adjusted R-squared
adj_r2 = 1 - (1-r2_score)*(len(y)-1)/(len(y)-(x.shape[1]+1))
print('Adjusted R^2 score: ',adj_r2)

# Plot regression line and scatter
plt.plot(predict_space, predicted, color='blue', linewidth=2)
plt.scatter(x=x,y=y, color='red', alpha=0.5, edgecolors='none') #alpha noktaların saydamlık derecesini verir. 1 değeri tam opak, 0 değeri tam saydamdır. edgecolors='none' noktaların etrafında kenarlık olmayacağını ifade eder.
plt.xlabel(myLabelx)
plt.ylabel(myLabely)
plt.show()

#%%
# Predict space for test
predict_test=xTest
# Predict
predicted_test = reg.predict(predict_test)
# Gerçek ile tahmin Y değerleri
print(str(yTest) +"\n" + str(predicted_test))

print("Tahmin edilen test setinin gerçek Y değerlerinden sapmaları:")
Fark=yTest-predicted_test
#İki boyutlu Fark arrayının değerlerini arraydan dışarı çıkar.
for i in range(len(xTest)):
  print (Fark[i,0])

# Plot regression line and scatter
plt.figure(figsize=[5,5]) # Grafiğin dikey ve yatay boyutunu verir.
plt.plot(predict_test, predicted_test, color='blue', linewidth=2)
plt.scatter(x=xTest,y=yTest, color='green', alpha=0.5, edgecolors='none') #alpha noktaların saydamlık derecesini verir. 1 değeri tam opak, 0 değeri tam saydamdır. edgecolors='none' noktaların etrafında kenarlık olmayacağını ifade eder.
plt.xlabel(myLabelx)
plt.ylabel(myLabely)
plt.show()

Sonuca ilişkin ekran görüntüleri aşağıdadır.

Aşağıdaki ekran görüntüsü test setinin dağılımını temsil etmektedir.

Yorum Yap

İshak Kutlu

Veri & Otomasyon Uzmanı

Kurumsal iş akışlarını düzenleyen veri odaklı otomasyon sistemleri ve makine öğrenmesi tabanlı çözümler geliştirir. Gerçek operasyonel süreçler için ölçeklenebilir ve izlenebilir yapılar tasarlar.

YouTube   YouTube   YouTube   YouTube