Python ile Veri Ön İşleme – Data Preprocessing

Python ile veri ön işleme

Makine öğrenimi ve yapay zeka dünyayı ele geçirmeye hız kesmeden devam ediyor. Bizler de çağımıza ayak uydurmak adına keyifle yaptığımız işimize kaldığımız yerden devam etmekteyiz.

Bu keyifli yolculuğa gelin hep birlikte yavaş yavaş bir adım atalım. Tıpkı yeni doğan bir bebeğin zamanla büyüyerek ilk adımlarını atmaya çalışması gibi 👶

Biliyorsunuz ki son zamanlarda veri açısından Kaggle kaçınılmaz bir fırsat. Üzerinde çalıştığım bir çok veri setini Kaggle’ dan ücretsiz bir şekilde ediniyorum. Sizlere de tavsiye ederim.

Bunun yanı sıra Kaggle içerisinde faydalı bulduğum çoğu yarışmaya da katılım sağlayarak kendinizi de zevkle geliştirebilirsiniz. Aynı zamanda seçilen veri seti üzerinde çalışan diğer bireyler tarafından da bilgiler edinebilirsiniz. 

Veriden sürekli bahsediyoruz ancak bu verileri makine öğreniminde nasıl kullanabiliriz?

Herhangi bir veri için makinelerin yaptığı anlam çıkarma işini bizlerin yapabilmesi demek o verinin insanlar tarafından anlamlandırılmaya çalışılması demektir. Aslında demek istediğim durumu ufak bir örneklendirme ile daha detaylandıralım.

Günümüzde nesne tespiti neredeyse artık her yerde! Alışveriş merkezleri, telefon ve bilgisayar gibi akıllı cihazlar, kameralar ve daha nicesi.. 🛒🤳 Aklınıza gelebilecek bir çok teknolojik cihaz! 

Hiç düşündünüz mü? Facebook platformunda uzun zamandır eklediğiniz fotoğraflarda siz etiketleme yapmadan Facebook bu işlemi sizin yerinize otomatik olarak yapabiliyor. İşte burada durumu nesne tanıma hatta AI ele almaktadır. Makinelerin çözümlediği bu işlemi bizler gözle analitik olarak incelediğimizde belki bazı verilerin spesifik özelliklerinden çıkarım yapabiliriz. Dahası için tabiki bu verilerin işletilmesi gereklidir 🌀

Çalıştığım bir projede görüntü verilerini işlerken içerisinde NaN (Not a Number) ve belirsiz sonuçlarla karşılaştım. Bunun sonucunda aslında bunun bir problem yaratmadığını yeni bir keşfe çıkmam gerektiğini fark ettim 🚀

Yazımın ilerleyen safhalarında yukarıda gördüğünüz bu anlamsız kelimeleri hızlıca anlamlandırıp yolumuza devam etmemizi sağlayacağım.

Programlama dili olarak Python ve platform olarak ise Jupyter’ i kullanacağım 🐍. Haydi, şu keşfe birlikte çıkalım!

[gdlr_core_space height=”30px”]

İlk adım olarak Python’a ait olan Pandas🐼 ve Numpy📊 kütüphanelerini import edelim. Bu kütüphaneleri incelemenizi tavsiye ederim çünkü ileride bu alanda çalışacak olanlar için kaçınılmaz bir fırsat.

Pandas, Python’ ın veri bilimi alanına ithafen yazılmış oldukça güçlü bir yazılım kütüphanesidir. Genellikle verinin yapısını, işlenişini incelemek adına bir data frame veya sayısal tablolar diyebileceğimiz yapıları oluşturarak işlemlerimizi kolaylaştırmamızı sağlar.

[gdlr_core_space height=”30px”]

Yukarıdaki şekilde kullandığım veri setine Kaggle aracılığıyla ücretsiz olarak linkten erişim sağlayabilirsiniz. Bu veri setini seçmemin sebebi içerisinde NaN verilerin de yer almasıdır. Bu şekilde verileri temizleyerek bir ön işleme gerçekleştirebiliriz. 

Pandas kütüphanesini import ederken pd kısaltması ile tanımladığımız için kodun her alanında artık pd ile çağırabilmemiz mümkündür. Üzerinde çalışacağım veri seti bir CSV dosyası olduğu için read_csv( ) metodu ile veriyi elde ettik.

🚩 df.info( ) metodu ile çalışılan veri seti içerisindeki dtype olarak bilinen veri tipleri ve kullanılan bellek hakkında bilgi verir.

🚩 df.describe( ) metodu ile istatistiksel sonuçların hesaplanması sağlanır.

🌟 ML projelerinde doğruluk oranındaki düşüşlerde çoğunlukla karşılaşılan problemlerden birisi de kayıp (eksik) veya yanlış girilmiş verilerin temizlenmemesinden kaynaklanmaktadır.

 Yukarıda yazdığımız df.isna( ) metodu sayesinde NaN (Not a number) olarak belirtilen verilerin ileride bir problem teşkil etmemesi için öncelikle tespit etmiş olduk.

Yukarıda gördüğünüz görseldeki True ve False değerlerine dikkatinizi çekmek isterim. NaN değerlerin olduğu satırlarda sonuç True, olmayan sütunlarda ise False olarak dönüş yapmaktadır.

Toplamda her sütun (özellik) için ne kadar NaN değer yer aldığını görmek istiyor iseniz sum( ) metodu ile sonucu ekranda görebilmeniz mümkündür.

Örneğin 13. satırdaki output incelendiğinde Date adlı sütunda NaN değerin hiç var olmadığını ancak down adlı sütunda ise 61154 adet değerin yer aldığını görmekteyiz.

Bu satırlar tam anlamıyla sayısal değerlere denk gelmediği için ise istediğimiz sonuca ulaşmakta bizi etkilemektedir. Bu değerlerin ortadan kaldırılabilmesi için dropna( ) metodunu kullanacağız.

🍂Pandas’ın official sitesinde de bulabileceğiniz dropna() syntax yapısını birlikte inceleyelim. Öncelikle axis parametresi ile NaN verilerin silineceği bölgenin yani eksenin seçilmesi gereklidir.

sxis=0 olduğunda X ekseni (satır), axis=1 olduğunda ise Y ekseni (sütun) olarak kabul edilecektir.

how parametresi ile any değeri seçildiğinde o alanda herhangi bir NaN değer dahi mevcut ise o alan otomatik olarak silinecektir.

Ancak any yerine all seçilirse seçili bölgedeki tüm değerlerin NaN olması istenmektedir. thresh parametresi ise sizin bir eşik değer seçerek o eşik değerin üzerine çıktığında otomatik olarak değerlerin kaldırılacağı parametredir.

Yukarıda görülen kod satırında thresh parametresi bizim için bir eşik değeridir. Yani 100 adet NAN verinin üzerinde değer var ise o sütun(axis=1) silinecektir.

🚩 df.drop( ) metodu ile ise spesifik olarak silmek istediğiniz sütun veya satırları özelleştirerek kaldırabilmeniz mümkündür. 

Çok fazla NaN değer barındıran bir sütunu tamamen ortadan kaldırmak istiyorum. Çünkü o sütunun bana sonuç verirken çok bir yardımı dokunmayacaktır.

Bu sebeple etiket olarak silmek istediğim sütun adını ve eksenini belirterek ortadan kaldırabiliyoruz. Bu konu ile ilgili daha fazla detaya ulaşmak isterseniz linkten erişebilirsiniz.

Silinmek istenen sütunun hala var olup olmadığını görmek istersek turuncu mürekkep ile belirttiğim sütunun bir sonraki görselde yer almadığını rahatlıkla gözlemleyebilirsiniz.

Eksik Değerlerin Düzenlenmesi

🍂 Scikit-learn, Python programlama dilinde yazılmış bir makine öğrenme kütüphanesidir. SimpleImputer eksik değerlerin dönüştürülmesini sağlayan sklearn kütüphanesinden kullandığımız bir dönüştürücü modüldür.

⬅️ Yanda verilen görselde SimpleImputer modülünün syntax yapısı yer almaktadır. Gerekli parametreler verilerek eksik verileri düzenleyebilmemiz mümkündür.

missing_values parametresi ile dönüştürülmek istenen veriler belirlenmektedir. Biz NaN değerlerin seçilmesini istediğimiz için Numpy kütüphanesinden NaN değerleri seçebilmekteyiz. Daha sonraki parametre olan strategy parametresi sırasında ise 4 adet yer alan strateji türünden birisini seçerek hangi yönteme göre dönüştürüleceğine karar verilmektedir. Aşağıda bu stratejilere yer verilmektedir:

🔓 “mean”  stratejisi, her sütun boyunca ortalama kullanılarak eksik değerlerin değiştirilmesini sağlar. Yalnızca sayısal verilerle kullanılabilir.

🔓 “median” stratejisi, her sütun boyunca medyan kullanılarak eksik değerlerin değiştirilmesini sağlar. Yalnızca sayısal verilerle kullanılabilir.

🔓 “most_frequent” stratejisi , her sütun boyunca en sık kullanılan değeri kullanılarak eksik değerlerin değiştirilmesini sağlar. String veya sayısal verilerle kullanılabilir.

🔓 “constant” stratejisi, eksik değerleri fill_value ile değiştirin. String veya sayısal verilerle kullanılabilir.

Veri seti içerisinde NaN olan değerleri daha doğru tabirle kayıp verileri dönüştürürken SimpleImputer kullanacağız. yacEPA sütununda olduğu gibi tamamını kaldırmaktansa NaN değerlikli sütunların uygun değerlerle doldurulması her zaman daha uygun bulunmuştur. Bu sebeple down sütununu seçerek mean(ortalama) stratejisi ile eksik verileri dolduracağız. Haydi birlikte bunu başaralım🏋🏻‍♂️

⬇️Aşağıda yer alan görseldeki down sütununda yer alan NaN değerler sütundaki ortalama stratejisine göre doldurulacaktır.

Eksik Verilerin Yer Aldığı Sütun Görünümü

Eksik Verilerin Dönüştürüldükten Sonraki Durumu

Hedeflediğimiz adımlara yavaş yavaş yaklaşıyoruz. Diğer veri ön işleme adımlarına bir sonraki yazımda değineceğim. Bir başka yazımda buluşmak dileğiyle ✨

Diğer yazılarıma buradan ulaşabilirsiniz.

REFERANSLAR

Leave a Reply

Your email address will not be published. Required fields are marked *