GitHub Lab-TensorFlow Pokemon Course — 1

TensorFlow ile Pokemon durumlarını tahmin etmek için GitHub Learning Lab’deki kursu takip edeceğim.

Ayşe Demirel Deniz
4 min readJun 16, 2021

GitHub olanaklarını araştırırken fark ettim “GitHub Learning Lab” platformunu. Farklı düzeylerde lab imkanları sunuyor. Kendi kursumuzu oluşturabileceğimiz gibi, mevcuttaki kurslara da katılabiliyoruz. Peki nasıl?

Öncelikle GitHub hesabımızla giriş yapıyoruz. Kursların içeriklerini inceleyerek kursu başlatıyoruz. Kursu başlatınca GitHub hesabımızda bir repo oluşuyor ve issue açılıyor. Issue’ları takip ederek keyifli bir öğrenme sürecine başlıyoruz.

TensorFlow Pokemon kursuna gelirsek Python kullanıyoruz. İlk issue’da TensorFlow kurulumu için yönlendiriliyoruz. Tabi öncesinde Python kurulu diye düşünülüyor.

Aşağıdaki kod parçasını .py dosyasına yazıp derlediğimizde sorun ile karşılaşmamamız gerekiyor. Yani tensorFlow, numpy, matplotlib, sklearn ve pandas kurulu olması gerekiyor.

import tensorflow as tf
from tensorflow import keras
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import preprocessing

Yazılım olarak gerekli araçlarımız hazır ama makine öğrenmesinde en önemli adım veri aslında. Veri elde edebilmek için Kaggle kapısını çalıyoruz. Şuradaki link imdadımıza yetişiyor ve veri setimize kavuşuyoruz. Veri setinin içeriğine dair bir rapor ve csv dosyamız var. Veri içeriğine bakarsak her daldan veri olduğunu görüyoruz ve diyoruz ki bu nasıl iştir, bunlar nasıl ortak noktaya gelecek ?

Dosyayı okumayla başlayalım bir diyoruz ve aşağıdaki kodu dosyanın dizin bilgisi doğru olacak şekilde py dosyamıza ekliyoruz

pokemon_data = pd.read_csv('/dosya/dizini/pokemon.csv')

Bu satırı biraz inceleyelim burada pd dediğimiz nedir? Pandas kısaltması aslında. Veri okumayı Pandas kütüphanesi ile yapıyoruz. read_csv fonksiyonu ile de belirttiğimiz dizindeki csv dosyasını okuyoruz ve pokemon_data değişkeninde tutuyoruz.

CSV(Comma Seperated Value), virgülle ayrılan datalardır. Virgülle ayırma yaptığımız yerler sütun başlangıçlarını yeni satır yaptığımızda ise satır başlangıcını belirtiriz. İlk satır sütun başlıklarını belirlemek için kullanılır. Normal bir text editörde açtığımızda aşağıdaki gibi bir veri görürüz.

25,Pikachu,Electric,,320,35,55,40,50,50,90,1,False,Yellow,True,0.5,Field,Fairy,False,0.41,6.0,190,quadruped

Dosyayı okuduk ilk adımı attık, içeriği görüntüleyelim de doğru yaptığımızdan emin olalım değil mi :)

pokemon_data.columns

Yukarıdaki kodu eklediğimizde çıktıda veri dosyası içerisindeki sütun başlıklarını görürüz.

Sütunlara baktık ve birbiri ile alakasız başıklar gördük. O zaman ne yapacağız? Alakalı olanları almamız gerekiyor. Evet çok veri güzel ama alakasız veri sadece kirlilik oluşturur. Alakalı verileri bir araya getirmek için sütunları seçiyoruz ve aşağıdaki gibi veri setimizi daraltıyoruz.

pokemon_data = pokemon_data[['isLegendary','Generation', 'Type_1', 'Type_2', 'HP', 'Attack', 'Defense', 'Sp_Atk', 'Sp_Def', 'Speed','Color','Egg_Group_1','Height_m','Weight_kg','Body_Style']]

Veri setimizi daralttık ama hala tüm veriler aynı tipte değil. Örneğin “isLegendary” sütununa baktığımızda boolean değer görürken “Generation” sütununda integer değer “Type_1” sütunu ise string değerde. Boolean değeri kolaylıkla integer değere çevirebiliriz. Hızlıca dönüştürmek için astype(int) kullanabiliriz. Örneğin “isLegendary” sütununu aşağıdaki kod ile int değere çevirebiliriz.

pokemon_data['isLegendary'] = pokemon_data['isLegendary'].astype(int)

Kalan veriler için baktığımızda “Type_1” için bakalım mesela string değerler var. Nasıl numerik yapacağız? Water=1, Fire=2, Grass=3 gibi her değerde uzayan bir liste mi yapacağız? Bu pek idame ettirilebilir gibi durmuyor ve numerik sıraya anlam yüklersek su ateş ile ottan daha yakın ilişikili gibi anlamlar da çıkabiliyor. O yüzden dummy değer kullanabiliriz. Dummy değer kullanırken her farklı gördüğümüz değer için sütun açıyoruz aslında. Water, Fire, Grass için ayrı sütun oluşturulacak şimdi ve var-yok şeklinde numerik değer verilecek.

def dummy_creation(pokemon_data, dummy_categories):
for i in dummy_categories:
pokemon_data_dummy = pd.get_dummies(pokemon_data[i])
pokemon_data = pd.concat([pokemon_data,pokemon_data_dummy],axis=1)
pokemon_data = pokemon_data.drop(i, axis=1)
return(pokemon_data)

Dummy değer atamak için yukarıdaki fonksiyonu yazıyoruz. Fonsiyona verilen değişkenler de birincisinde daraltılmış veri setini veriyoruz ve ikinci olarak hangi satırlarda dummy değer isteğimizi belirtiyoruz. Fonksiyon içinde dummy değer atanacak sütunlara tek tek bakmak için döngü kullanıyoruz.

Dummy değer oluşturmak için Pandas içerisindeki get_dummies(…) fonksiyonunu kullanıyoruz. Nasıl bir işlevi olduğuna ayrı bir örnekte bakalım. Örneğin aşağıdaki koda baktığımızda ‘abca’ şeklinde verilen listede dummy değerler oluşturulurken 0. satır için a var b ve c yok dedik. Satır 1'de ise b var diğerleri yok denildi.

>>> s = pd.Series(list('abca'))
>>> pd.get_dummies(s)
a b c
0 1 0 0
1 0 1 0
2 0 0 1
3 1 0 0

Dummy değer atama fonksiyonuna balmaya devam edersek dummy değer oluşturulduğunda concat(…) işlemi ile karşılaşıyoruz. Bu fonksiyonun amacı verilenleri birleştirmek. Aşağıda farklı bir örnek ile bakarsak, verilen iki farklı seriyi birleştirdiğini görüyoruz.

>>> s1 = pd.Series(['a', 'b'])
>>> s2 = pd.Series(['c', 'd'])
>>> pd.concat([s1, s2])
0 a
1 b
0 c
1 d
dtype: object

Indexleri önemsemeden verileri birleştirsin istersek, “ignore_index=True” kullanılıyor.

>>> pd.concat([s1, s2], ignore_index=True)
0 a
1 b
2 c
3 d
dtype: object

Dummy değer atama fonksiyonunda ise “axis=1” görüyoruz. axis=0 dikey anlamda(y ekseni) axis=1 ise yatay anlamda(x ekseni) ifade için kullanılır. Yani axis=1 dediysek yatay eksende birleştirme yap demektir. Örneğin:

>>> s1 = pd.Series(['a', 'b'])
>>> s2 = pd.Series(['c', 'd'])
>>> df=pd.concat([s1, s2], axis=1)
0 1
0 a c
1 b d

Şimdi dummy oluşturduk verilerimizi uygun şekilde birleştirerek düzenledik geldi sıra istemediklerimizi tekrar elemeye. Bunun için de drop(…) fonksiyonunu kullanıyoruz. İstemediklerimiz burada hangileri artık bizim için anlamı olmayan dummy değerlerini oluşturduğumuz sütunlar. Yani Type_1 sütunu için “Water, Grass, Fire….” dummy değerlerini oluşturduk ayrı olarak Type_1 sütununa ihtiyacımız kalmadı.

Gereksizleri tekrar çıkarmamızla birlikte dummy değer oluşturma işlemimiz bitiyor. Elimizdeki veri setini sadeleştirdik ve numarik hale getirdik yani ortak bir noktada buluşturduk. Şimdi sıra veriyi daha bölme ve normalize etme işlemlerinde. Sonraki yazımızda bunun üzerine geliştirme yapacağız. İlk issue “Install and setup environment” çözüldü, sıradaki issue’larda görüşmek üzere :)

--

--