İçeriğe geç

Makine Öğrenmesi Verilerin Hazırlanması Kodlama 1

Bir önceki yazımda verileri nasıl kategorize edeceğimize dair sözel bilgileri ve gerekli mantıktan elimden geldiğince bahsetmiştim. Bu yazıya buradan ulaşabilirsiniz.

Şimdi gelelim asıl konumuz olan kodlamaya. Artık mantığa hakimiz ve artık veri setimizi düzenleyebiliriz. Ben veri seti olarak daha önceki yazılarımdan bir tanesinde kullandığım  Bank Marketing veri setini kullancağım bu veri setini nasıl kullandığımıza buradan ulaşabilirsiniz.

Burada örnek kolon olarak ben eğitim yani education kolonunu seçtim. Burada gördüğüm kadarı ile 4 adet eğitim tipi mevcut primary, secondary, tertiary, unknown kelimeler veri seti ingilizce olduğu için ingilizce yanlış çevirmiyor isem sırası ile ilkokul, orta okul, yükseköğretim, tanımsız yada bilinmiyor gibi çevrilebilir.

Öncelikle veri setimizi okuyalım.

import numpy as np
import pandas as pd

veriseti = pd.read_csv('bank/bank-full.csv', sep=';')

Bu komutu tekrar tekrar açıklamayacağım daha önceki yazılarda açıklamalar mevcut.

from sklearn.preprocessing import LabelEncoder
egitim=veriseti[['education']].values
le=LabelEncoder()
egitim[:,0]=le.fit(egitim[:,0]).transform(egitim[:,0])

Burada sklearn kütüphanesi içerisinde bulunan LabelEncoder kütüphanesini çağırıyoruz ilk satırda. İkinci satırda ise veri setimden education kolonunu egitim isimli tanımladığım değişkene atıyorum. le isimli bir değişkene labelencoder sınıfını çağırıyorum.

Burada son satırı açıklamadan önce bunun ne demek olduğunu açıklamaya çalışayım. Eğer print eğitim yazarsak aşağıdaki gibi bir çıktı gelecektir.

[['tertiary']
 ['secondary']
 ['secondary']
 ..., 
 ['secondary']
 ['secondary']
 ['secondary']]

Burada gözüken şu bir dizi var dizinin içerisinde dizi tipinde dizinler var. Fakat diziler arasında virgül olmaması dikkat çekici bir durum sebebini anlamak için dizinin tipini sorgularsak eğer (type ile) karşımıza şöyle bir çıktı gelecektir.

<type 'numpy.ndarray'>

Bu satır bize bunun bir normal dizi değilde numpy dizisi olduğu bilgisini veriyor. Yani klasik bir dizi ile işlem yapmıyoruz biz. Yani görmüş olduğunuz :,0 bölümü numpy bize kazandırdığı bir özellik python da normal diziler üzerinde aralık alma işlemleri vs. yapılsada numpy bunu daha da özelleştirmiş durumda detaylı bilgiyi buradan alabilirsiniz.

Daha sonrasında LabelEncoder’in fit ve transform methodları yardımı ile dönüşümü sağlıyoruz. En son durumda eğitimin çıktısı şu şekilde olacaktır.

[[2L]
 [1L]
 [1L]
 ..., 
 [1L]
 [1L]
 [1L]]

Burada gördüğümüz kadarı ile bizim eğitim tiplerimiz sayılara çevrildi. Peki bu sayıların sırası nedir?

print list(le.classes_)

Bu satır ile aşağıdaki çıktı elde edilmektedir.

['primary', 'secondary', 'tertiary', 'unknown']

Eğer biraz bilginiz ve dikkatiniz var ise hemen sıralamayı nasıl yaptığını fark edebilirsiniz. Sıralamamız şu şekildedir;

0:primary, 1:secondary, 2:tertiary, 3:unknown

Şimdilik tamam gibi gözüksede biz halen daha sayısal verilere sahibiz fakat bunları kategorize etmemiz gerekiyordu. Bunun için yine sklearn’e ait olan OneHotEncoder sınıfından yardım alabiliriz.

from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder()
egitim=ohe.fit_transform(egitim).toarray()
egitim=egitim.astype(np.byte)

Yukarıdaki işlemlerin benzer şekilde yapıyoruz. Burada farklı olarak fit_transform kullandık bu bizim için işleri sadece tek methodda yazmayı sağladı ve sonucun dizi olarak döneceğini belirttik. Tabi ki yine numpy dizisi şekilde dönecektir. Birde dönen değerlerin float olması sebebi ile byte çevirme işlemi gerçekleştirdik. Farklı komutları denemek ve uğraşmak için

En son çıktımız aşağıdaki gibi olacaktır.

[[0 0 1 0]
 [0 1 0 0]
 [0 1 0 0]
 ..., 
 [0 1 0 0]
 [0 1 0 0]
 [0 1 0 0]]

Tablo biraz tanıdık gelebilir eğer bit dönüşümleri çeviriciler vs. ile uğraştıysanız. Aslında her kolon bir eğitim tipini belirtirtmektedir. Ve satır olarak bakarsanız her satırda yanlızca bir adet 1 bulunmaktadır.

Kodumuzun son hali aşağıdaki gibi olacaktır. Kod üzerinden farklı denemeler yaptığım için yukarıdaki kodlardan farklı gözükebilir ama genel hatları ile aynı.

import numpy as np
import pandas as pd

veriseti = pd.read_csv('bank/bank-full.csv', sep=';')

from sklearn.preprocessing import LabelEncoder
egitim=veriseti[['education']].values
le=LabelEncoder()
egitim[:,0]=le.fit(egitim[:,0]).transform(egitim[:,0])
print egitim
print list(le.classes_)
from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder(categorical_features='all') #http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html
egitim=ohe.fit_transform(egitim).toarray()
egitim=egitim.astype(np.byte)
print egitim

 

Tarih:Makine Öğrenmesi

İlk Yorumu Siz Yapın

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir