Başarabilirsin: Makine Öğrenmesi’ne Giriş 2—Feature, Label ve Lineer Regresyon

Fethi Tekyaygil
Deep Learning Türkiye
8 min readMay 8, 2020

Merhabalar,
Korona virüsünün hayatımızda olduğu bu dönemde umarım günleriniz verimli geçiyordur. İçinizdeki koalaya meydan okuman adına hazırladığım bu yazı serisinin 2.yazısında Feature, Label ve Lineer Regresyon’dan bahsedeceğim. Hazırsanız kemerlerinizi bağlayın, yolculuk başlıyor :)
Şimdiden hepinize iyi öğrenmeler :)

Kullanılan Araçlar:

  1. Spyder IDE
  2. Keras
  3. Numpy
  4. Pandas
  5. Python
  6. Matplotlib
  7. Matematik
  8. Akıl fikir :)

Denetimli Makine Öğrenmesi Çalışma Prensibi

Denetimli Makine Öğrenmesi Çalışma Prensibi Figürü

Makine Öğrenmesi modelimiz veri setimizdeki verileri alır, onu kendi öğrenme algoritmasına sokar ve sonucunda bize bir hipotez fonksiyonu döner. Bütün tahminlerimiz ve model görselleştirmeleri bu hipotez fonksiyonu sayesinde yapılabilmektedir. Peki nedir bu hipotez fonksiyonu?
Hipotez fonksiyonu modelimizin bize döndürdüğü matematiksel denklemdir. Bu konu yazının ilerisinde Lineer Model ve Lineer Regresyon konusunda detaylandırılacaktır.

Bu denklemimizde ilgili kısımlara feature değerlerini verdiğimizde y değerini yani tahmin değerini bulabiliyoruz.

Örnek Senaryo

Elinizde California’daki ev bilgilerini tutan bir veri setiniz olduğunu düşünün. Veri seti csv, xlsx veya herhangi bir formatta olabilir. Biz bu yazıda https://download.mlcc.google.com/mledu-datasets/california_housing_train.csv linkindeki veri setini kullanıyor olacağız.

Pratik Kısım — Verisetini kodumuza dahil etmek:

Spyder’da veri seti ile çalışmak isterseniz önce pandas kütüphanesini kullanarak veri setini bir değişkene atmalısınız. Veri setini bir çok formatta okuyabilen pandas’ı kullanarak aşağıdaki gibi veriseti değişkenimize okuduğumuz bu veriseti değerini bir Data Frame nesnesi olarak atıyoruz.

"""Pandas kütüphanesini kullanabilmek için .py dosyamıza import ediyoruz"""
import pandas as pd
"""csv türünde olan veri setimizi link üzerinden Data Frame nesnesi olarak okuyup veriseti_df değişkenine atıyoruz."""
veriseti_df = pd.read_csv(filepath_or_buffer="https://download.mlcc.google.com/mledu-datasets/california_housing_train.csv")

Spyder IDE’sinin en iyi bulduğum taraflarından biri Variable Explorer isimli penceresi. Bu pencerede .py dosyanızdaki tüm değişkenler hakkında isim, tür, boyut ve değer gibi bilgiler tutulur. Örnek pencere aşağıdaki gibidir:

Veri setimiz aşağıdaki gibi görünür:

Bu veri setinde değerini tahmin etmek istediğimiz kolon değeri median_house_values olsun. Modelimiz bu veri setindeki diğer kolon değerlerini girdi olarak alır ve bu değerler üzerinden tahmini yapar. Peki hangi kolon(lar) değerini kullanarak median_house_value değerini en iyi şekilde tahmin edebiliriz?
Burada kullanacağımız kolonlar problemimizin çeşidine göre değişse de pandas kütüphanesi yardımıyla kolonların birbirileri ile korelasyon ilişki oranlarını görebiliriz. Böylelikle hangi kolonları girdi olarak verirsek daha yüksek performanslı bir median_house_values değeri elde edebiliriz çıkarımında bulunabiliriz.

Korelasyon nedir?

İki değişken arasındaki doğrusal ilişkinin yönü ve gücünü temsil eden değerdir.
Korelasyon değerimiz -1 ve 1 arasında hesaplanır ve mutlak değer ne kadar büyükse bu iki değişken o kadar birbiriyle ilişkilidir diyebiliriz. Buradaki pozitifilik iki değişken arasında pozitif yönlü ilişki (doğru orantı), negatiflik iki değişken arasında negatif yönlü ilişki (ters orantı) ve 0 değeri ise hiç ilişki olmadığı anlamına gelmektedir.

acikders.ankara.edu.tr sitesinden alınmıştır.

Pratik Kısım — Verisetimizdeki Değişkenlerimiz Arasındaki Korelasyonu Görebilmek:

Kodumuza dahil ettiğimiz veri seti içerisindeki kolon değerleri arasındaki korelasyonu görebilmek için data frame nesnesinin corr metodunu kullanabiliriz.

"""veri setimizdeki korelasyon değerlerini correlations isimli değişkene atadık."""
correlations=veriseti_df.corr()

Bu kod parçası çalıştığında correlations değişkeninin içini variable explorer penceresinden çift tıkayıp açtığımızda bizi aşağıdaki görüntü karşılar:

Bu tabloda index kolonumuz korelasyonda baz alınacak kolon isimlerini tutar. Diğer kolonlar ise veri setimizdeki kolonlardır ve index kolonunda ismi yazan kolon değerleriyle aralarındaki korelasyonbu tablo sayesinde daha da anlaşılır olur. Örneğin tahminini gerçekleştirmek istediğimiz median_house_values kolonunun housing_median_age kolonuya korelasyonu 0.106758'dir (pozitif yönlü, doğru orantılı) ancak median_income kolonuyla korelasyonu 0.691871'dir (pozitif yönlü doğru orantılıdır.) Burada median_house_values ve median_income kolonlarının korelasyon değerlerinin 1'e oldukça yakın olduğunu görmekteyiz. Yani modelimizin tahminlerini median_income kolonuna göre yapmasını istersek, housing_median_age kolonuna göre yapmasını isteyeceğimizden daha performanslı sonuç elde edeceğiz.

Burada dikkatinizi çekmek istediğim bir nokta var. Veri setindeki özniteliklerinizi etiket değerinizle daha korele hale getirmenin yolları vardır. Bunlar özniteliğin tipine göre değişiklik gösterse de burada bahsetmek istediğim yöntem sentetik öznitelik yöntemidir.

Feature (Öznitelik) Nedir?

Öznitelik, Makine Öğrenmesi modelimizin tahmin yapabilmesi için verdiğimiz girdi değerleridir. Yukarıdaki senaryomuzda korelasyon incelemesi sonucunda kullanmaya kadar verdiğimiz median_income değerimiz bir özniteliktir. Bir tahmin yapılırken birden fazla öznitelik kullanılabilir, örneğin total_rooms ve housing_median_age kolonlarını kullanarak tahmin gerçekleştirmek isteseydik bu senaryomuzda iki tane özniteliğimiz olacaktı.

Verisetimizde hangi öznitelikleri kullanacağımız bize kalmıştır. Burada yapmamız gereken, label ile ilişkisi yüksek olan, olabildiğince az sayıda kolonu öznitelik olarak seçmek. Bu konuya detaylıca ileriki yazılarımda değineceğim. Bu seçilecek özniteliklerin neye göre seçileceği konusunda yazdığım yazıya buradan ulaşabilirsiniz.

Bazı durumlarda veri setimizde bulunan öznitelikler tahmini gerçekleştirmek için yeterli olmayabilir. Bu tür durumlarda ise başvurduğumuz yöntemlerden biri veri setimizdeki özniteliklerimizden yeni bir sentetik öznitelik oluşturmaktır.
Sentetik öznitelik,
veri setindeki öznitelikler arasında bulunmayan, ancak bunlardan bir veya daha fazlasından oluşturulan bir özniteliktir. Örneğin öznitelik korelasyonlarınıza baktığınızda total_rooms ve population özniteliklerinizin kullanışsız olduğunu görebilirsiniz. Peki ya kişi başına oda değerini tutacak yeni bir feature oluşturmak isteseniz? Sizce bu ev fiyatı tahmininde median_house_value kolonuyla iyi bir korele değere sahip olur mu?
Deneyelim!

Pratik Kısım — Verisetimizdeki Özniteliklerimizden Yeni Sentetik Veri Oluşturma:

Bu kısımda elimizdeki veri setindeki özniteliklerden elde edeceğimiz yeni sentetik veriyi dataframe nesnemiz içerisinde yeni kolona atayacağız.

#dataframe nesnemize "room_per_person" kolonu açıp nesnemiz içindeki total_rooms/population değerlerini yeni kolona atıyoruz.veriseti_df["rooms_per_person"] = veriseti_df["total_rooms"]/veriseti_df["population"]"""yeni eklenen kolon değerini de içeren verisetimizin korelasyon değerlerine tekrar bakalım"""
correlations=veriseti_df.corr()

Yukarıdaki kodu çalıştırdığımızda correlations değişkeninin değeri artık yeni korelasyon değerlerine eşit olmuş oldu:

Tabloya dikkat ederseniz yeni oluşturduğumuz sentetik özniteliğin (rooms_per_person) tahmin etmek istediğimiz label değeri olan median_house_value ile korelasyonu pek de iyi değil. (0.206969)

Bu şu demektir ki sentetik veri oluşturmak her seferinde doğru sonuç vermeyi garantileyemez. Sentetik veriyi oluştururken hangi öznitelikleri hangi işleme (çarpma, bölme vs) sokacağınız da verinin daha da anlamlaşması açısından önem arz eder.

Label (Etiket) Nedir?

Etiket, veri setimizde tahmin edilmesini istediğimiz kolon değeridir. Yukarıdaki senaryomuzda median_house_value kolonu bizim label değerimizdir.

Lineer Regresyon Nedir?

İşin bu kısmından sonra matematik ile biraz iç içe olacağız diyebiliriz. Ama gözünüz korkmasın öğrendikçe kolay olduğunu anlayacaksınız :)
Öncelikle Lineer Regresyon nedir onunla başlayalım.
Regresyon probleminde modelimiz, veri setimizdeki verilerin dağılım grafiğine dökülmüş haline en optimum doğruyu yerleştirip tahmilerini öyle gerçekleştirir. Daha iyi bir tanım yapmak gerekirse, Lineer Regresyon, bir doğrusal modelin ham çıktısının bir regresyon modelinde gerçek tahmin olarak kullanılmasıdır.

Türkçesini hep beraber keşfedelim.

Lineerliği gösterebilmek adına veri setimizdeki ilk 90 örneği alıp bunları dağılım grafiğine döktüm. Normalde modelimiz eğitim setindeki her veriyi dağılım grafiğine döker ancak ben bu aşamada işleri daha da basitleştirmek adına ilk 90 veriyi alacağım.

Burada kullanacağımız median_income özniteliğimiz x eksenimizin değeri, median_house_value label ise y ekseni değerimiz olacak. Hadi gelin bu grafiğin neye benzeyeceğine hep beraber bakalım!

Pratik Kısım —Öznitelik ve Etiket Verilerini Grafikleştirme:

Kullanacağımız öznitelik ve etiket (şu aşamada bir tane özniteliğimiz olduğu varsayılıyor.) değerlerini iki boyutlu dağılım grafiğine dökmek için matplotlib kütüphanesini kullanacağız. Bunun için önce kodumuza bu kütüphane içinde kullanacağımız pyplot nesnesini import etmemiz lazım:

#Matplotlib içindeki pyplot nesnesini import ettik
import matplotlib.pyplot as plt
#grafiğimizin x ekseninde yazacak açıklama değerini veriyoruz
plt.xlabel("median income")
#grafiğimizin y ekseninde yazacak açıklama değerini veriyoruz
plt.ylabel("median house price")
"""Dağılım grafiğimizde veri setimizin ilk 90 satırının dağılımını göstereceğiz. Bu standart değildir size lineerliği daha iyi anlatabilmek için bu sayıyı seçtim modelimiz normal şartlarda eğitim veri setindeki her değeri alır."""
veriseti_df_90 = veriseti_df.sample(n=90)
"""Grafikte x ve y ekseninde yer almasını istediğimiz kolon değerlerini plt nesnesinin scatter metoduna yolluyoruz. Bu metod bize dağılım grafiğini oluşturacak olan metottur."""
plt.scatter(veriseti_df_90["median_income"], veriseti_df_90["median_house_value"])
#Grafiğimizi konsolda gösteriyoruz
plt.show()
Veri setimizdeki ilk 90 örnek için median_income ve median_house_price değerleri dağılım grafiği

Bu grafiğin iki boyutlu olduğunu farkettiniz değil mi? Bir boyutu median_income (x), diğer boyutu da median_house price’dır. (y)
Peki tüm veri setindeki verileri grafiğe dökmek isteseydik nasıl bir görüntü elde edecektik?

O zaman da ilk 90 veri yerine veri setinin kendisini plt.scatter nesnesine parametre vermemiz gerekecekti:

"""Veri setimizdeki tüm değerlerin dağılımını grafikte gösteriyoruz."""
plt.scatter(veriseti_df["median_income"], veriseti_df["median_house_value"])
plt.show()
Tüm veri setimiz için median_income ve median_house_price değerleri dağılım grafiği

Verilerimizin dağılım grafiğini gördüğümüze göre modelimiz bu dağılım bilgisini kullanarak nasıl tahminlerde bulunur ona bakalım.
İlk 90 örnekli veri seti dağılımımızı ele alalım.

Veri setimizdeki ilk 90 örnek için median_income ve median_house_price değerleri dağılım grafiği

Burada deneyebileceğimiz ilk şey bu grafiğe lineer bir çizgi koymak. Şimdi paint yeteneklerimle çizgiyi koyalım:

Bu kırmızı çizgi modelimizin oluşturacağı lineer (doğrusal) bir doğrudur. İyi de nasıl dediğinizi duyar gibiyim. Hadi sizi şöyle alalım:

Denetimli Makine Öğrenmesi Çalışma Prensibi Figürüne baktığınızda modelimizin bize bir hipotez fonksiyonu döndürdüğünü biliyoruz. Bu hipotez fonksiyonu lineer ve non-lineer olabilir.

Lineer: Girdinin değişimi ile çıktının değişimi orantılıdır. Bu durumda özniteliğimizdeki değişim ile etiket değerimizin değişimi doğru veya ters orantılı olmalıdır.

Non-lineer: Girdinin değişimi ile çıktının değişimi orantılı değildir. Bu durumda özniteliğimizdeki değişim ile etiket değerimizin değişimi doğru veya ters orantılı olamayacaktır.

Modelimiz bu eğitim verisindeki dağılımı gözlemler ve buna en optimum koyulabilecek doğrunun fonksyionunu oluşturur. Bu fonksyionu oluşturma detaylarını sonraki yazımda anlatacağım için şimdilik sadece ne yaptığını bilseniz yeterli. Matematikte lineer bir doğrunun formülü aşağıdaki gibidir ve modelimiz lineer bir problemde bize böyle bir hipotez fonksiyonu döndürür:

İki formül olduğunu farkettiniz değil mi? Bunlardan ilki Basit Lineer Regresyon, diğeri de Çoklu Lineer Regresyon. Aralarındaki farkı görebilmek için basit doğrusal regresyon formülünü inceleyelim.

y=b0+b1x1

Burada;

y = Modelimizin gerçekleştireceği tahmin değeri (prediction)

b0 = Doğrumuzun orijin (0,0) noktasına olan uzaklığı (bias)

b1 = x değişkenimizin katsayısı (weight)

x = Tahmini gerçekleştirebilmek için modele verilecek öznitelik değeri (feature)

Buna göre;

Eğer modelimize birden fazla öznitelik değeri verip tahmin yapılmasını istersek çoklu lineer regresyon, bir öznitelik değeri vererek tahmin yapılmasını istersek ise basit lineer regresyon olur.

Her şey güzel tamam da grafikteki doğru nasıl oluştu? Oluşan hipotez fonksiyonumuzun aşağıdaki gibi olduğunu düşünelim:

y=1+10x

Bu durumda x median_income değerimiz (özniteliğimiz), y ise median_house_value değerimiz (etiketimiz) olsun. Değeri 10 olan bir median_income değerimiz için modelimiz median_house_value değerini 101 tahmin edecektir. (x=10; y=1+10.10=101)

Hipotez fonksiyonumuzu grafikleştirmek istersek şu şekilde bir grafik elde ederiz:

Gördünüz mü aslında çok kolay!

Modelimiz gerçek değere en yakın tahmin değerini bulabilmek için hipotez fonksiyonunu hesaplamaktadır. Özniteliğin katsayısı da (weight) hesaplar. Öznitelik değer(ler)ini ilgili x değişkenlerine atayıp tahminlerini gerçekleştirmiş olur.

KAPANIŞ

Bu yazımda Öznitelik, Etiket, Lineer kavramları ile modelimizin tahminde bulunma sürecini açıklamaya çalıştım. Bir sonraki yazımda modelimizi eğitmeye başlayacağız. Böylece modelimiz bize bir hipotez fonksiyonu üretecek, üretilen bu hipotez fonksiyonunu da dağılım grafiğine yerleştirip inceleyebileceğiz. Umarım faydalı ve öğretici bir yazı olmuştur. Eğer yazının bu kısmına kadar geldiyseniz tebrikler ve teşekkürler :) Kodların son haline buradan ulaşabilirisiniz.

Herkese iyi ve sağlıklı haftalar diliyorum. Daha fazla yazı için lütfen takipte kalın :)

-Fethi Tekyaygil

--

--

Fethi Tekyaygil
Deep Learning Türkiye

.NET Core Backend & Google Certified Tensorflow Developer — Flutter & Solidity Padawan — Animal Person