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']