Python ile Yapay Zekâ (Veri Hazırlama) #3

LEOHUNTERA

Üye
31 Ara 2018
79
3
Giriş:

Yapay Zekâ konusu ile ilgili şimdiye kadar Temel Kavramlar ve Makine Öğrenmesi konularında bilgi sahibi olarak, Yapay Zekânın temel konularına değinmiştik. Eğer bu konuları okumadıysanız, konu isimlerine tıklayarak bu konulara gidebilirsiniz.

Not: Eğitim Serisinin ve Öğrenme Sürecinin daha etkili bir şekilde ilerleyebilmesi için öncelikle bu konuları okumanız önerilir.

Bugünki konumuzda Makine Öğrenmesi Algoritmalarına girdi olarak verdiğimiz Veri konusuna değineceğiz. Makine Öğrenmesi Algoritmalarına girdiler verebilmemiz için, bu girdilerin formatlarının, bizim Makine Öğrenmesi Algoritmalarımıza uyumlu olması gerekir. Bir başka deyişle, Makine Öğrenmesi Algoritmaları gerçek hayattaki verilerden beslenir ve bu veriler çoğunlukla ham formattadır. Öncelikle bu verileri işleyerek hamlığını gidermemiz ve istediğimiz şekile sokmamız gerekir. Bugünki konuda da Python dilindeki çeşitli kütüphaneleri kullanarak bu verilerin ham formattan, algoritmalarımıza girdi olarak verebileceğimiz uyumlu formata nasıl dönüştüreceğimizi inceleyeceğiz.

images


Neden Veri İşlemeye İhtiyaç Duyarız?

Yukarıda bu konuyu açıklamıştık ama daha da iyi anlaşılabilmesi için bir örnekle üzerinden geçelim. Biz İnsanlar konuşarak anlaşırız. Eğer karşınızdaki bir kişi Sizin hiç bilmediğiniz bir dille Size bazı şeyleri ifade etmeye çalışırsa doğal olarak hiçbir şey anlamazsınız. Bu yapı her şey için geçerlidir. Dünyada var olan herşey ortak bir protokol esasıyla ortaya çıkmıştır. Tabiki Dünyaya anlam katan Bilgisayar Bilimleri de buradan nasibini almıştır. Özetlersek, Bizler aslında Veri Sunum yapısıyla, yukarıda verilen örnekteki gibi dış Dünyadaki veriler ile Bilgisayar arasında bir protokol oluşturarak, bu protokol aracılığıyla Bilgisayarların, dış Dünyadaki verileri anlamlandırabilmesini sağlıyoruz. Dış dünyadan aldığımız verileri belirli kurallar çerçevesinde belirli formatlara çevirip Bilgisayarlarımıza sunuyoruz. Şimdi, eğer bu kısmı anladık ve özümsediysek, artık yavaş yavaş konumuza geçelim.

Kullanılan Dil ve Kütüphaneler

Bu konu kapsamında ham verileri uygun formatlara çevirmek için yapılan örnekler Python dilindeki NumPy ve Sklearn.preprocessing kütüphaneleri kullanılarak yapılmıştır.

NumPy Kütüphanesi
NumPy, genel olarak dizi işlemek için kullanılan bir Python kütüphanesidir. Bu kütüphanelerle dizileri işleyerek uygun formatlara dönüştürebliriz.

Sklearn.preprocessing Kütüphanesi
Scikit-learn kütüphanesi, Python da önceden gerçekleştirilmiş olan Makine Öğrenmesi Algoritmalarını barındıran ve bunları kullanmamızı sağlayan bir kütüphanedir. Scikit-learn kütüphanesinin içerisindeki bir modül olan Sklearn.preprocessing kütüphanesi ise, Bu algoritmalara sunulacak verileri işlemek için oluşturulmuş bir kütüphanedir.

Bu kütüphaneleri kullanabilmemiz için öncelikle içe aktaralım:
Kod:
[COLOR="Lime"]import[/COLOR] numpy
[COLOR="Lime"]import[/COLOR] sklearn.preprocessing

Bu kütüphaneleri içe aktardıktan sonra, artık çalışmaya başlayabiliriz. Öncelikle dış ortamdan aldığımız bir verimiz olduğunu varsayalım. Bu veriler herhangi bir sensör aracılığıyla alınmış bir veri veya geçen derslerde gördüğümüz veri setinin herhangi bir niteliği olabilir:
Kod:
giris_verisi = [COLOR="Lime"]numpy[/COLOR].array([2.1, -1.9, 5.5],
                                      [-1.5, 2.4, 3.5],
                                      [0.5, -7.9, 5.6],
                                      [5.9, 2.3, -5.8]])
Burada numpy kütüphanemizin array metodunu kullandığımıza dikkat edin. Bu metotla, verimizi bir numpy dizisine dönüştürerek, numpy kütüphanesinin içerisindeki çeşitli özelliklere erişebilmeyi ve veri biçimlendirmek için gereken veri kalıbımızı oluşturmayı amaçlıyoruz.

Şimdi verilerimizi çeşitli biçimlere dönüştürme metotlarımızı inceleyelim:

Veri Biçimlendirme Metotları

İkili Veriye Dönüştürme (1 - 0)

Bu veri biçimlendirme tekniğinde, verilerimizi verilen bir eşik değere göre 1 ve 0 değerlerine çeviriyoruz.
Kod:
ikili_veri = [COLOR="Lime"]sklearn.preprocessing[/COLOR].[COLOR="purple"]Binarizer[/COLOR](threshold = 0.5).transform(giris_verisi)
[COLOR="Lime"]print[/COLOR]("\nİkili biçime dönüştürülmüş veri:\n", ikili_veri)

Buradaki kod ile sklearn.preprocessing kütüphanesinin Binarizer metodunu kullanarak, bu metoda verdiğimiz "threshold = 0.5" parametresiyle 0.5 eşik değerinin üzerindeki verileri 1 e, bu eşik değerin altındaki verileride 0 a çeviriyoruz.

Çıktımız şu şekilde olacaktır:
Kod:
İkili biçime dönüştürülmüş veri:
[[ 1. 0. 1.]
 [ 0. 1. 1.]
 [ 0. 0. 1.]
 [ 1. 1. 0.]]

Ölçekleme

Ölçekleme, bir veri seti içerisindeki verilerin uygun aralıklara yerleştirilmesi işlemidir. Veri seti içerisindeki bazı veriler çok büyük olabilirken, bazı verilerde çok küçük olabilir. Geçen konularda da bahsettiğimiz gibi Makine Öğrenmesi Algoritmaları girdi olarak verilen bir veri setinin arasındaki ilişkileri bularak, bu ilişkilere göre Matematiksel bir model oluşturur. Bu modelin oluşturulmasında verilerin kendi büyüklüklerinin bir önemi yoktur. Önemli olan verilerin birbirlerine göre(görece) büyüklükleridir. Bunun için Veri setimizin içerisindeki çok büyük verilerle uğraşmak yerine bu verileri daha küçük bir alanın içerisine sığdırarak, bu alanda çalışabiliriz. Genel olarak ölçekleme işlemi, verilerin kendi büyüklüklerini küçültmemizi sağlarken, aynı zamanda bu verilerin kendi aralarındaki, birbirlerine göre olan büyüklüklerini sabit tutması sayesinde büyük bir kolaylık sağlar.

Ayrıca bazı durumlarda veri ölçekleme işlemi zorunlu bir durum haline dönüşebilir.Şöyle ki:

Algoritmamıza sunacağımız veri setimizin içerisinde sıcaklık ve rakım gibi değerlerimizin olduğunu düşünelim. Bu verilerin kendi içerisindeki farkları sıcaklık değerlerinde düşükken, rakım değerleri arasındaki farklar ise çok büyük olabilir. Bu aşamada Algoritmalarımız, verileri bu şekilde istenmeyen şekilde işleyebilir. Bunun için verilerimizi tutarlı hale getirmemiz gerekir. Biraz daha açarsak, veriler bir model oluşturulması için işlenirken, rakım mesafeleri çok uzak olduğu için, bu sonucu önemli ölçüde etkileyecektir. Sıcaklık değerleri de birbirine yakın değerler olduğu için, rakım mesafesine göre modellemeyi daha az etkileyecektir. Bu istemediğimiz bir durumdur ve modellememizi olumsuz etkiler. Halbuki modellememizin olabildiğince tutarlı ve en etkin şekilde oluşturulması gerekmektedir.

Max-Min Ölçekleme

Max-Min ölçekleme, verileri belirtilen değerlerin arasına sığdırarak, bu verileri ölçekleme yi amaçlar. Örneğin yukarıda belirttiğimiz giriş verilerimizi kullanarak bir Max-Min ölçeklemesini
python diliyle nasıl yapabileceğimize bakalım.

Kod:
veri_olcekleme_nesnesi = [COLOR="Lime"]sklearn.preprocessing[/COLOR].[COLOR="purple"]MinMaxScaler[/COLOR](feature_range=(0,1))
olceklenmis_veri = veri_olcekleme_nesnesi.[COLOR="Purple"]fit_transform[/COLOR](giris_verisi)
print ("Min Max ölçekleme yöntemiyle ölçeklenmiş veri: \n", olceklenmis_veri)

Çıktımız şu şekilde olacaktır:
Kod:
Min Max ölçekleme yöntemiyle ölçeklenmiş veri:
[ [ 0.48648649  0.58252427   0.99122807]
[   0.          1.           0.81578947]
[   0.27027027  0.           1.        ]
[   1.          0. 99029126  0.        ]]

Kodlarımızı inceleyecek olursak, ilk adımda sklearn.preprocessing kütüphanesinin içerisindeki MinMaxScaler metodu ile Min Max ölçekleme nesnesi oluşturduk. Bu metoda parametre olarak verdiğimiz feature_range=(0,1) değerlerimizle de, verilerimizin Min=0, Max=1 aralığına yerleştirilmesini söylemiş olduk.

Nesnemizi oluşturduktan sonra, fit_transform metodu ile de işlenilmesini istediğimiz veriyi belirlediğimiz aralıkta ölçeklendirmesini (haritalandırmasını, yerleştirmesini) söyledik.

Normalleştirme

Normalleştirme, verilerin özellik vektörlerinin normal bir biçime oturtulmasına dayanır. Bu teknikte özellik vektörlerinin kendi içerisinde ve birbirleri arasında tutarlı ve ortak bir yapıya kavuşması sağlanarak, gerekli olan veri işlenmiş olur.

L1 Normalleştirme

En az mutlak sapma olarak ta adlandırılan bu normalleştirme türü, verilerin birbirleri içerisinde sapmaların en az olmasını ve özellik vektörlerinin (her bir satır) kendi içerisinde tutarlı bir yapıya kavuşarak, diğer özellik vektörleriyle uygun bir ölçüm yapısına ulaşmasını amaçlar.

Kod:
veri_normallestirme_l1 = [COLOR="Lime"]sklearn.preprocessing[/COLOR].[COLOR="Purple"]normalize[/COLOR](giris_verisi, norm = 'l1')
print("L1'e göre normalleştirilmiş veri: \n", veri_normallestirme_l1)

Burada, sklearn.preprocessing kütüphanesinin normalize metodu kullanılarak L1 normalleştirme yapılmıştır. normalize metoduna verilen 1. parametre işlenilmesi istenilen veri iken, 2. parametre ise hangi normalizasyon formuna göre normalleştirme yapılması gerektiğinin belirtimidir.

Çıktımız şu şekilde olacaktır:
Kod:
L1'e göre normalleştirilmiş veri:
[[ 0.22105263  -0.2          0.57894737]
[ -0.2027027    0.32432432   0.47297297]
[  0.03571429  -0.56428571   0.4]
[  0.42142857   0.16428571  -0.41428571]]

L2 Normalleştirme

En küçük kareler olarak ta adlandırılan bu normalleştirme formunda, L1 normalleştirmesine göre verilerin değerleri arasındaki fark biraz daha fazladır.

Kod:
veri_normallestirme_l2 = [COLOR="Lime"]sklearn.preprocessing[/COLOR].[COLOR="Purple"]normalize[/COLOR](giris_verisi, norm = 'l2')
print("L2'e göre normalleştirilmiş veri: \n", veri_normallestirme_l2)

Buradaki kod, yukarıda belirtilen kodla aynıdır ama normalize metodunun norm parametresini 'l2' olarak değiştirdiğimize dikkat edin.

Çıktımız şu şekilde olacaktır:
Kod:
L2'e göre normalleştirilmiş veri:
[[ 0.33946114  -0.30713151   0.88906489]
[ -0.33325106   0.53320169   0.7775858 ]
[  0.05156558  -0.81473612   0.57753446]
[  0.68706914   0.26784051  -0.6754239 ]]

L1 ve L2 Normalizasyon formlarının karşılaştırmasını daha detaylı olarak buradan inceleyebilirsiniz.

Veri Etiketleme

Artık verilerimizi Makine Öğrenmesi algoritmalarımıza girdi olarak vermeden önce biçimlendirmemiz gerektiğini biliyoruz. Bir başka önemli gereksinimimiz ise verilerimizi Makine Öğrenmesi Algoritmalarımıza göndermeden önce doğru olarak etiketleme gerekliliğidir. Bu şekilde sınıflandırmalarımızı doğru şekilde yaparak, her türden veriyi biçimine bakmaksızın etiketleme işleminin yardımıyla işleyebiliriz. Etiketleme işleminin gerekliliğinin bir başka açıdan nedeni de Python üzerindeki Makine Öğrenmesi kütüphanesi olan sklearn kütüphanesinin sayısal verilerle çalışabiliyor olmasıdır. Etiketlenmiş olan verileri kolayca sayısal verilere kodlayarak, kolaylıkla algoritmalarımıza uyumlu hâle getirebiliriz.

Bunu daha da açıklayıcı olması açısından şöyle örnekleyebiliriz;

Diyelim ki elimizde çeşitli hastalık belirtilerine göre, bu belirtilere neden olan hastalığın yer aldığı bir veri setimiz olduğunu düşünelim. Bu veri setimizin içerisindeki bazı belirtiler, sayısal bir değer olmayabilir. Ki nitekim hastalık değerimizde sayısal değer değil, metin tabanlı bir değer olacaktır.(Kanser, Nezle, Down Sendromu vb. gibi) İşte tam da bu noktada öncelikle verilerimizi etiketliyoruz. (Burada etiketleme, hastalıkları risk derecelerine göre gruplandırmak olarak görülebilir.) Daha sonra bu etiketlere sayısal kodlar atayarak, bu kodlar aracılığıyla Makine Öğrenmesi Algoritmamızı gerçekleştirebiliyoruz. Yani bir anlamda SOYUTLAMA yapıyoruz.

Gerekli açıklamalarımızı yaptığımıza göre artık Python tarafından sunulan kütüphaneleri kullanarak, bir kaç örnek yaparak konumuzu pekiştirelim.

Gerekli kütüphanemizi içe aktaralım (Python sklearn kütüphanesi içerisindeki preprocessing metodunu içe aktarıyoruz):
Kod:
[COLOR="Purple"]from[/COLOR] sklearn [COLOR="Purple"]import[/COLOR] [COLOR="Lime"]preprocessing[/COLOR]

Kodlayacağımız etiketlerimizi oluşturalım:
Kod:
etiketlenmis_girdi = ['kırmızı','siyah','kırmızı','yeşil','siyah','sarı','beyaz']

Şimdi kodlayacağımız etiketlerimizi oluşturduğumuza göre, bir etiketleme nesnesi oluşturarak, verilerimizi etiketleyelim.
Kod:
kodlayici= [COLOR="Lime"]preprocessing[/COLOR].[COLOR="Purple"]LabelEncoder()[/COLOR]
kodlayici.[COLOR="Purple"]fit[/COLOR](etiketlenmis_girdi)

Buradaki kodlar ile bir LabelEncoder nesnesi oluşturarak, kodlayacağımız etiketler için LabelEncoder nesnesinin eğitimi yapılmıştır.

Çıktımız şu şekilde olacaktır:
Kod:
LabelEncoder()

Şimdi elimizdeki LabelEncoder nesnemizi kullanarak, nesnemizi eğitmek için kullandığımız etiketlerimizi kodlayabiliriz.

Kod:
kodlanacak_etiketler = ['yeşil','kırmızı','siyah']
kodlanmis_etiketler = kodlayici.[COLOR="Purple"]transform[/COLOR](kodlanacak_etiketler)
print("Kodlanmış Etiketler=",[COLOR="Lime"]list[/COLOR](kodlanmis_etiketler))

Bu kod ile öncelikle ['yeşil','kırmızı','siyah'] etiketlerimizi (ki burada etiketten kastımız, veri setimiz için belirlediğimiz sınıflarımızdır.) sayısal bir değerle kodlamak için, LabelEncoder(kodlayici değişkeni) nesnemizin transform metoduna argüman olarak vererek, bu etiket değerlerimizi kodlamış oluyoruz. (Yani String türünden değerleri olan etiketlerimizi Algoritmalarımızda işleyebileceğimiz sayısal değerlerle kodlamış oluyoruz.)

Çıktımız şu şekilde olacaktır:

Kod:
[4, 1, 3]

Şimdi elimizde kodlanmış değerlerimiz olduğunu ve bu değerlerin kodlarını çözerek etiketlere ulaşmak istediğimizi düşünelim. Bunu şu şekilde yapabiliriz:

Kod:
kodlanmis_degerler = [3, 0, 4, 1]
cozulmus_degerler = kodlayici.[COLOR="Purple"]inverse_transform[/COLOR](kodlanmis_degerler)
print("Kodu çözülmüş veriler=",[COLOR="Lime"]list[/COLOR](cozulmus_degerler))


Burada da LabelEncoder nesnemizin inverse_transform metodunu kullanarak kodlanmış değerlerimizi çözüyoruz.

Çıktımız şu şekilde olacaktır:
Kod:
Kodu çözülmüş veriler= ['siyah', 'beyaz', 'yeşil', 'kırmızı']

Etiketlenmiş Veriler ve Kodlanması İşlemi

Genel olarak etiketlenmiş veriler sınıflarımızı temsil eder. Yani yukarıda örneğini yaptığımız renk etiketleri için düşünecek olursak;

Burada renklerimiz işlediğimiz girdi verilerimizin çıktısı olan bir sınıftır. Yani elimizde bir veri seti vardır ve biz bu veri setini işleyerek, sonucun kırmızı mı, yeşil mi, sarı mı... olduğunu bulmaya çalışırız. İşte tam da bu noktada işin içerisine String olan veriler girmektedir ve bu verileri Algoritmalarımızda işleyebilmek için, String verilerimizi Sayısal bir yapıya dönüştürmemiz gerekir. Tüm bu işlemleri yapabilmek için bir LabelEncoder nesnesi kullanırız.

Yani özetlersek, bu şekilde String verilerimizi Sayısal bir türe dönüştürerek Algoritmalarımızda kullanıp, elde ettiğimiz sonuçlarıda yeniden Etiket İsimlerine dönüştürebiliriz.


Bu aşamada Makine Öğrenmesi konusunun en önemli ve temel konularından olan veri işleme konusuna değinerek, bu konuyla ilgili genel bir fikir edinmeye çalıştık. Bu aşamadan sonra belirli Makine Öğrenmesi Algoritmalarını ele alarak, bu algoritmaların çalışma yapısını inceleyip, örnekler üzerinden pekiştirerek Python dili ile kodlanması işlemini yapacağız.
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.