Feature Engineering #1

Ayse Nur Erdem
3 min readOct 15, 2020

--

Makine öğrenmesinde modelin iyi öğrenmesini sağlamak, yüksek doğruluğa sahip çıktı almak modelin eğitildiği verinin ne kadar iyi işlendiğine bağlıdır. Veri setleri farklı veri tipleri içeren, eksik girilmiş veya farklı aralıklarda sayısal değere sahip kolonlardan oluşabilir. Bu durum, ağın doğru ilişkiyi kuramamasına dolayısıyla öğrenmeyi gerçekleştirememesine sebep olur. Bu sorunu ortadan kaldırmak için çeşitli yöntemler kullanılır. Python dilinde bu işlemleri gerçekleştirmek için geliştirilmiş Pandas kütüphanesi büyük kolaylık sağlar. Veri tipleri:

  • Categorical
  • Ordinal
  • Continious
  • Datetime
  • Boolean

Pandas

import pandas as pd
df = pd.read_csv(path)
df.head() #Verinin ilk 5 satırına göz atmak için
df.columns #Kolonları yazdırır.
df.dtypes #Veri tiplerini yazdırır
df.select_dtypes(include=['dtype']) #Belirli bir veri tipi seçer. dtype int,float vb. olabilir

Encoding

Gerçek hayatta insanların anlayabileceği kategorik verileri (renk,yaş,ülke vb.) bilgisayarın anlayabileceği nümerik verilere dönüştürme işlemine encoding denir.

d = {'Meyve' : ['Elma','Armut','Muz','Muz','Üzüm','Armut']}
veri = pd.DataFrame(data=d)
veri

Bu verideki meyveleri nümerik verilere çevirmek için encoding yapabiliriz. Her meyveye sayısal bir değer atamak, kategorik verinin birinin diğerinden daha büyük değere sahip olması şeklinde öğrenileceği için doğru bir yöntem olmayacaktır. Elma = 1, Armut = 2 => Armut > Elma gibi. Bunun için her özelliğin o satırda seçilip seçilmediğini gösterecek binary şekilde kodlanır. Bunun için 2 farklı kodlama yapılabilir: 1. One-hot encoding 2. Dummy encoding 2 yöntemde pandasta aynı şekilde çağrılır.

pd.get_dummies(veri, columns=['Meyve'], prefix='M')

One-hot encoding n kategori için n kodlama yapar. get_dummies fonksiyonu ile one-hot encoding gerçekleştirilir. drop_first metodu eklenerek ise dummies encoding sağlanır. Dummies encoding n özellik için n-1 kodlama yapar ve kodlanmayan 1 seçenek kodlananların hiçbiri olmayan (hepsinin 0 olduğu) diğer durumu ifade eder.

pd.get_dummies(veri, columns=['Meyve'], drop_first=True, prefix='M')

Özelliklerin sayısını görmek için:

counts = veri['Meyve'].value_counts()
counts

Çıkış:

Armut    2
Muz 2
Üzüm 1
Elma 1
Name: Meyve, dtype: int64

Özellikleri sınırlamak için:

mask = veri['Meyve'].isin(counts[counts < 2].index)
mask

Çıkış:

0     True
1 False
2 False
3 False
4 True
5 False
Name: Meyve, dtype: bool

Maskeyi veriye uygularsak;

veri[mask] = 'Other'
veri['Meyve'].value_counts()

Çıkış:

Muz      2
Other 2
Armut 2
Name: Meyve, dtype: int64

Veri setinde 2den az bulunan özellikler (Elma,Üzüm) maskeleyip onların sayısının ‘Other’ şeklinde ifade ettik. Bu şekilde veri setinde belli bir sayıdan az, önem ifade etmeyen elemanları maskelemiş olduk.

Nümerik değişkenleri binary ifade etmek (Binarizing)

Öğrenci devamsızlıklarından oluşan bir veri seti olsun. Belirli sayıda devamsızlık yapmış olan öğrencileri belirlemek isteyelim.

data = { 'ogrenci':['Ali','Veli','Ahmet','Ayse','Merve','Betul'], 'devamsizlik':[1,3,2,10,2,4]}
ogr_dev = pd.DataFrame(data=data)
ogr_dev

Yeni bir kolon oluşturup devamsızlığı 5 günden fazla olan öğrencileri binary olarak ifade edelim. Başlangıç olarak tüm değerler 0.

ogr_dev['uyari'] = 0

Veri setinden alt grup seçimi: loc

ogr_dev.loc[ogr_dev['devamsizlik'] > 5, 'uyari'] = 1
ogr_dev

Aralıklara bölme (Binning)

Bu sefer devamsızlıkları belirli aralıklarla ifade edelim ve 5i geçmemiş ama yaklaşanları da belirleyelim. Pandas ile binning denilen bu işlemi yapmak için cut fonksiyonu kullanılır.

import numpy as npogr_dev['Binned_uyari'] = pd.cut(ogr_dev['devamsizlik'], bins=[0, 3, 5, np.inf], labels=['-','sinirda','siniri_asmis'])
ogr_dev

pd.cut fonksiyonunda bins ile aralıkları belirledik.

0–3 için -

3–5 için sinirda

5+ için siniri_asmis

--

--

Ayse Nur Erdem

Öğrendiklerimi paylaşmak, arşiv oluşturmak için bu blogu yazıyorum. Automation Developer🦜twitter: erdemaysenu