Python ile Makine Öğrenimi - Veri Hazırlama

Giriş

Makine Öğrenimi algoritmaları tamamen verilere bağlıdır çünkü model eğitimini mümkün kılan en önemli özelliktir. Öte yandan, ML algoritmalarına beslemeden önce bu verilerden bir anlam çıkaramazsak, bir makine işe yaramaz. Basit bir deyişle, makinenin çözmesini istediğimiz problem için her zaman doğru verileri, yani verileri doğru ölçekte, formatta ve anlamlı özellikler içeren beslememiz gerekir.

Bu, veri hazırlamayı makine öğrenimi sürecinde en önemli adım yapar. Veri hazırlama, veri setimizi makine öğrenimi sürecine daha uygun hale getiren prosedür olarak tanımlanabilir.

Neden Veri Ön İşleme?

Makine öğrenimi eğitimi için ham verileri seçtikten sonra, en önemli görev verilerin ön işlemesidir. Geniş anlamda, veri ön işleme, seçilen verileri ML algoritmalarına birlikte çalışabileceğimiz veya besleyebileceğimiz bir forma dönüştürecektir. Verilerimizi her zaman makine öğrenimi algoritmasının beklentisine uygun olacak şekilde önceden işlememiz gerekir.

Veri Ön İşleme Teknikleri

Makine öğrenimi algoritmaları için veri üretmek üzere veri kümesine uygulanabilecek aşağıdaki veri ön işleme tekniklerine sahibiz:

Ölçeklendirme

Büyük olasılıkla veri kümemiz değişen ölçeğe sahip özniteliklerden oluşuyor, ancak bu tür verileri ML algoritmasına sağlayamıyoruz, dolayısıyla yeniden ölçeklendirme gerektiriyor. Veri yeniden ölçeklendirme, özniteliklerin aynı ölçekte olmasını sağlar. Genel olarak, öznitelikler 0 ve 1 aralığına yeniden ölçeklenir. Gradyan inişi ve k-En Yakın Komşular gibi ML algoritmaları, ölçeklendirilmiş veri gerektirir. Scikit-learn Python kitaplığının MinMaxScaler sınıfı yardımıyla verileri yeniden ölçeklendirebiliriz.

Misal

Bu örnekte, daha önce kullandığımız Pima Indians Diabetes veri setinin verilerini yeniden ölçeklendireceğiz. Öncelikle CSV verileri yüklenecek (önceki bölümlerde yapıldığı gibi) ve ardından MinMaxScaler sınıfı yardımıyla 0 ve 1 aralığında yeniden ölçeklendirilecektir.

Aşağıdaki komut dosyasının ilk birkaç satırı, CSV verilerini yüklerken önceki bölümlerde yazdığımızla aynıdır.

from pandas import read_csv
from numpy import set_printoptions
from sklearn import preprocessing
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(path, names=names)
array = dataframe.values

Şimdi, 0 ve 1 aralığındaki verileri yeniden ölçeklendirmek için MinMaxScaler sınıfını kullanabiliriz.

data_scaler = preprocessing.MinMaxScaler(feature_range=(0,1))
data_rescaled = data_scaler.fit_transform(array)

Ayrıca çıktı için verileri seçimimize göre özetleyebiliriz. Burada hassasiyeti 1 olarak ayarlıyoruz ve çıktıdaki ilk 10 satırı gösteriyoruz.

set_printoptions(precision=1)
print ("\nScaled data:\n", data_rescaled[0:10])

Çıktı

Scaled data:
[
   [0.4 0.7 0.6 0.4 0.  0.5 0.2 0.5 1. ]
   [0.1 0.4 0.5 0.3 0.  0.4 0.1 0.2 0. ]
   [0.5 0.9 0.5 0.  0.  0.3 0.3 0.2 1. ]
   [0.1 0.4 0.5 0.2 0.1 0.4 0.  0.  0. ]
   [0.  0.7 0.3 0.4 0.2 0.6 0.9 0.2 1. ]
   [0.3 0.6 0.6 0.  0.  0.4 0.1 0.2 0. ]
   [0.2 0.4 0.4 0.3 0.1 0.5 0.1 0.1 1. ]
   [0.6 0.6 0.  0.  0.  0.5 0.  0.1 0. ]
   [0.1 1.  0.6 0.5 0.6 0.5 0.  0.5 1. ]
   [0.5 0.6 0.8 0.  0.  0.  0.1 0.6 1. ]
]

Yukarıdaki çıktıdan, tüm veriler 0 ve 1 aralığına yeniden ölçeklendi.

Normalleştirme

Bir başka yararlı veri ön işleme tekniği Normalizasyondur. Bu, her veri satırını 1 uzunluğa sahip olacak şekilde yeniden ölçeklendirmek için kullanılır. Bu, çoğunlukla çok fazla sıfırın olduğu Seyrek veri kümesinde kullanışlıdır. Scikit-learn Python kitaplığının Normalizer sınıfı yardımıyla verileri yeniden ölçeklendirebiliriz.

Normalleştirme Türleri

Makine öğreniminde, aşağıdaki gibi iki tür normalleştirme ön işleme tekniği vardır:

L1 Normalleştirme

Veri kümesi değerlerini, her satırda mutlak değerlerin toplamı her zaman 1'e kadar olacak şekilde değiştiren normalleştirme tekniği olarak tanımlanabilir. Buna En Az Mutlak Sapmalar da denir.

Example

Bu örnekte, daha önce kullandığımız Pima Indians Diabetes veri setinin verilerini normalleştirmek için L1 Normalize tekniğini kullanıyoruz. Önce CSV verileri yüklenecek ve ardından Normalizer sınıfı yardımıyla normalize edilecektir.

Aşağıdaki komut dosyasının ilk birkaç satırı, CSV verilerini yüklerken önceki bölümlerde yazdığımızla aynıdır.

from pandas import read_csv
from numpy import set_printoptions
from sklearn.preprocessing import Normalizer
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv (path, names=names)
array = dataframe.values

Şimdi, verileri normalleştirmek için Normalizer sınıfını L1 ile kullanabiliriz.

Data_normalizer = Normalizer(norm='l1').fit(array)
Data_normalized = Data_normalizer.transform(array)

Ayrıca çıktı için verileri seçimimize göre özetleyebiliriz. Burada hassasiyeti 2'ye ayarlıyoruz ve çıktıdaki ilk 3 satırı gösteriyoruz.

set_printoptions(precision=2)
print ("\nNormalized data:\n", Data_normalized [0:3])

Output

Normalized data:
[
   [0.02 0.43 0.21 0.1  0. 0.1  0. 0.14 0. ]
   [0.   0.36 0.28 0.12 0. 0.11 0. 0.13 0. ]
   [0.03 0.59 0.21 0.   0. 0.07 0. 0.1  0. ]
]

L2 Normalleştirme

Veri kümesi değerlerini, her satırda karelerin toplamı her zaman 1'e kadar olacak şekilde değiştiren normalleştirme tekniği olarak tanımlanabilir. En küçük kareler olarak da adlandırılır.

Example

Bu örnekte, daha önce kullandığımız Pima Indians Diabetes veri setinin verilerini normalleştirmek için L2 Normalizasyon tekniğini kullanıyoruz. Önce CSV verileri yüklenecek (önceki bölümlerde yapıldığı gibi) ve ardından Normalizer sınıfı yardımıyla normalize edilecektir.

Aşağıdaki komut dosyasının ilk birkaç satırı, CSV verilerini yüklerken önceki bölümlerde yazdığımızla aynıdır.

from pandas import read_csv
from numpy import set_printoptions
from sklearn.preprocessing import Normalizer
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv (path, names=names)
array = dataframe.values

Şimdi, verileri normalleştirmek için Normalizer sınıfını L1 ile kullanabiliriz.

Data_normalizer = Normalizer(norm='l2').fit(array)
Data_normalized = Data_normalizer.transform(array)

Ayrıca çıktı için verileri seçimimize göre özetleyebiliriz. Burada hassasiyeti 2'ye ayarlıyoruz ve çıktıdaki ilk 3 satırı gösteriyoruz.

set_printoptions(precision=2)
print ("\nNormalized data:\n", Data_normalized [0:3])

Output

Normalized data:
[
   [0.03 0.83 0.4  0.2  0. 0.19 0. 0.28 0.01]
   [0.01 0.72 0.56 0.24 0. 0.22 0. 0.26 0.  ]
   [0.04 0.92 0.32 0.   0. 0.12 0. 0.16 0.01]
]

İkilileştirme

Adından da anlaşılacağı gibi, bu, verilerimizi ikili hale getirebileceğimiz tekniktir. Verilerimizi ikili yapmak için ikili bir eşik kullanabiliriz. Bu eşik değerin üzerindeki değerler 1'e ve bu eşiğin altındaki değerler 0'a dönüştürülecektir. Örneğin, eşik değeri = 0.5 seçersek, üstündeki veri kümesi değeri 1 olacak ve bunun altındaki değerler 0 olacaktır. neden arayabilirizbinarizing veri veya thresholdingveri. Bu teknik, veri setimizde olasılıklar olduğunda ve bunları net değerlere dönüştürmek istediğimizde kullanışlıdır.

Scikit-learn Python kitaplığının Binarizer sınıfı yardımıyla verileri ikileştirebiliriz.

Misal

Bu örnekte, daha önce kullandığımız Pima Indians Diabetes veri setinin verilerini yeniden ölçeklendireceğiz. Önce CSV verileri yüklenecek ve ardından Binarizer sınıfı yardımıyla eşik değerine bağlı olarak 0 ve 1 gibi ikili değerlere dönüştürülecektir. 0.5 eşik değeri alıyoruz.

Aşağıdaki komut dosyasının ilk birkaç satırı, CSV verilerini yüklerken önceki bölümlerde yazdığımızla aynıdır.

from pandas import read_csv
from sklearn.preprocessing import Binarizer
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(path, names=names)
array = dataframe.values

Şimdi, verileri ikili değerlere dönüştürmek için Binarize sınıfını kullanabiliriz.

binarizer = Binarizer(threshold=0.5).fit(array)
Data_binarized = binarizer.transform(array)

Burada çıktıdaki ilk 5 satırı gösteriyoruz.

print ("\nBinary data:\n", Data_binarized [0:5])

Çıktı

Binary data:
[
   [1. 1. 1. 1. 0. 1. 1. 1. 1.]
   [1. 1. 1. 1. 0. 1. 0. 1. 0.]
   [1. 1. 1. 0. 0. 1. 1. 1. 1.]
   [1. 1. 1. 1. 1. 1. 0. 1. 0.]
   [0. 1. 1. 1. 1. 1. 1. 1. 1.]
]

Standardizasyon

Temelde veri özniteliklerini bir Gauss dağılımı ile dönüştürmek için kullanılan başka bir yararlı veri ön işleme tekniği. Ortalama ve SD'yi (Standart Sapma), ortalaması 0 ve SD'si 1 olan standart bir Gauss dağılımına ayırır. Bu teknik, doğrusal regresyon, girdi veri kümesinde Gauss dağılımını varsayan ve daha iyi üreten lojistik regresyon gibi ML algoritmalarında kullanışlıdır. yeniden ölçeklendirilmiş verilerle sonuçlar. Scikit-learn Python kitaplığının StandardScaler sınıfı yardımıyla verileri standartlaştırabiliriz (ortalama = 0 ve SD = 1).

Misal

Bu örnekte, daha önce kullandığımız Pima Indians Diabetes veri setinin verilerini yeniden ölçeklendireceğiz. Önce CSV verileri yüklenecek ve ardından StandardScaler sınıfının yardımıyla ortalama = 0 ve SD = 1 ile Gauss Dağılımına dönüştürülecektir.

Aşağıdaki komut dosyasının ilk birkaç satırı, CSV verilerini yüklerken önceki bölümlerde yazdığımızla aynıdır.

from sklearn.preprocessing import StandardScaler
from pandas import read_csv
from numpy import set_printoptions
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(path, names=names)
array = dataframe.values

Şimdi, verileri yeniden ölçeklendirmek için StandardScaler sınıfını kullanabiliriz.

data_scaler = StandardScaler().fit(array)
data_rescaled = data_scaler.transform(array)

Ayrıca çıktı için verileri seçimimize göre özetleyebiliriz. Burada hassasiyeti 2'ye ayarlıyoruz ve çıktıdaki ilk 5 satırı gösteriyoruz.

set_printoptions(precision=2)
print ("\nRescaled data:\n", data_rescaled [0:5])

Çıktı

Rescaled data:
[
   [ 0.64  0.85  0.15  0.91 -0.69  0.2   0.47  1.43  1.37]
   [-0.84 -1.12 -0.16  0.53 -0.69 -0.68 -0.37 -0.19 -0.73]
   [ 1.23  1.94 -0.26 -1.29 -0.69 -1.1   0.6  -0.11  1.37]
   [-0.84 -1.   -0.16  0.15  0.12 -0.49 -0.92 -1.04 -0.73]
   [-1.14  0.5  -1.5   0.91  0.77  1.41  5.48 -0.02  1.37]
]

Veri Etiketleme

Makine öğrenimi algoritmaları için iyi verilerin önemini ve verileri makine öğrenimi algoritmalarına göndermeden önce önceden işlemek için bazı teknikleri tartıştık. Bu bağlamda bir başka husus da veri etiketlemedir. Verileri doğru etiketlemeye sahip makine öğrenimi algoritmalarına göndermek de çok önemlidir. Örneğin, sınıflandırma problemleri durumunda, veriler üzerinde kelime, sayı vb. Şeklinde çok sayıda etiket vardır.

Etiket Kodlama nedir?

Sklearn işlevlerinin çoğu, verilerin sözcük etiketleri yerine sayı etiketleri olmasını bekler. Bu nedenle, bu tür etiketleri sayı etiketlerine dönüştürmemiz gerekiyor. Bu işleme etiket kodlama denir. Scikit-learn Python kütüphanesinin LabelEncoder () fonksiyonu yardımıyla verilerin etiket kodlamasını gerçekleştirebiliriz.

Misal

Aşağıdaki örnekte, Python betiği etiket kodlamasını gerçekleştirecektir.

İlk olarak, gerekli Python kitaplıklarını aşağıdaki gibi içe aktarın -

import numpy as np
from sklearn import preprocessing

Şimdi, giriş etiketlerini aşağıdaki gibi sağlamamız gerekiyor -

input_labels = ['red','black','red','green','black','yellow','white']

Sonraki kod satırı, etiket kodlayıcıyı oluşturacak ve eğitecektir.

encoder = preprocessing.LabelEncoder()
encoder.fit(input_labels)

Sonraki komut satırı satırları, rastgele sıralı listeyi kodlayarak performansı kontrol edecektir -

test_labels = ['green','red','black']
encoded_values = encoder.transform(test_labels)
print("\nLabels =", test_labels)
print("Encoded values =", list(encoded_values))
encoded_values = [3,0,4,1]
decoded_list = encoder.inverse_transform(encoded_values)

Aşağıdaki python betiğinin yardımıyla kodlanmış değerlerin listesini alabiliriz -

print("\nEncoded values =", encoded_values)
print("\nDecoded labels =", list(decoded_list))

Çıktı

Labels = ['green', 'red', 'black']
Encoded values = [1, 2, 0]
Encoded values = [3, 0, 4, 1]
Decoded labels = ['white', 'black', 'yellow', 'green']