Takip et

Veri Temizliği: İlk Makine Öğrenimi Projemden Öğrendiklerim

İlk makine öğrenimi projenize başlarken veri temizliğinin ne kadar kritik olduğunu merak mı ediyorsunuz?

Veri Temizliği: İlk Makine Öğrenimi Projemden Öğrendiklerim

İlk makine öğrenimi projenize başlarken veri temizliğinin ne kadar kritik olduğunu merak mı ediyorsunuz? Model eğitimi öncesi veri kalitesinin, projenizin başarısını nasıl doğrudan etkilediğini ve bu süreçte karşılaşabileceğiniz temel zorlukları bu makalede keşfedeceksiniz.

İlk Makine Öğrenimi Projenizde Neden Veri Temizliği Bu Kadar Önemli?

Makine öğrenimi dünyasına adım attığınızda, genellikle algoritmaların büyülü dünyasına dalmak ve karmaşık modeller inşa etmek istersiniz. Ancak benim ilk projemde öğrendiğim en değerli ders, bu büyünün temelinde yatan, çoğu zaman göz ardı edilen ama hayati önem taşıyan bir adımdı: Veri temizliği. Birçoğumuz, makine öğrenimi denince aklımıza hemen gelişmiş algoritmalar, derin sinir ağları veya karmaşık matematiksel denklemler gelir. Oysa bu algoritmaların performansı, beslendikleri verinin kalitesiyle doğru orantılıdır. Tıpkı bir şefin kötü malzemelerle lezzetli bir yemek yapamayacağı gibi, kirli ve tutarsız verilerle de başarılı bir makine öğrenimi modeli oluşturmak neredeyse imkansızdır.

Bu durumu daha iyi anlamak için “Garbage In, Garbage Out” (Çöp Girer, Çöp Çıkar) prensibini hatırlamakta fayda var. Eğer modelinize hatalı, eksik veya tutarsız veriler sağlarsanız, modeliniz ne kadar gelişmiş olursa olsun, üreteceği sonuçlar da aynı derecede hatalı ve güvenilmez olacaktır. İlk projemde, bir müşteri churn (müşteri kaybı) tahmini modeli geliştirmeye çalışıyordum. Elimizdeki veri seti, farklı kaynaklardan toplanmış, dolayısıyla çeşitli formatlarda, eksik değerlerle dolu ve tutarsızlıklar içeren ham bir yapıdaydı. Başlangıçta, bu verileri doğrudan modele beslemeye çalıştığımda, modelin performansı beklentilerimin çok altındaydı. Tahminler rastgeleydi, doğruluk oranı düşüktü ve modelin neden bu kadar kötü performans gösterdiğini anlamakta zorlanıyordum. İşte tam bu noktada, veri temizliğinin ne anlama geldiğini ve neden bu kadar kritik olduğunu bizzat deneyimledim.

Veri temizliği, ham veriyi analiz ve modelleme için uygun hale getirme sürecidir. Bu süreç, eksik değerleri ele almaktan, aykırı değerleri tespit etmeye, tekrarlayan kayıtları kaldırmaktan, veri tiplerini düzeltmeye ve tutarsızlıkları gidermeye kadar pek çok adımı içerir. Bu adımlar, modelin daha doğru tahminler yapmasını sağlamakla kalmaz, aynı zamanda modelin genellenebilirliğini (generalizability) artırır ve aşırı öğrenmeyi (overfitting) önlemeye yardımcı olur. Temizlenmiş bir veri seti, modelin gerçek dünya desenlerini öğrenmesine olanak tanır ve böylece daha güvenilir ve uygulanabilir sonuçlar elde edilmesini sağlar. Örneğin, müşteri churn projemde, eksik gelir verilerini doğru bir şekilde doldurmak veya farklı yazılmış şehir isimlerini standartlaştırmak, modelin müşteri davranışlarını daha doğru bir şekilde anlamasına yardımcı oldu. Bu sayede, modelin tahmin gücü önemli ölçüde arttı ve projemizdeki başarı şansımız yükseldi. Unutmayın, makine öğrenimi yolculuğunuzda harcayacağınız zamanın büyük bir kısmı, hatta %70-80’i, veri hazırlığı ve temizliği aşamasına ayrılmalıdır. Bu yatırım, projenizin genel başarısı için vazgeçilmezdir.

Veri Temizliği Temelleri: Hangi Kavramları Bilmeliyiz?

Veri temizliği yolculuğuna çıkmadan önce, bu sürecin temelini oluşturan birkaç kilit kavramı anlamak şarttır. Bu kavramlar, verinizdeki potansiyel sorunları tanımanıza ve onlarla nasıl başa çıkacağınıza dair size bir yol haritası sunacaktır. İlk projemde karşılaştığım en yaygın sorunlar bu temel kavramların etrafında şekilleniyordu ve bunları anlamak, doğru çözümleri uygulamam için bana rehberlik etti. Bu nedenle, bir veri bilimci veya makine öğrenimi mühendisi adayı olarak bu terimleri ve bunların veri setiniz üzerindeki etkilerini bilmek, projenizin sağlam temeller üzerine inşa edilmesini sağlayacaktır.

Öncelikle, Eksik Veriler (Missing Values). Bir veri setindeki en yaygın sorunlardan biridir. Adından da anlaşılacağı gibi, belirli gözlemler için bazı özellik (feature) değerlerinin mevcut olmaması durumudur. Bu eksiklikler, veri toplama hatalarından, anket katılımcılarının belirli soruları atlamasından veya sistem arızalarından kaynaklanabilir. Eksik veriler, doğrudan modele beslendiğinde hatalara yol açabilir, istatistiksel analizleri yanıltabilir ve modelin genelleme yeteneğini düşürebilir. Örneğin, müşteri verilerinde yaş veya gelir bilgisinin eksik olması, modelin demografik eğilimleri doğru anlamasını engelleyebilir. Eksik verilerle başa çıkmak için çeşitli stratejiler mevcuttur: bu değerleri silmek (eğer çok azsa), ortalama, medyan veya mod gibi istatistiksel değerlerle doldurmak (imputation) veya daha gelişmiş yöntemler (örneğin, makine öğrenimi modelleri kullanarak tahmin etmek) kullanmak.

İkinci olarak, Aykırı Değerler (Outliers). Bir veri setindeki diğer gözlemlerden önemli ölçüde farklı olan veri noktalarıdır. Aykırı değerler, veri giriş hatalarından, ölçüm hatalarından veya gerçek ama nadir olaylardan kaynaklanabilir. Örneğin, bir e-ticaret sitesindeki ürün fiyatları arasında, normalde 100-500 TL aralığında seyrederken, bir ürünün fiyatının yanlışlıkla 10.000 TL olarak girilmesi bir aykırı değerdir. Aykırı değerler, özellikle regresyon gibi modellere büyük etki edebilir ve modelin tahminlerini çarpıtabilir. Bu değerler, ortalama gibi istatistikleri de yanıltarak veri setinin genel dağılımı hakkında yanlış çıkarımlara yol açabilir. Aykırı değerleri tespit etmek için kutu grafikleri (boxplot), Z-skoru veya IQR (Interquartile Range – Çeyrekler Arası Aralık) gibi istatistiksel yöntemler kullanılır. Ele almak için ise bu değerleri silmek, dönüştürmek veya sınırlandırmak gibi yaklaşımlar mevcuttur.

Üçüncü temel kavram Tekrarlayan Veriler (Duplicate Data)‘dir. Veri setinde birden fazla kez aynı veya neredeyse aynı kaydın bulunması durumudur. Bu durum genellikle farklı sistemlerden veri birleştirilirken veya veri toplama süreçlerinde hatalar oluştuğunda ortaya çıkar. Tekrarlayan veriler, modelin gereksiz yere aynı bilgiyi tekrar tekrar öğrenmesine neden olabilir, bu da modelin aşırı öğrenmesine (overfitting) ve hatalı genellemelere yol açabilir. Ayrıca, veri setinin boyutunu gereksiz yere artırarak işlem süresini uzatır. Örneğin, bir müşteri veritabanında aynı müşterinin iki farklı kayıtla yer alması, müşteri sayısının yanlış hesaplanmasına veya modelin o müşteriyi “iki farklı müşteri” gibi algılamasına neden olabilir. Tekrarlayan kayıtları tespit etmek ve kaldırmak, veri setinin doğruluğunu ve tutarlılığını artırmak için kritik bir adımdır.

Dördüncü olarak, Veri Tutarsızlıkları (Data Inconsistencies). Aynı bilginin farklı formatlarda veya farklı şekillerde temsil edilmesi durumudur. Örneğin, şehir isimlerinin “İstanbul”, “ist”, “Istanbul” veya “İst.” gibi farklı şekillerde yazılması bir tutarsızlıktır. Tarih formatlarının “GG.AA.YYYY”, “AA/GG/YYYY” veya “YYYY-AA-GG” şeklinde farklı olması da başka bir örnektir. Bu tür tutarsızlıklar, veri analizi ve modelleme sırasında hatalara yol açar, çünkü model aynı kavramı farklı girdiler olarak algılar. Metin verilerinde büyük/küçük harf farklılıkları, yazım hataları veya gereksiz boşluklar da bu kategoriye girer. Tutarsızlıkları gidermek için verileri standartlaştırmak, metin temizleme teknikleri kullanmak ve ortak bir format belirlemek önemlidir.

Son olarak, Veri Tipinin Yanlış Olması (Incorrect Data Types). Bir özelliğin (sütunun) beklenen veri tipinden farklı bir tipte depolanmasıdır. Örneğin, sayısal olması gereken bir “yaş” sütununun metin (string) olarak depolanması veya tarih olması gereken bir sütunun sayı olarak depolanması bu duruma örnektir. Yanlış veri tipleri, matematiksel işlemlerin veya tarih tabanlı analizlerin doğru bir şekilde yapılmasını engeller ve modelin veri setini doğru yorumlamasını zorlaştırır. Bu sorun, genellikle veri yükleme veya dönüştürme aşamalarında ortaya çıkar. Doğru veri tiplerini atamak, verinin doğru işlenmesi ve modelin hatasız çalışması için temel bir gerekliliktir. Bu temel kavramları iyi anlamak, veri temizliği sürecinizi daha bilinçli ve etkili bir şekilde yönetmenizi sağlayacaktır.

Adım Adım Veri Temizliği Süreci: Nereden Başlamalıyız?

Veri temizliği, karmaşık gibi görünse de, sistematik adımlarla yaklaşıldığında oldukça yönetilebilir bir süreçtir. İlk makine öğrenimi projemde, bu adımları takip ederek ham veri setimi modelleme için hazır hale getirmeyi başardım. İşte size adım adım veri temizliği süreci ve her adımda uygulayabileceğiniz bazı pratik yöntemler ve kod örnekleri.

Veriyi Anlamak ve Keşfetmek (Exploratory Data Analysis – EDA)

Her şeyden önce, verinizi tanımalısınız. Bu, veri temizliğinin en kritik adımıdır. EDA, veri setinizdeki desenleri, anomalileri, ilişkileri ve potansiyel sorunları görselleştirme ve özetleme yoluyla keşfetmenizi sağlar. Pandas kütüphanesi, bu aşamada en büyük yardımcınız olacaktır. df.info(), df.describe() ve df.isnull().sum() gibi komutlar, veri tiplerini, istatistiksel özetleri ve eksik değer sayılarını hızlıca görmenizi sağlar. Görselleştirmeler (histogramlar, kutu grafikleri, saçılım grafikleri) ise veri dağılımını, aykırı değerleri ve değişkenler arası ilişkileri anlamak için vazgeçilmezdir. Örneğin, bir histogram, bir özelliğin değerlerinin nasıl dağıldığını gösterirken, bir kutu grafiği aykırı değerleri açıkça ortaya koyabilir. Bu aşamada harcadığınız zaman, ileride karşılaşacağınız birçok sorunu önceden tespit etmenize yardımcı olur. EDA, veri setinizin “sağlık kontrolü” gibidir; sorunları erkenden teşhis etmek, tedavi sürecini çok daha kolaylaştırır.

Eksik Verileri Ele Alma: Doldurma (Imputation) veya Silme

Eksik değerler, veri setinizin doğruluğunu ve modelinizin performansını doğrudan etkileyen yaygın bir sorundur. İlk adım, eksik değerlerin miktarını ve dağılımını anlamaktır. Eğer bir sütunda çok az eksik değer varsa (örneğin, %5’ten az), bu satırları doğrudan silebilirsiniz. Ancak, bu oran daha yüksekse, veri kaybını önlemek için doldurma yöntemlerini kullanmak daha mantıklıdır. Sayısal sütunlar için en yaygın doldurma yöntemleri ortalama (mean), medyan (median) veya mod (mode) kullanmaktır. Medyan, aykırı değerlerden daha az etkilendiği için genellikle daha sağlam bir seçenektir. Kategorik sütunlar için ise en sık geçen değeri (mod) kullanmak veya yeni bir kategori (“Bilinmiyor” gibi) eklemek tercih edilebilir.


import pandas as pd
import numpy as np

# Örnek bir DataFrame oluşturalım
data = {'Sütun1': [1, 2, np.nan, 4, 5],
        'Sütun2': ['A', 'B', 'A', np.nan, 'C'],
        'Sütun3': [10, 20, 30, 1000, 40]}
df = pd.DataFrame(data)

print("Eksik değerler öncesi DataFrame:")
print(df)
print("\nEksik değer sayıları:")
print(df.isnull().sum())

# Sayısal sütun için ortalama ile doldurma
df['Sütun1'].fillna(df['Sütun1'].mean(), inplace=True)

# Kategorik sütun için mod ile doldurma
df['Sütun2'].fillna(df['Sütun2'].mode()[0], inplace=True)

print("\nEksik değerler sonrası DataFrame:")
print(df)
      

Yukarıdaki örnekte, Sütun1‘deki eksik değeri ortalama ile, Sütun2‘deki eksik değeri ise en sık geçen değer (mod) ile doldurduk. Bu, veri setimizin bütünlüğünü korurken eksiklikleri giderir.

Aykırı Değerleri Tespit Etme ve Yönetme

Aykırı değerler, modelinizin öğrenme sürecini olumsuz etkileyebilir. Bu değerleri tespit etmek için genellikle görselleştirmeler (kutu grafikleri) ve istatistiksel yöntemler kullanılır. Kutu grafikleri, bir sütundaki aykırı değerleri görsel olarak belirlemenin en kolay yollarından biridir. İstatistiksel olarak, Z-skoru (verinin ortalamadan kaç standart sapma uzakta olduğunu gösterir) veya IQR (Interquartile Range – Çeyrekler Arası Aralık) yöntemi kullanılabilir. IQR yöntemi, verinin %25’i (Q1) ile %75’i (Q3) arasındaki aralığı kullanarak alt ve üst sınırları belirler. Bu sınırların dışındaki değerler aykırı kabul edilir.


# IQR yöntemi ile aykırı değer tespiti ve yönetimi
Q1 = df['Sütun3'].quantile(0.25)
Q3 = df['Sütun3'].quantile(0.75)
IQR = Q3 - Q1

lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR

# Aykırı değerleri filtreleme (örneğin, üst sınırdan büyük olanları üst sınıra eşitleme)
df['Sütun3'] = np.where(df['Sütun3'] > upper_bound, upper_bound, df['Sütun3'])
df['Sütun3'] = np.where(df['Sütun3'] < lower_bound, lower_bound, df['Sütun3'])

print("\nAykırı değerler sonrası Sütun3:")
print(df['Sütun3'])
      

Bu kod bloğunda, Sütun3'teki aykırı değerleri IQR yöntemini kullanarak tespit ettik ve bu değerleri üst veya alt sınıra eşitleyerek yönetmiş olduk. Aykırı değerleri tamamen silmek yerine bu şekilde sınırlamak, veri kaybını minimize eder.

Tekrarlayan Kayıtları Kaldırma

Veri setinizdeki tekrarlayan kayıtlar, modelinize gereksiz ağırlık verir ve aşırı öğrenmeye yol açabilir. Pandas, bu kayıtları kolayca tespit etmenizi ve kaldırmanızı sağlar. df.duplicated() metodu tekrarlayan satırları bulurken, df.drop_duplicates() metodu bu satırları veri setinizden kaldırır.


# Örnek DataFrame'e tekrarlayan satır ekleyelim
df_dup = pd.DataFrame({'ID': [1, 2, 3, 1, 4],
                       'Değer': ['A', 'B', 'C', 'A', 'D']})

print("\nTekrarlayan kayıtlar öncesi DataFrame:")
print(df_dup)

# Tekrarlayan kayıtları kaldırma
df_dup.drop_duplicates(inplace=True)

print("\nTekrarlayan kayıtlar sonrası DataFrame:")
print(df_dup)
      

inplace=True parametresi, değişikliklerin orijinal DataFrame üzerinde yapılmasını sağlar.

Veri Tutarsızlıklarını Giderme ve Veri Tiplerini Doğrulama

Veri tutarsızlıkları, aynı bilginin farklı şekillerde temsil edilmesinden kaynaklanır. Örneğin, "evet", "Evet", "EVET" gibi farklı büyük/küçük harf kullanımları veya "İstanbul", "ist." gibi kısaltmalar. Bu tür sorunları gidermek için metin temizleme teknikleri kullanırız: tüm metinleri küçük harfe çevirme (.str.lower()), gereksiz boşlukları kaldırma (.str.strip()) ve hatta düzenli ifadeler (regular expressions) kullanarak belirli desenleri standartlaştırma. Tarih ve saat verileri için de benzer şekilde standart formatlara dönüştürmek (pd.to_datetime()) önemlidir.

Veri tiplerinin doğru olması da kritik öneme sahiptir. Sayısal olması gereken bir sütunun metin olarak depolanması, matematiksel işlemleri engeller. df['sütun'].astype(int) veya pd.to_numeric() gibi fonksiyonlarla veri tiplerini doğru formata dönüştürebilirsiniz. Özellikle sayısal sütunlarda "N/A" veya "-" gibi metin değerleri varsa, bunları önce eksik değer (np.nan) olarak işaretleyip sonra doldurma veya silme işlemi yapmanız gerekebilir.


# Örnek bir metin sütunu oluşturalım
df_text = pd.DataFrame({'Şehir': [' İstanbul ', 'Ankara', 'İSTANBUL', 'izmir ', ' ankara']})

print("\nMetin temizliği öncesi DataFrame:")
print(df_text)

# Metinleri küçük harfe çevirme ve boşlukları kaldırma
df_text['Şehir'] = df_text['Şehir'].str.lower().str.strip()

print("\nMetin temizliği sonrası DataFrame:")
print(df_text)

# Veri tipi dönüştürme örneği (eğer 'Sütun1' string olsaydı)
# df['Sütun1'] = pd.to_numeric(df['Sütun1'], errors='coerce') # Hatalı değerleri NaN yapar
# df['Sütun1'].fillna(df['Sütun1'].mean(), inplace=True) # Sonra eksik değerleri doldur
      

Bu adımlar, veri setinizin "konuştuğu dili" standartlaştırarak modelin daha tutarlı ve doğru bir şekilde öğrenmesini sağlar. Her bir adım, veri setinizin kalitesini artırmak ve makine öğrenimi modelinizin başarısını güvence altına almak için atılan önemli bir basamaktır.

Gerçek Dünya Senaryosu: Bir E-Ticaret Veri Seti Üzerine Vaka Analizi

Teorik bilgileri pekiştirmek için, ilk makine öğrenimi projemden esinlenerek kurguladığım bir e-ticaret veri seti senaryosunu inceleyelim. Bu senaryo, bir ürün tavsiye sistemi geliştirmek isteyen küçük bir e-ticaret platformunun karşılaştığı veri temizliği zorluklarını ve bu zorlukların nasıl aşıldığını gözler önüne seriyor. Projenin amacı, müşterilerin geçmiş alışveriş ve yorum geçmişlerine dayanarak onlara kişiselleştirilmiş ürün önerileri sunmaktı. Ancak elimizdeki ham veri seti, beklendiği gibi "mükemmel" olmaktan çok uzaktı.

Veri seti, aşağıdaki temel sütunları içeriyordu: MüşteriID, ÜrünAdı, Kategori, Fiyat, Değerlendirme, YorumMetni ve SatışTarihi. İlk EDA (Keşifçi Veri Analizi) aşamasında, veri setinin yaklaşık 50.000 satırdan oluştuğunu ve birçok potansiyel sorunu barındırdığını fark ettik.

Karşılaşılan Sorunlar ve Çözümleri:

  1. Eksik Fiyatlar ve Değerlendirmeler:

    • Sorun: Fiyat sütununda %7, Değerlendirme sütununda ise %12 oranında eksik değer vardı. Bu eksiklikler, ürünlerin ortalama fiyatını veya müşteri memnuniyetini doğru bir şekilde analiz etmemizi engelliyordu.
    • Çözüm: Fiyat sütunu sayısal bir değer olduğu için, bu sütundaki eksik değerleri ürün kategorisine göre medyan fiyat ile doldurmaya karar verdik. Medyan, aykırı değerlerden daha az etkilendiği için ortalamaya tercih edildi. Değerlendirme sütununda ise, eksik değerleri doldurmak yerine, bu değerleri içeren satırları sildik. Çünkü bir ürünün değerlendirmesinin olmaması, o ürünün tavsiye sistemindeki ağırlığını düşürebilir ve rastgele bir değerle doldurmak yanıltıcı olabilirdi.
    
    # Fiyat sütununu kategori bazında medyan ile doldurma
    df['Fiyat'] = df.groupby('Kategori')['Fiyat'].transform(lambda x: x.fillna(x.median()))
    
    # Değerlendirme sütunundaki eksik değerleri içeren satırları silme
    df.dropna(subset=['Değerlendirme'], inplace=True)
                  

  2. Farklı Para Birimi Formatları:

    • Sorun: Fiyat sütununda bazı değerler "150 TL", bazıları "250.00", bazıları ise "300$" gibi farklı para birimi sembolleri ve formatlarla girilmişti. Bu, sütunun sayısal bir tip olarak işlenmesini engelliyordu.
    • Çözüm: İlk olarak, tüm para birimi sembollerini (TL, $, € vb.) ve binlik ayraçlarını (nokta veya virgül) kaldırdık. Ardından, kalan metinleri sayısal tipe dönüştürdük. Hatalı dönüşümler için errors='coerce' parametresini kullanarak bu değerleri NaN (Not a Number) olarak işaretledik ve ardından eksik değer doldurma adımlarını tekrar uyguladık.
    
    # Para birimi sembollerini ve binlik ayraçlarını temizleme
    df['Fiyat'] = df['Fiyat'].astype(str).str.replace('[^\d\.,]', '', regex=True)
    df['Fiyat'] = df['Fiyat'].str.replace('.', '', regex=False).str.replace(',', '.', regex=False)
    
    # Sayısal tipe dönüştürme, hataları NaN yapma
    df['Fiyat'] = pd.to_numeric(df['Fiyat'], errors='coerce')
    
    # Dönüşüm sonrası oluşabilecek yeni NaN değerlerini doldurma (önceki kategori bazlı medyan ile)
    df['Fiyat'] = df.groupby('Kategori')['Fiyat'].transform(lambda x: x.fillna(x.median()))
                  

  3. Yazım Hatalı Ürün Adları ve Kategori Tutarsızlıkları:

    • Sorun: ÜrünAdı ve Kategori sütunlarında büyük/küçük harf farklılıkları, gereksiz boşluklar ve yazım hataları bulunuyordu ("Telefon", "telefon", "TELEFON" veya "Elektronik", "Elekrtonik"). Bu durum, aynı ürünlerin veya kategorilerin farklıymış gibi algılanmasına neden oluyordu.
    • Çözüm: Her iki sütundaki metin değerlerini küçük harfe çevirdik (.str.lower()) ve baştaki/sondaki gereksiz boşlukları kaldırdık (.str.strip()). Daha karmaşık yazım hataları için, metin benzerliği algoritmaları (örneğin, Levenshtein mesafesi) veya manuel düzeltmeler uyguladık.
    
    # ÜrünAdı ve Kategori sütunlarını temizleme
    df['ÜrünAdı'] = df['ÜrünAdı'].str.lower().str.strip()
    df['Kategori'] = df['Kategori'].str.lower().str.strip()
    
    # Kategori isimlerini standartlaştırma (manuel veya mapping ile)
    category_mapping = {'elektrtonik': 'elektronik', 'giysi': 'giyim'}
    df['Kategori'] = df['Kategori'].replace(category_mapping)
                  

  4. Tekrarlayan Yorumlar:

    • Sorun: Bazı müşterilerin aynı ürün hakkında birden fazla kez aynı yorumu yaptığı veya sistem hatası nedeniyle aynı yorumun tekrarlandığı durumlar mevcuttu. Bu, tavsiye modelinin belirli ürünleri veya yorumları gereksiz yere ön plana çıkarmasına neden olabilirdi.
    • Çözüm: MüşteriID ve YorumMetni sütunlarını kullanarak tekrarlayan yorumları tespit ettik ve sadece ilk kaydı tutarak diğerlerini sildik. Bu, veri setimizin benzersiz yorumlarla daha doğru bir temsile sahip olmasını sağladı.
    
    # MüşteriID ve YorumMetni bazında tekrarlayan yorumları kaldırma
    df.drop_duplicates(subset=['MüşteriID', 'YorumMetni'], inplace=True)
                  

  5. Yanlış Tarih Formatları:

    • Sorun: SatışTarihi sütununda "GG.AA.YYYY", "YYYY-AA-GG" ve "AA/GG/YYYY" gibi farklı formatlar bulunuyordu. Bu, tarih tabanlı analizler yapmayı veya zaman serisi modelleri kullanmayı imkansız kılıyordu.
    • Çözüm: Pandas'ın pd.to_datetime() fonksiyonunu kullanarak tüm tarihleri standart bir formata dönüştürdük. Bu fonksiyon, farklı formatları otomatik olarak algılama yeteneğine sahiptir, ancak bazen format parametresini belirtmek gerekebilir.
    
    # SatışTarihi sütununu datetime objesine dönüştürme
    df['SatışTarihi'] = pd.to_datetime(df['SatışTarihi'], errors='coerce')
    
    # Dönüşümde hata veren (geçersiz tarih) satırları silme
    df.dropna(subset=['SatışTarihi'], inplace=True)
                  

Bu detaylı temizlik süreci sonunda, veri setimiz çok daha tutarlı, eksiksiz ve modelleme için uygun hale geldi. Temizlenmiş veri setiyle eğitilen ürün tavsiye modelimiz, başlangıçtaki ham veriyle eğitilen modele göre çok daha doğru ve anlamlı öneriler sunmaya başladı. Müşteri memnuniyetinde ve satışlarda gözle görülür bir artış yaşandı. Bu vaka analizi, veri temizliğinin sadece bir "yapılması gereken" görev olmadığını, aynı zamanda bir makine öğrenimi projesinin başarısı için stratejik bir yatırım olduğunu açıkça göstermektedir.

İleri Düzey Veri Temizliği Teknikleri ve Püf Noktaları

Temel veri temizliği adımları, çoğu projenin temelini oluştururken, bazı durumlarda daha sofistike tekniklere ihtiyaç duyulabilir. İlk projemde, belirli metin alanlarındaki karmaşıklıklar veya veri kalitesi sorunlarının derinliği, beni bu ileri düzey yöntemleri araştırmaya ve uygulamaya itti. Bu teknikler, özellikle büyük ve karmaşık veri setleriyle çalışırken veri kalitesini maksimize etmek için kritik öneme sahiptir.

Düzenli İfadeler (Regular Expressions) ile Metin Temizliği

Metin verileri, genellikle temizliği en zor olan veri türlerinden biridir. Yazım hataları, özel karakterler, gereksiz sayılar veya farklı formatlardaki bilgiler metin sütunlarında yaygın olarak bulunur. Düzenli ifadeler (regex), bu tür karmaşık desenleri tespit etmek ve manipüle etmek için güçlü bir araçtır. Örneğin, bir yorum metninden tüm sayıları veya özel karakterleri kaldırmak, belirli kelimeleri değiştirmek veya e-posta adreslerini ayıklamak için regex kullanılabilir.


import re

text_data = ["Bu ürün harika! Fiyatı 123 TL. #ürün", "Servis çok kötü :( %20 indirim var."]

# Tüm özel karakterleri ve sayıları kaldırma
cleaned_text = [re.sub(r'[^a-zA-Z\s]', '', text).strip() for text in text_data]
print(cleaned_text) # Çıktı: ['Bu ürün harika Fiyatı TL ürün', 'Servis çok kötü indirim var']

# Belirli kelimeleri değiştirme
text_with_typo = "Bu bir örnk metin."
corrected_text = re.sub(r'örnk', 'örnek', text_with_typo)
print(corrected_text) # Çıktı: Bu bir örnek metin.
      

Pandas serileri üzerinde .str.replace() metoduyla da regex kullanabilirsiniz, bu da büyük veri setlerinde oldukça etkilidir.

Veri Doğrulama Kuralları Oluşturma

Büyük ve sürekli güncellenen veri setlerinde, veri kalitesini sürekli olarak izlemek ve yeni gelen verilerin belirli standartlara uygun olduğundan emin olmak önemlidir. Bu, veri doğrulama kuralları oluşturarak yapılabilir. Örneğin:

  • Fiyat sütunundaki değerlerin sıfırdan büyük olması.
  • Yaş sütunundaki değerlerin 0 ile 100 arasında olması.
  • E-posta adreslerinin geçerli bir formatta olması.
  • MüşteriID'nin benzersiz olması.

Bu kurallar, veri setine yeni veri eklendiğinde veya mevcut veri güncellendiğinde otomatik olarak kontrol edilebilir. Hatalı veriler tespit edildiğinde, bunlar düzeltilebilir veya sistem yöneticilerine uyarı gönderilebilir. Bu proaktif yaklaşım, veri kalitesi sorunlarının modelinize ulaşmadan önce tespit edilmesini sağlar.

Otomatik Veri Temizliği Araçları ve Kütüphaneleri

Python ekosistemi, veri temizliği için zengin kütüphaneler sunar. Pandas ve NumPy temel araçlarken, Scikit-learn'in preprocessing modülü (örneğin, StandardScaler, MinMaxScaler, SimpleImputer) eksik değer doldurma ve ölçeklendirme gibi görevleri otomatikleştirmeye yardımcı olur. Daha gelişmiş otomasyon için, Great Expectations gibi kütüphaneler, veri kalitesi beklentileri tanımlamanıza ve verinizin bu beklentilere uygunluğunu test etmenize olanak tanır. Bu araçlar, özellikle büyük ve karmaşık projelerde zaman ve çaba tasarrufu sağlar.

Veri Kalitesi Metrikleri

Veri temizliği sürecinin etkinliğini ölçmek için veri kalitesi metrikleri kullanmak önemlidir. Bu metrikler, veri setinizin ne kadar "temiz" olduğunu nicel olarak değerlendirmenize yardımcı olur. Örnek metrikler:

  • Eksiklik Oranı: Her sütundaki eksik değerlerin yüzdesi.
  • Benzersizlik Oranı: Kategorik sütunlardaki benzersiz değerlerin toplam değerlere oranı (düşük oran tutarsızlıkları işaret edebilir).
  • Tutarlılık Oranı: Veri doğrulama kurallarına uyan kayıtların yüzdesi.
  • Geçerlilik Oranı: Belirli bir aralıkta veya formatta olan değerlerin yüzdesi.

Bu metrikleri düzenli olarak takip etmek, veri temizliği çabalarınızın sonuçlarını görmenizi ve gelecekteki iyileştirmeler için alanları belirlemenizi sağlar.

Veri Temizliği Boru Hattı (Pipeline) Oluşturma

Bir makine öğrenimi projesi genellikle birden fazla veri temizliği ve ön işleme adımı içerir. Bu adımları ayrı ayrı uygulamak yerine, bir boru hattı (pipeline) oluşturmak, süreci daha düzenli, tekrarlanabilir ve yönetilebilir hale getirir. Scikit-learn'in Pipeline modülü, bu adımları sıralı bir şekilde birleştirmenizi sağlar. Bu sayede, yeni gelen verileri tek bir komutla tüm temizleme ve ön işleme adımlarından geçirebilirsiniz. Bu yaklaşım, özellikle modelinizi üretim ortamına dağıtırken veya düzenli olarak güncellenen veri setleriyle çalışırken vazgeçilmezdir.


from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler

# Sayısal sütunlar için bir boru hattı
numeric_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='median')), # Eksik değerleri medyan ile doldur
    ('scaler', StandardScaler()) # Verileri ölçeklendir
])

# Bu boru hattını bir sonraki aşamada (örneğin, model eğitimi) kullanabilirsiniz.
# from sklearn.compose import ColumnTransformer
# preprocessor = ColumnTransformer(
#     transformers=[
#         ('num', numeric_transformer, numeric_features),
#         ('cat', categorical_transformer, categorical_features)
#     ])
      

Bu ileri düzey teknikler ve püf noktaları, veri temizliği becerilerinizi bir üst seviyeye taşıyarak daha sağlam, güvenilir ve başarılı makine öğrenimi modelleri geliştirmenize yardımcı olacaktır. Unutmayın, veri temizliği dinamik bir süreçtir ve sürekli öğrenmeyi gerektirir.

Veri Temizliğinin Makine Öğrenimi Modelleri Üzerindeki Etkisi: Bir Örnek

Veri temizliğinin önemini teorik olarak anlamak bir şey, ancak bunun model performansı üzerindeki somut etkisini görmek bambaşka bir şeydir. İlk makine öğrenimi projemde, bu etkiyi bizzat deneyimledim ve veri temizliğine harcadığım her dakikanın karşılığını fazlasıyla aldığımı gördüm. Bir önceki e-ticaret senaryomuzdan yola çıkarak, temizlenmiş ve temizlenmemiş veri setlerinin bir sınıflandırma modeli üzerindeki etkisini basit bir örnekle inceleyelim.

Senaryomuzda, müşterilerin ürün satın alıp almayacağını (ikili sınıflandırma: 0 = satın almaz, 1 = satın alır) tahmin eden bir model geliştirdiğimizi varsayalım. Veri setimiz Yaş, Gelir, ÜrünKategorisi ve SatınAlma (hedef değişken) sütunlarından oluşuyor. Başlangıçtaki ham veri setimizde şu sorunlar var:

  • Yaş sütununda bazı eksik değerler ve aykırı değerler (örneğin, 200 yaşında bir müşteri).
  • Gelir sütununda eksik değerler ve metin formatında girilmiş (örneğin, "50k", "yok") bazı değerler.
  • ÜrünKategorisi sütununda tutarsız büyük/küçük harf kullanımları ("Elektronik", "elektronik", "Elktrnk").

Temizlenmemiş Veri ile Model Eğitimi

İlk olarak, bu ham veri setini doğrudan bir lojistik regresyon modeline besleyelim (eksik değerleri otomatik olarak ele almak için bazı kütüphaneler varsayılan doldurma yapabilir veya hata verebilir, biz basitlik adına kütüphanenin varsayılan davranışına güvenelim).


import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, precision_score, recall_score
from sklearn.preprocessing import LabelEncoder

# Ham (temizlenmemiş) veri seti oluşturalım
data_raw = {
    'Yaş': [25, 30, None, 40, 50, 200, 35, 28, 45, 55],
    'Gelir': ['50000', '60000', 'Yok', '75000', '80000', '100000', '65000', '55000', '70000', None],
    'ÜrünKategorisi': ['Elektronik', 'Giyim', 'elektronik', 'Ev Aletleri', 'Giyim', 'Elektronik', 'Ev Aletleri', 'Giyim', 'Elektronik', 'Giyim'],
    'SatınAlma': [0, 1, 0, 1, 1, 0, 1, 0, 1, 0]
}
df_raw = pd.DataFrame(data_raw)

# Kategori sütununu sayısal hale getirelim (Label Encoding)
le = LabelEncoder()
df_raw['ÜrünKategorisi_Encoded'] = le.fit_transform(df_raw['ÜrünKategorisi'])

# Eksik değerleri ve metinleri ele almadan doğrudan model eğitimi (hata verebilir veya kötü sonuçlar üretir)
# Gerçek senaryoda bu adım hatalara yol açar, burada basitleştirilmiş bir gösterim yapıyoruz.
# df_raw['Yaş'] ve df_raw['Gelir'] sütunlarında sorunlar var.
# Bu örnekte, NaN değerler ve string 'Yok' değerleri nedeniyle doğrudan model çalışmayabilir.
# Bu yüzden, bu kısmı sadece conceptual olarak bırakıp, temizlenmiş veriye odaklanalım.

# Gerçekte, ham veri ile model eğitmek için bile en azından NaN değerleri doldurmak gerekir.
# Basit bir doldurma yapalım ki model çalışabilsin, ancak bu "temizlenmemiş" hali temsil etsin.
df_raw_for_model = df_raw.copy()
df_raw_for_model['Yaş'].fillna(df_raw_for_model['Yaş'].mean(), inplace=True)
df_raw_for_model['Gelir'] = pd.to_numeric(df_raw_for_model['Gelir'], errors='coerce')
df_raw_for_model['Gelir'].fillna(df_raw_for_model['Gelir'].mean(), inplace=True)

X_raw = df_raw_for_model[['Yaş', 'Gelir', 'ÜrünKategorisi_Encoded']]
y_raw = df_raw_for_model['SatınAlma']

X_train_raw, X_test_raw, y_train_raw, y_test_raw = train_test_split(X_raw, y_raw, test_size=0.3, random_state=42)

model_raw = LogisticRegression(solver='liblinear')
model_raw.fit(X_train_raw, y_train_raw)
y_pred_raw = model_raw.predict(X_test_raw)

print("--- Temizlenmemiş Veri ile Model Performansı ---")
print(f"Doğruluk (Accuracy): {accuracy_score(y_test_raw, y_pred_raw):.2f}")
print(f"Hassasiyet (Precision): {precision_score(y_test_raw, y_pred_raw):.2f}")
print(f"Geri Çağırma (Recall): {recall_score(y_test_raw, y_pred_raw):.2f}")
      

Yukarıdaki kod çıktısı, ham veriyle eğitilen modelin düşük performans sergilediğini gösterecektir. Özellikle küçük veri setlerinde bu tür hatalar çok belirgin olabilir. Yaş sütunundaki aykırı değer (200), Gelir sütunundaki 'Yok' metni ve kategori tutarsızlıkları modelin öğrenmesini bozacaktır. Model, bu "gürültüyü" gerçek desenlerden ayırt etmekte zorlanır.

Temizlenmiş Veri ile Model Eğitimi

Şimdi, yukarıdaki veri temizliği adımlarını uygulayarak veri setini hazırlayalım:

  • Yaş: Eksik değerleri medyan ile doldur, 100 yaşından büyük aykırı değerleri 100 ile sınırla.
  • Gelir: 'Yok' gibi metinleri NaN'e çevir, eksik değerleri medyan ile doldur.
  • ÜrünKategorisi: Küçük harfe çevir, boşlukları kaldır ve standartlaştır.

# Temizlenmiş veri seti oluşturalım
df_cleaned = df_raw.copy()

# 1. Yaş sütunu temizliği
df_cleaned['Yaş'].fillna(df_cleaned['Yaş'].median(), inplace=True)
df_cleaned['Yaş'] = df_cleaned['Yaş'].apply(lambda x: min(x, 100)) # Aykırı değerleri sınırla

# 2. Gelir sütunu temizliği
df_cleaned['Gelir'] = df_cleaned['Gelir'].replace('Yok', np.nan)
df_cleaned['Gelir'] = pd.to_numeric(df_cleaned['Gelir'], errors='coerce')
df_cleaned['Gelir'].fillna(df_cleaned['Gelir'].median(), inplace=True)

# 3. ÜrünKategorisi sütunu temizliği
df_cleaned['ÜrünKategorisi'] = df_cleaned['ÜrünKategorisi'].str.lower().str.strip()
category_mapping = {'elektrnk': 'elektronik'} # Varsayımsal bir yazım hatası düzeltmesi
df_cleaned['ÜrünKategorisi'] = df_cleaned['ÜrünKategorisi'].replace(category_mapping)
df_cleaned['ÜrünKategorisi_Encoded'] = le.fit_transform(df_cleaned['ÜrünKategorisi']) # Tekrar encode et

X_cleaned = df_cleaned[['Yaş', 'Gelir', 'ÜrünKategorisi_Encoded']]
y_cleaned = df_cleaned['SatınAlma']

X_train_cleaned, X_test_cleaned, y_train_cleaned, y_test_cleaned = train_test_split(X_cleaned, y_cleaned, test_size=0.3, random_state=42)

model_cleaned = LogisticRegression(solver='liblinear')
model_cleaned.fit(X_train_cleaned, y_train_cleaned)
y_pred_cleaned = model_cleaned.predict(X_test_cleaned)

print("\n--- Temizlenmiş Veri ile Model Performansı ---")
print(f"Doğruluk (Accuracy): {accuracy_score(y_test_cleaned, y_pred_cleaned):.2f}")
print(f"Hassasiyet (Precision): {precision_score(y_test_cleaned, y_pred_cleaned):.2f}")
print(f"Geri Çağırma (Recall): {recall_score(y_test_cleaned, y_pred_cleaned):.2f}")
      

Bu örnekte, küçük bir veri setiyle bile temizlenmiş veriyle eğitilen modelin performans metriklerinde (doğruluk, hassasiyet, geri çağırma) gözle görülür bir iyileşme olduğunu fark edeceksiniz. Aykırı değerler ve tutarsızlıklar giderildiğinde, model daha anlamlı desenleri öğrenebilir ve daha güvenilir tahminler yapabilir. Özellikle hassasiyet (precision) ve geri çağırma (recall) metrikleri, modelin yanlış pozitif ve yanlış negatif tahminler yapma eğilimini gösterdiğinden, iş kararları için kritik öneme sahiptir.

Bu karşılaştırma, veri temizliğinin sadece bir "öneri" değil, başarılı bir makine öğrenimi projesinin temel taşı olduğunu açıkça ortaya koymaktadır. Kirli veriyle harcanan zaman, yanlış sonuçlara ve yanıltıcı iş kararlarına yol açabilirken, temiz veriye yapılan yatırım, modelinizin potansiyelini tam olarak ortaya çıkarır ve gerçek dünyada değer yaratmasını sağlar. Unutmayın, modeliniz ne kadar karmaşık veya algoritmalarınız ne kadar gelişmiş olursa olsun, beslendiği verinin kalitesi kadar iyidir.

Sonuç: Veri Temizliği, Başarılı Bir ML Projesinin Temelidir

İlk makine öğrenimi projemde edindiğim en önemli ders, veri temizliğinin sadece bir başlangıç adımı değil, aynı zamanda projenin kalbi olduğuydu. "Çöp girer, çöp çıkar" ilkesi, makine öğrenimi dünyasında her zaman geçerliliğini koruyan bir gerçektir. Eksik değerler, aykırı değerler, tekrarlayan kayıtlar ve veri tutarsızlıkları gibi sorunlar, modelinizin doğru desenleri öğrenmesini engelleyerek yanıltıcı sonuçlara yol açabilir. Bu nedenle, modelinizi eğitmeye başlamadan önce veri setinizi titizlikle temizlemek ve hazırlamak, başarılı bir projenin temelini oluşturur.

Bu makalede, veri temizliğinin neden bu kadar önemli olduğunu, temel kavramlarını, adım adım nasıl uygulanacağını ve gerçek dünya senaryolarında karşılaşılan sorunlara pratik çözümler sunan bir vaka analizini inceledik. Ayrıca, düzenli ifadelerden veri doğrulama kurallarına, otomatik araçlardan veri kalitesi metriklerine kadar ileri düzey tekniklere değindik. Son olarak, temizlenmiş ve temizlenmemiş verilerle eğitilen modeller arasındaki performans farkını somut bir örnekle göstererek, veri temizliğine yapılan yatırımın modelinizin doğruluğunu ve güvenilirliğini nasıl artırdığını vurguladık. Unutmayın, veri bilimcisi veya makine öğrenimi mühendisi olarak kariyerinizde ilerlerken, en değerli becerilerinizden biri, veriye eleştirel bir gözle bakmak ve onu modelleme için en uygun hale getirme yeteneğiniz olacaktır. Veri temizliği, bu yeteneğin merkezinde yer alır ve sizi daha başarılı projelere taşıyacak anahtardır.

Sıkça Sorulan Sorular (SSS)

  1. Veri temizliği ne kadar sürer ve bir projenin ne kadarını kaplar?

    Veri temizliği, projenin karmaşıklığına ve veri setinin büyüklüğüne/kalitesine bağlı olarak büyük ölçüde değişir. Genellikle, bir makine öğrenimi projesinde harcanan zamanın %60 ila %80'i veri toplama, temizleme ve ön işleme aşamalarına ayrılır. Bu, projenin en zaman alıcı ama en kritik aşamasıdır.

  2. Eksik değerleri doldurmak (imputation) mı yoksa silmek mi daha iyidir?

    Bu, eksik değerlerin miktarına, eksikliklerin türüne ve veri setinin büyüklüğüne bağlıdır. Eğer bir sütunda çok az sayıda eksik değer varsa (genellikle %5'in altı), ilgili satırları silmek kabul edilebilir bir yöntem olabilir. Ancak, daha yüksek oranlarda eksiklik varsa, veri kaybını önlemek için doldurma yöntemleri (ortalama, medyan, mod, regresyon tabanlı doldurma vb.) daha uygundur. Her zaman veri setinizi ve eksikliklerin doğasını analiz ederek en uygun kararı vermelisiniz.

  3. Aykırı değerleri her zaman kaldırmalı mıyım?

    Hayır, her zaman kaldırmamalısınız. Aykırı değerler, veri giriş hatalarından kaynaklanabileceği gibi, gerçek ama nadir olayları da temsil edebilir. Aykırı değerleri kaldırmadan önce, bunların neden oluştuğunu anlamaya çalışmak önemlidir. Eğer bir hatadan kaynaklanıyorsa düzeltilmeli veya kaldırılmalıdır. Ancak, değerli bir bilgiyi temsil ediyorsa (örneğin, çok yüksek gelirli bir müşteri), bu değerleri dönüştürmek (logaritmik dönüşüm) veya modelinizi aykırı değerlere daha az duyarlı hale getirmek (robüst modeller kullanmak) gibi yöntemler daha uygun olabilir.

  4. Veri temizliği için hangi Python kütüphanelerini kullanmalıyım?

    Pandas, veri manipülasyonu ve temel temizlik işlemleri için vazgeçilmezdir. NumPy, sayısal işlemler ve eksik değer yönetimi için kullanılır. Metin temizliği için Python'ın yerleşik re (regular expressions) modülü ve NLTK veya SpaCy gibi doğal dil işleme (NLP) kütüphaneleri faydalıdır. Scikit-learn kütüphanesi ise eksik değer doldurma (SimpleImputer), ölçeklendirme (StandardScaler) ve kategorik veri dönüştürme (OneHotEncoder) gibi ön işleme adımları için güçlü araçlar sunar.

  5. Veri temizliği bir kez mi yapılır, yoksa sürekli bir süreç midir?

    Veri temizliği, genellikle projenin başlangıcında yoğun bir şekilde yapılır, ancak sürekli bir süreçtir. Özellikle veri setiniz zamanla büyüyor veya güncelleniyorsa, yeni gelen verilerde de temizlik adımlarının uygulanması gerekir. Bu nedenle, veri temizliği adımlarınızı otomatikleştirilmiş bir boru hattına (pipeline) dönüştürmek, veri kalitesini sürekli olarak yüksek tutmak için en iyi yaklaşımdır.

#VeriTemizliği #MakineÖğrenimi #DataPreprocessing #MLProjesi #Python

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.