"Enter"a basıp içeriğe geçin

Veri Temizleme

Data Cleaning

Veri temizleme (Data Cleaning) veri setinde var olan ve uygulanacak makine öğrenmesi modelinin performansını olumsuz yönde etkileyecek problemlerin ortadan kaldırılmasını amaçlayan veri ön işleme adımlarının bütünüdür. Çoğunlukla çalışma yapılan alanla ilgili bilgi (domain knowledge) gerektirir. Veri temizleme yöntemleri ile bir çok problem giderilebilse de kimi durumlarda veri toplama adımına geri dönülmesinden çekinilmemelidir.

İyi bir veri setine sahip olmak iyi bir performans elde etmenin en önemli şartıdır. İyi bir modelin alternatifini elde etmek mümkün fakat iyi bir veri setine sahip olmanın alternatifi ancak daha iyi bir veri setidir :).

Veri temizleme adımları veri setine göre keşifsel veri analizi sonucu tespit edilen problemlere bağlı olarak değişkenlik göstermekle beraber aşağıdaki adımları ve elbette daha fazlasını kapsamaktadır:

  • Veri toplama (data collection) sırasında oluşan yapısal sorunları giderme
  • Tekrar eden kayıtları silme (Remove duplicates)
  • Kayıp veri yönetimi
  • Aykırı verilerden kurtulma (ilgili Teach to Machines içeriği için tıklayın)

Yapısal Sorunlar (Structural Problems)

Bir anket doldururken zaman zaman çeşitli problemlerle karşılaşabilirsiniz. Mesleğiniz iki farklı ad ile seçeneklerde mevcut olabilir örneğin. Ya da büyük küçük harf uyumsuzluğu sebebi ile iki farklı kategori aynı şeyi ifade ediyor olabilir. Bu gibi veri toplama sırasında oluşan mantıksal problemleri gidermek gerekmektedir.

Örnekler üzerinden anlatmak üzere bir takım sorunlar içeren bir DataFrame oluşturalım:

import pandas as pd
import numpy as np
df = pd.DataFrame()

df['time'] = pd.to_datetime(pd.Series(['19052020','19052020','20052020','21052020','22052020','23052020','24052020','25052020','26052020','27052020','28052020','29052020']), format='%d%m%Y', errors='ignore')
df['machine'] = pd.Series(['node1','node1','Node1','node1','node1','Node1','node1','node1','node1','node1','node1','node1','node1'])
df['sensor1'] = pd.Series([1,1,3,5,7,9,7,np.NaN,3,1,3,5])
df['sensor2'] = pd.Series([4,4,3,2,1,0,1,2,np.NaN,4,5,6])
df['sensor3'] = pd.Series([2,2,4,6,8,10,8,6,4,np.NaN,0,4])

display(df)

Görüleceği üzere aynı makine için ‘node1’ ve ‘Node1’ adları ile ayrı ayrı veri toplanmış. Veri toplama sırasında bu gibi sorunlar oluşabilir. pandas.Series.replace ile bu sorunu çözmek için aşağıdaki basit kod parçasını kullanabiliriz:

df.machine = df.machine.replace('Node1','node1')
display(df)

Tekrar Eden Kayıtlar (Duplicates)

Çeşitli sebeplerle aynı gözleme ait birden fazla kayıt olabilir. Bunlardan kurtulmak için kaydın fazla olduğuna hangi kolonlara bakılarak karar verileceğini belirlemek gerekiyor. Örneğin aynı periyot ve makineye ait bir kayıt için farklı sensör verilerine sahip olunabilir. Eğer aynı periyot içerisinde aynı makine için birden fazla kayıt istenmiyor ise tekrar eden kayıt olup olmadığına da bu kolonlara bakılarak karar verilmesi gerekir. Diğer yandan sensör verileri aynı periyot ve makine için farklı ise çeşitli sebeplerle bunlar saklanmak istenebilir.

Aynı örnek üzerinden devam edilirse periyot ve makine bilgisi eş olan satırlardan ilkini koruyarak tekrar eden satırları kaldırmak için aşağıdaki kod parçası kullanılabilir. Diğer parametrik tercihler için pandas.drop_duplicates metodunu inceleyebilirsiniz.

df = df.drop_duplicates(subset = ['time', 'machine'], keep = 'first')
display(df)

Kayıp Veri (Missing Values) Yönetimi

Veri toplama aşamasında bazı sensör ya da bilgi kaynaklarından veri alınamaması ya da çeşitli problemlerle silinmesi sebebi ile kayıp veri oluşabilir. Üç temel yöntemle müdahale etmek mümkün.

İlki interpolasyon (interpolation) yani aynı özniteliğe (kolon, özellik, feature) ait verilerin akışına uygun bir değer tahminleme işlemi. Çeşitli yöntemlerle interpolasyon yapmak mümkün. En bilinenleri lineer (linear) ve polinom (polynomial) interpolasyon.

pandas.Series.interpolate ile dilenen yöntemle interpolasyon yapıp sonuçlara göre karar vermek mümkün. ‘sensor1’ kolonu için lineer interpolasyon kullanmak üzere aşağıdaki kod parçası kullanılabilir:

df['sensor1'] = df['sensor1'].interpolate(method = 'linear')
display(df)

Görüleceği üzere NaN değeri 5 olarak güncellenmiş durumda. Veriye göre lineer dışındaki diğer yöntemler denenerek en doğru sonuca ulaşılabilir.

İnterpolasyon dışında pandas.DataFrame.fillna yardımı ile bir önceki ya da bir sonraki değer ile NaN değerleri değiştirmek mümkün. Genellikle verinin değişimi yavaş iken kullanılması gerekmektedir. Hızlı değişen öznitelikler için fillna metodu kullanımı sonuca olumsuz etki edebilir.

df['sensor2'] = df['sensor2'].fillna(method = 'ffill')
display(df)

Son olarak herhangi bir sebeple kayıp veriyi düzeltmek sağlıklı ya da mümkün değil ise satırı (gözlemi) tamamen silmek gerekebilir. Bu durumda dropna kullanılabilir:

df = df.dropna(subset = ['sensor3'],  axis=0)
display(df)

Diğer bir veri temizleme yöntemi olarak Aykırı Veri Temizleme işlemi hakkındaki teachtomachines.com içeriğine erişmek için tıklayın.

İlgili Github reposu için tıklayın.

Keyifli öğrenmeler 🙂

İlk Yorumu Siz Yapın

Bir Cevap Yazın

Translate »
%d blogcu bunu beğendi: