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.