ML - zrozumienie danych za pomocą statystyk

Wprowadzenie

Podczas pracy z projektami uczenia maszynowego zazwyczaj pomijamy dwie najważniejsze części, tzw mathematics i data. Dzieje się tak, ponieważ wiemy, że ML jest podejściem opartym na danych, a nasz model ML da tylko tak dobre lub tak złe wyniki, jak dane, które mu dostarczyliśmy.

W poprzednim rozdziale omówiliśmy, w jaki sposób możemy przesłać dane CSV do naszego projektu ML, ale dobrze byłoby zapoznać się z danymi przed ich przesłaniem. Możemy zrozumieć dane na dwa sposoby, za pomocą statystyk i wizualizacji.

W tym rozdziale, korzystając z przepisów Pythona, zrozumiemy dane ML ze statystykami.

Patrząc na surowe dane

Pierwszy przepis dotyczy przeglądania surowych danych. Ważne jest, aby spojrzeć na surowe dane, ponieważ wgląd, jaki uzyskamy po spojrzeniu na surowe dane, zwiększy nasze szanse na lepsze przetwarzanie wstępne, a także obsługę danych dla projektów ML.

Poniżej znajduje się skrypt Pythona zaimplementowany przy użyciu funkcji head () z Pandas DataFrame w zbiorze danych dotyczących cukrzycy Pima Indians w celu spojrzenia na pierwsze 50 wierszy w celu lepszego zrozumienia tego -

Przykład

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))

Wynik

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

Z powyższego wyniku widać, że pierwsza kolumna podaje numer wiersza, który może być bardzo przydatny do odniesienia się do konkretnej obserwacji.

Sprawdzanie wymiarów danych

Zawsze dobrze jest wiedzieć, ile danych w zakresie wierszy i kolumn mamy dla naszego projektu ML. Powody tego są -

  • Załóżmy, że jeśli mamy zbyt wiele wierszy i kolumn, uruchomienie algorytmu i nauczenie modelu zajęłoby dużo czasu.

  • Załóżmy, że gdybyśmy mieli za mało wierszy i kolumn, to nie mielibyśmy wystarczającej ilości danych, aby dobrze wytrenować model.

Poniżej znajduje się skrypt Pythona zaimplementowany przez wydrukowanie właściwości shape w ramce danych Pandas. Zamierzamy go zaimplementować na zestawie danych tęczówki, aby uzyskać całkowitą liczbę wierszy i kolumn w nim.

Przykład

from pandas import read_csv
path = r"C:\iris.csv"
data = read_csv(path)
print(data.shape)

Wynik

(150, 4)

Z danych wyjściowych możemy łatwo zauważyć, że zbiór danych tęczówki, którego będziemy używać, ma 150 wierszy i 4 kolumny.

Pobieranie typu danych każdego atrybutu

Inną dobrą praktyką jest znajomość typu danych każdego atrybutu. Powodem jest to, że zgodnie z wymaganiami czasami może być konieczne przekonwertowanie jednego typu danych na inny. Na przykład może być konieczne przekonwertowanie ciągu znaków na zmiennoprzecinkowe lub int w celu przedstawienia wartości jakościowych lub porządkowych. Możemy mieć pojęcie o typie danych atrybutu, patrząc na surowe dane, ale innym sposobem jest użycie właściwości dtypes Pandas DataFrame. Za pomocą właściwości dtypes możemy kategoryzować każdy typ danych atrybutów. Można to zrozumieć za pomocą następującego skryptu Pythona -

Przykład

from pandas import read_csv
path = r"C:\iris.csv"
data = read_csv(path)
print(data.dtypes)

Wynik

sepal_length  float64
sepal_width   float64
petal_length  float64
petal_width   float64
dtype: object

Z powyższego wyniku możemy łatwo uzyskać typy danych każdego atrybutu.

Statystyczne podsumowanie danych

Omówiliśmy przepis Pythona, aby uzyskać kształt, tj. Liczbę wierszy i kolumn danych, ale wiele razy musimy przeglądać podsumowania z tego kształtu danych. Można to zrobić za pomocą funkcji opisywania () w Pandas DataFrame, która dodatkowo dostarcza następujących 8 właściwości statystycznych każdego atrybutu danych -

  • Count
  • Mean
  • Odchylenie standardowe
  • Minimalna wartość
  • Maksymalna wartość
  • 25%
  • Mediana tj. 50%
  • 75%

Przykład

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())

Wynik

(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

Na podstawie powyższego wyniku możemy obserwować statystyczne podsumowanie danych zbioru danych Pima Indian Diabetes wraz z kształtem danych.

Przeglądanie rozkładu klas

Statystyka rozkładu klas jest przydatna w problemach klasyfikacyjnych, w których musimy znać równowagę wartości klas. Ważne jest, aby znać rozkład wartości klas, ponieważ jeśli mamy wysoce niezrównoważony rozkład klas, tj. Jedna klasa ma o wiele więcej obserwacji niż inna klasa, może wymagać specjalnego traktowania na etapie przygotowania danych w naszym projekcie ML. Możemy łatwo uzyskać dystrybucję klas w Pythonie za pomocą Pandas DataFrame.

Przykład

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)

Wynik

Class
0  500
1  268
dtype: int64

Z powyższego wyniku można wyraźnie zauważyć, że liczba obserwacji z klasą 0 jest prawie dwukrotnie większa niż liczba obserwacji z klasą 1.

Przeglądanie korelacji między atrybutami

Związek między dwiema zmiennymi nazywa się korelacją. W statystyce najpowszechniejszą metodą obliczania korelacji jest współczynnik korelacji Pearsona. Może mieć trzy wartości w następujący sposób -

  • Coefficient value = 1 - To reprezentuje pełne positive korelacja między zmiennymi.

  • Coefficient value = -1 - To reprezentuje pełne negative korelacja między zmiennymi.

  • Coefficient value = 0 - To reprezentuje no korelacja między zmiennymi.

Zawsze dobrze jest przejrzeć parami korelacje atrybutów w naszym zbiorze danych przed użyciem go w projekcie ML, ponieważ niektóre algorytmy uczenia maszynowego, takie jak regresja liniowa i regresja logistyczna, będą działały słabo, jeśli mamy wysoce skorelowane atrybuty. W Pythonie możemy łatwo obliczyć macierz korelacji atrybutów zestawu danych za pomocą funkcji corr () w Pandas DataFrame.

Przykład

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)

Wynik

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

Macierz w powyższym wyniku podaje korelację między wszystkimi parami atrybutu w zbiorze danych.

Przeglądanie pochylenia rozkładu atrybutów

Skośność można zdefiniować jako rozkład, który przyjmuje się jako rozkład Gaussa, ale wydaje się zniekształcony lub przesunięty w jednym lub drugim kierunku albo w lewo lub w prawo. Przeglądanie skośności atrybutów jest jednym z ważnych zadań z następujących powodów -

  • Obecność skośności danych wymaga korekty na etapie przygotowania danych, abyśmy mogli uzyskać większą dokładność z naszego modelu.

  • Większość algorytmów ML zakłada, że ​​dane mają rozkład Gaussa, tj. Albo dane normalne, albo dane o krzywej dzwonowej.

W Pythonie możemy łatwo obliczyć pochylenie każdego atrybutu, używając funkcji skew () w Pandas DataFrame.

Przykład

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())

Wynik

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

Z powyższego wyniku można zaobserwować dodatnie lub ujemne odchylenie. Jeśli wartość jest bliższa zeru, pokazuje mniejsze pochylenie.