ML - Verileri İstatistiklerle Anlama
Giriş
Makine öğrenimi projeleriyle çalışırken, genellikle adı verilen en önemli iki parçayı mathematics ve data. Bunun nedeni, makine öğreniminin veriye dayalı bir yaklaşım olduğunu biliyoruz ve makine öğrenimi modelimiz yalnızca sağladığımız veriler kadar iyi veya kötü sonuçlar üretecektir.
Önceki bölümde, CSV verilerini ML projemize nasıl yükleyebileceğimizi tartışmıştık, ancak verileri yüklemeden önce anlamak iyi olacaktır. Verileri istatistiklerle ve görselleştirme yoluyla iki şekilde anlayabiliriz.
Bu bölümde, Python tariflerini takip ederek, ML verilerini istatistiklerle anlayacağız.
Ham Verilere Bakmak
İlk tarif, ham verilerinize bakmak içindir. Ham verilere bakmak önemlidir, çünkü ham verilere baktıktan sonra elde edeceğimiz içgörü, makine öğrenimi projeleri için verilerin daha iyi işlenmesi ve işlenmesi şansımızı artıracaktır.
Aşağıda, Pima Indians diyabet veri kümesinde Pandas DataFrame'in head () işlevini kullanarak, onu daha iyi anlamak için ilk 50 satıra bakmak için uygulanan bir Python betiği verilmiştir -
Misal
from pandas import read_csv
path = r"C:\pima-indians-diabetes.csv"
headernames = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=headernames)
print(data.head(50))
Çıktı
preg plas pres skin test mass pedi age class
0 6 148 72 35 0 33.6 0.627 50 1
1 1 85 66 29 0 26.6 0.351 31 0
2 8 183 64 0 0 23.3 0.672 32 1
3 1 89 66 23 94 28.1 0.167 21 0
4 0 137 40 35 168 43.1 2.288 33 1
5 5 116 74 0 0 25.6 0.201 30 0
6 3 78 50 32 88 31.0 0.248 26 1
7 10 115 0 0 0 35.3 0.134 29 0
8 2 197 70 45 543 30.5 0.158 53 1
9 8 125 96 0 0 0.0 0.232 54 1
10 4 110 92 0 0 37.6 0.191 30 0
11 10 168 74 0 0 38.0 0.537 34 1
12 10 139 80 0 0 27.1 1.441 57 0
13 1 189 60 23 846 30.1 0.398 59 1
14 5 166 72 19 175 25.8 0.587 51 1
15 7 100 0 0 0 30.0 0.484 32 1
16 0 118 84 47 230 45.8 0.551 31 1
17 7 107 74 0 0 29.6 0.254 31 1
18 1 103 30 38 83 43.3 0.183 33 0
19 1 115 70 30 96 34.6 0.529 32 1
20 3 126 88 41 235 39.3 0.704 27 0
21 8 99 84 0 0 35.4 0.388 50 0
22 7 196 90 0 0 39.8 0.451 41 1
23 9 119 80 35 0 29.0 0.263 29 1
24 11 143 94 33 146 36.6 0.254 51 1
25 10 125 70 26 115 31.1 0.205 41 1
26 7 147 76 0 0 39.4 0.257 43 1
27 1 97 66 15 140 23.2 0.487 22 0
28 13 145 82 19 110 22.2 0.245 57 0
29 5 117 92 0 0 34.1 0.337 38 0
30 5 109 75 26 0 36.0 0.546 60 0
31 3 158 76 36 245 31.6 0.851 28 1
32 3 88 58 11 54 24.8 0.267 22 0
33 6 92 92 0 0 19.9 0.188 28 0
34 10 122 78 31 0 27.6 0.512 45 0
35 4 103 60 33 192 24.0 0.966 33 0
36 11 138 76 0 0 33.2 0.420 35 0
37 9 102 76 37 0 32.9 0.665 46 1
38 2 90 68 42 0 38.2 0.503 27 1
39 4 111 72 47 207 37.1 1.390 56 1
40 3 180 64 25 70 34.0 0.271 26 0
41 7 133 84 0 0 40.2 0.696 37 0
42 7 106 92 18 0 22.7 0.235 48 0
43 9 171 110 24 240 45.4 0.721 54 1
44 7 159 64 0 0 27.4 0.294 40 0
45 0 180 66 39 0 42.0 1.893 25 1
46 1 146 56 0 0 29.7 0.564 29 0
47 2 71 70 27 0 28.0 0.586 22 0
48 7 103 66 32 0 39.1 0.344 31 1
49 7 105 0 0 0 0.0 0.305 24 0
Yukarıdaki çıktıdan, ilk sütunun belirli bir gözleme referans vermek için çok yararlı olabilecek satır numarasını verdiğini gözlemleyebiliriz.
Verilerin Boyutlarını Kontrol Etme
Makine öğrenimi projemiz için satırlar ve sütunlar açısından ne kadar veriye sahip olduğumuzu bilmek her zaman iyi bir uygulamadır. Arkasındaki nedenler -
Diyelim ki çok fazla satır ve sütunumuz varsa, algoritmayı çalıştırmak ve modeli eğitmek uzun zaman alacaktır.
Diyelim ki çok az satır ve sütunumuz varsa, modeli iyi eğitmek için yeterli veriye sahip olmayacağız.
Aşağıda, şekil özelliğini Pandas Veri Çerçevesine yazdırarak uygulanan bir Python betiği verilmiştir. İçerisindeki toplam satır ve sütun sayısını elde etmek için iris veri setine uygulayacağız.
Misal
from pandas import read_csv
path = r"C:\iris.csv"
data = read_csv(path)
print(data.shape)
Çıktı
(150, 4)
Kullanacağımız iris veri setinin 150 satır ve 4 sütuna sahip olduğunu çıktıdan rahatlıkla gözlemleyebiliyoruz.
Her Özniteliğin Veri Türünü Alma
Her bir özelliğin veri türünü bilmek başka bir iyi uygulamadır. Bunun arkasındaki neden, ihtiyaca göre bazen bir veri türünü diğerine dönüştürmemiz gerekebileceğidir. Örneğin, kategorisel veya sıralı değerleri temsil etmek için dizeyi kayan noktaya veya int'e dönüştürmemiz gerekebilir. Ham verilere bakarak özniteliğin veri türü hakkında fikir sahibi olabiliriz, ancak başka bir yol da Pandas DataFrame'in dtypes özelliğini kullanmaktır. Dtypes özelliği yardımıyla her bir özniteliği veri türünü kategorize edebiliriz. Python betiğini takip ederek anlaşılabilir -
Misal
from pandas import read_csv
path = r"C:\iris.csv"
data = read_csv(path)
print(data.dtypes)
Çıktı
sepal_length float64
sepal_width float64
petal_length float64
petal_width float64
dtype: object
Yukarıdaki çıktıdan, her bir özelliğin veri tiplerini kolayca alabiliriz.
Verilerin İstatistiksel Özeti
Verilerin şeklini, yani satır ve sütun sayısını elde etmek için Python tarifini tartıştık, ancak çoğu zaman bu veri şeklinden özetleri gözden geçirmemiz gerekir. Her ve her veri özelliğinin aşağıdaki 8 istatistiksel özelliğini daha da sağlayan Pandas DataFrame'in açıklama () işlevi yardımıyla yapılabilir -
- Count
- Mean
- Standart sapma
- Minimum değer
- Maksimum değer
- 25%
- Medyan yani% 50
- 75%
Misal
from pandas import read_csv
from pandas import set_option
path = r"C:\pima-indians-diabetes.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=names)
set_option('display.width', 100)
set_option('precision', 2)
print(data.shape)
print(data.describe())
Çıktı
(768, 9)
preg plas pres skin test mass pedi age class
count 768.00 768.00 768.00 768.00 768.00 768.00 768.00 768.00 768.00
mean 3.85 120.89 69.11 20.54 79.80 31.99 0.47 33.24 0.35
std 3.37 31.97 19.36 15.95 115.24 7.88 0.33 11.76 0.48
min 0.00 0.00 0.00 0.00 0.00 0.00 0.08 21.00 0.00
25% 1.00 99.00 62.00 0.00 0.00 27.30 0.24 24.00 0.00
50% 3.00 117.00 72.00 23.00 30.50 32.00 0.37 29.00 0.00
75% 6.00 140.25 80.00 32.00 127.25 36.60 0.63 41.00 1.00
max 17.00 199.00 122.00 99.00 846.00 67.10 2.42 81.00 1.00
Yukarıdaki çıktıdan, verilerin şekli ile birlikte Pima Indian Diabetes veri setinin verilerinin istatistiksel özetini gözlemleyebiliriz.
Sınıf Dağılımının İncelenmesi
Sınıf dağılım istatistikleri, sınıf değerlerinin dengesini bilmemiz gereken sınıflandırma problemlerinde faydalıdır. Sınıf değeri dağılımını bilmek önemlidir, çünkü oldukça dengesiz sınıf dağılımına sahipsek, yani bir sınıf diğer sınıfa göre çok daha fazla gözlem yapıyorsa, ML projemizin veri hazırlama aşamasında özel bir işleme ihtiyaç duyabilir. Pandas DataFrame yardımıyla Python'da kolayca sınıf dağılımı elde edebiliriz.
Misal
from pandas import read_csv
path = r"C:\pima-indians-diabetes.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=names)
count_class = data.groupby('class').size()
print(count_class)
Çıktı
Class
0 500
1 268
dtype: int64
Yukarıdaki çıktıdan, sınıf 0'daki gözlem sayısının, sınıf 1'deki gözlem sayısının neredeyse iki katı olduğu açıkça görülebilir.
Nitelikler Arasındaki Korelasyonu İnceleme
İki değişken arasındaki ilişkiye korelasyon denir. İstatistikte, korelasyonu hesaplamak için en yaygın yöntem, Pearson Korelasyon Katsayısı'dır. Aşağıdaki gibi üç değere sahip olabilir -
Coefficient value = 1 - Dolu temsil eder positive değişkenler arasındaki korelasyon.
Coefficient value = -1 - Dolu temsil eder negative değişkenler arasındaki korelasyon.
Coefficient value = 0 - Temsil eder no değişkenler arasında hiç korelasyon.
Veri kümemizdeki özniteliklerin ikili korelasyonlarını ML projesinde kullanmadan önce gözden geçirmek bizim için her zaman iyidir çünkü doğrusal regresyon ve lojistik regresyon gibi bazı makine öğrenimi algoritmaları, yüksek oranda ilişkili niteliklere sahipsek kötü performans gösterir. Python'da, Pandas DataFrame'deki corr () işlevi yardımıyla veri kümesi özniteliklerinin bir korelasyon matrisini kolayca hesaplayabiliriz.
Misal
from pandas import read_csv
from pandas import set_option
path = r"C:\pima-indians-diabetes.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=names)
set_option('display.width', 100)
set_option('precision', 2)
correlations = data.corr(method='pearson')
print(correlations)
Çıktı
preg plas pres skin test mass pedi age class
preg 1.00 0.13 0.14 -0.08 -0.07 0.02 -0.03 0.54 0.22
plas 0.13 1.00 0.15 0.06 0.33 0.22 0.14 0.26 0.47
pres 0.14 0.15 1.00 0.21 0.09 0.28 0.04 0.24 0.07
skin -0.08 0.06 0.21 1.00 0.44 0.39 0.18 -0.11 0.07
test -0.07 0.33 0.09 0.44 1.00 0.20 0.19 -0.04 0.13
mass 0.02 0.22 0.28 0.39 0.20 1.00 0.14 0.04 0.29
pedi -0.03 0.14 0.04 0.18 0.19 0.14 1.00 0.03 0.17
age 0.54 0.26 0.24 -0.11 -0.04 0.04 0.03 1.00 0.24
class 0.22 0.47 0.07 0.07 0.13 0.29 0.17 0.24 1.00
Yukarıdaki çıktıdaki matris, veri kümesindeki tüm öznitelik çiftleri arasındaki korelasyonu verir.
Öznitelik Dağılımının Çarpıklığını İnceleme
Çarpıklık, Gaussian olduğu varsayılan, ancak çarpık veya bir yönde veya başka bir yönde veya sola veya sağa kaymış görünen dağılım olarak tanımlanabilir. Özniteliklerin çarpıklığını gözden geçirmek, aşağıdaki nedenlerden dolayı önemli görevlerden biridir:
Verilerdeki çarpıklığın varlığı, modelimizden daha doğru sonuçlar alabilmemiz için veri hazırlama aşamasında düzeltmeyi gerektirir.
Makine öğrenimi algoritmalarının çoğu, verilerin bir Gauss dağılımına sahip olduğunu varsayar, yani normal veya çan eğimli veriler.
Python'da, Pandas DataFrame'de skew () işlevini kullanarak her bir özniteliğin eğriliğini kolayca hesaplayabiliriz.
Misal
from pandas import read_csv
path = r"C:\pima-indians-diabetes.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(path, names=names)
print(data.skew())
Çıktı
preg 0.90
plas 0.17
pres -1.84
skin 0.11
test 2.27
mass -0.43
pedi 1.92
age 1.13
class 0.64
dtype: float64
Yukarıdaki çıktıdan, pozitif veya negatif çarpıklık gözlemlenebilir. Değer sıfıra yakınsa daha az çarpıklık gösterir.