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.