.. _sec_pandas:
Veri Ön İşleme
==============
Şimdiye kadar, zaten tensörlerde saklanan verilerde oynama yapmak için
çeşitli teknikleri tanıştırdık. Gerçek dünyadaki problemleri çözmede
derin öğrenme uygularken, genellikle tensör biçiminde güzel hazırlanmış
veriler kullanmak yerine ham verileri ön işleyerek başlarız. Python'daki
popüler veri analitik araçları arasında ``pandas`` paketi yaygın olarak
kullanılmaktadır. Python'un geniş ekosistemindeki diğer birçok uzatma
paketi gibi, ``pandas`` da tensörler ile birlikte çalışabilir. Bu
nedenle, ham verileri ``pandas`` ile ön işleme ve bunları tensör
formatına dönüştürme adımlarını kısaca ele alacağız. Daha sonraki
bölümlerde daha çok veri ön işleme tekniğini ele alacağız.
Veri Kümesini Okuma
-------------------
Örnek olarak, ``../data/house_tiny.csv`` isimli csv (virgülle ayrılmış
değerler) dosyasında saklanan yapay bir veri kümesi yaratarak
başlıyoruz. Diğer formatlarda saklanan veriler de benzer şekilde
işlenebilir.
Aşağıda veri kümesini satır satır bir csv dosyasına yazıyoruz.
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
import os
os.makedirs(os.path.join('..', 'data'), exist_ok=True)
veri_dosyasi = os.path.join('..', 'data', 'house_tiny.csv')
with open(veri_dosyasi, 'w') as f:
f.write('NumRooms,Alley,Price\n') # Sütun adları
f.write('NA,Pave,127500\n') # Her satır bir örnek temsil eder
f.write('2,NA,106000\n')
f.write('4,NA,178100\n')
f.write('NA,NA,140000\n')
Oluşturulan csv dosyasından ham veri kümesini yüklemek için ``pandas``
paketini içe aktarıyoruz ve ``read_csv`` işlevini çağırıyoruz. Bu veri
kümesinde dört satır ve üç sütun bulunur; burada her satırda oda sayısı
("NumRooms"), sokak tipi ("Alley") ve evin fiyatı ("Price") açıklanır.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
# Eğer pandas kurulu ise alt satırdaki yorumu kaldır
# !pip install pandas
import pandas as pd
veri = pd.read_csv(veri_dosyasi)
print(veri)
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
NumRooms Alley Price
0 NaN Pave 127500
1 2.0 NaN 106000
2 4.0 NaN 178100
3 NaN NaN 140000
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
# Eğer pandas kurulu ise alt satırdaki yorumu kaldır
# !pip install pandas
import pandas as pd
veri = pd.read_csv(veri_dosyasi)
print(veri)
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
NumRooms Alley Price
0 NaN Pave 127500
1 2.0 NaN 106000
2 4.0 NaN 178100
3 NaN NaN 140000
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
# Eğer pandas kurulu ise alt satırdaki yorumu kaldır
# !pip install pandas
import pandas as pd
veri = pd.read_csv(veri_dosyasi)
print(veri)
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
NumRooms Alley Price
0 NaN Pave 127500
1 2.0 NaN 106000
2 4.0 NaN 178100
3 NaN NaN 140000
.. raw:: html
.. raw:: html
Eksik Verileri İşleme
---------------------
"NaN" girdilerinin eksik değerler olduğuna dikkat edin. Eksik verilerle
başa çıkmak için, tipik yöntemler arasında *itham etme* ve *silme* yer
alır; burada itham etme eksik değerleri ikame edenlerle değiştirir,
silme ise eksik değerleri yok sayar. Burada ithamı ele alacağız.
Tamsayı-konuma dayalı indeksleme (``iloc``) ile, ``veri``\ yi
``girdiler``\ e ve ``ciktilar``\ a (çıktılar) böldük, burada girdi ilk
iki sütuna, çıktı ise son sütuna denk gelir. ``Girdiler``\ deki eksik
sayısal değerler için, "NaN" girdilerini aynı sütunun ortalama değeri
ile değiştiriyoruz.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
girdiler, ciktilar = veri.iloc[:, 0:2], veri.iloc[:, 2]
girdiler = girdiler.fillna(girdiler.mean())
print(girdiler)
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
NumRooms Alley
0 3.0 Pave
1 2.0 NaN
2 4.0 NaN
3 3.0 NaN
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
girdiler, ciktilar = veri.iloc[:, 0:2], veri.iloc[:, 2]
girdiler = girdiler.fillna(girdiler.mean())
print(girdiler)
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
NumRooms Alley
0 3.0 Pave
1 2.0 NaN
2 4.0 NaN
3 3.0 NaN
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
girdiler, ciktilar = veri.iloc[:, 0:2], veri.iloc[:, 2]
girdiler = girdiler.fillna(girdiler.mean())
print(girdiler)
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
NumRooms Alley
0 3.0 Pave
1 2.0 NaN
2 4.0 NaN
3 3.0 NaN
.. raw:: html
.. raw:: html
``Girdiler``\ deki kategorik veya ayrık değerler için ``NaN``'i bir
kategori olarak kabul ediyoruz. "Alley" sütunu yalnızca "Pave" ve "NaN"
olmak üzere iki tür kategorik değer aldığından, ``pandas`` bu sütunu
otomatik olarak "Alley\_Pave" ve "Alley\_nan" sütunlarına
dönüştürebilir. Sokak tipi "Pave" olan bir satır "Alley\_Pave" ve
"Alley\_nan" değerlerini 1 ve 0 olarak tayin eder. Sokak türü eksik olan
bir satır, değerlerini 0 ve 1 olarak tayin eder.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
girdiler = pd.get_dummies(girdiler, dummy_na=True)
print(girdiler)
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
NumRooms Alley_Pave Alley_nan
0 3.0 1 0
1 2.0 0 1
2 4.0 0 1
3 3.0 0 1
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
girdiler = pd.get_dummies(girdiler, dummy_na=True)
print(girdiler)
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
NumRooms Alley_Pave Alley_nan
0 3.0 1 0
1 2.0 0 1
2 4.0 0 1
3 3.0 0 1
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
girdiler = pd.get_dummies(girdiler, dummy_na=True)
print(girdiler)
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
NumRooms Alley_Pave Alley_nan
0 3.0 1 0
1 2.0 0 1
2 4.0 0 1
3 3.0 0 1
.. raw:: html
.. raw:: html
Tensör Formatına Dönüştürme
---------------------------
Artık ``girdiler``\ deki ve ``ciktilar``\ daki tüm girdi değerleri
sayısal olduğundan, bunlar tensör formatına dönüştürülebilir. Veriler bu
formatta olduğunda, daha önce tanıttığımız tensör işlevleri ile daha
fazla oynama yapılabilir :numref:`sec_ndarray`.
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
from mxnet import np
X, y = np.array(girdiler.values), np.array(ciktilar.values)
X, y
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
(array([[3., 1., 0.],
[2., 0., 1.],
[4., 0., 1.],
[3., 0., 1.]], dtype=float64),
array([127500, 106000, 178100, 140000], dtype=int64))
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
import torch
X, y = torch.tensor(girdiler.values), torch.tensor(ciktilar.values)
X, y
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
(tensor([[3., 1., 0.],
[2., 0., 1.],
[4., 0., 1.],
[3., 0., 1.]], dtype=torch.float64),
tensor([127500, 106000, 178100, 140000]))
.. raw:: html
.. raw:: html
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
import tensorflow as tf
X, y = tf.constant(girdiler.values), tf.constant(ciktilar.values)
X, y
.. raw:: latex
\diilbookstyleoutputcell
.. parsed-literal::
:class: output
(,
)
.. raw:: html
.. raw:: html
Özet
----
- Python'un geniş ekosistemindeki diğer birçok eklenti paketi gibi,
``pandas`` da tensörler ile birlikte çalışabilir.
- İtham etme ve silme, eksik verilerle baş etmek için kullanılabilir.
Alıştırmalar
------------
Daha fazla satır ve sütun içeren bir ham veri kümesi oluşturun.
1. En fazla eksik değerlere sahip sütunu silin.
2. Ön işlenmiş veri kümesini tensör formatına dönüştürün.
.. raw:: html
.. raw:: html
`Tartışmalar `__
.. raw:: html
.. raw:: html
`Tartışmalar `__
.. raw:: html
.. raw:: html
`Tartışmalar `__
.. raw:: html
.. raw:: html