ML - Comprensione dei dati con le statistiche
introduzione
Mentre lavoriamo con progetti di machine learning, di solito ignoriamo due parti più importanti chiamate mathematics e data. È perché sappiamo che il ML è un approccio basato sui dati e il nostro modello ML produrrà solo risultati buoni o cattivi come i dati che gli abbiamo fornito.
Nel capitolo precedente, abbiamo discusso di come caricare i dati CSV nel nostro progetto ML, ma sarebbe bene comprendere i dati prima di caricarli. Possiamo comprendere i dati in due modi, con le statistiche e con la visualizzazione.
In questo capitolo, con l'aiuto di seguire le ricette di Python, comprenderemo i dati ML con le statistiche.
Guardando i dati grezzi
La prima ricetta è guardare i tuoi dati grezzi. È importante esaminare i dati grezzi perché le informazioni che otterremo dopo aver esaminato i dati grezzi aumenteranno le nostre possibilità di una migliore pre-elaborazione e gestione dei dati per i progetti ML.
Di seguito è riportato uno script Python implementato utilizzando la funzione head () di Pandas DataFrame sul set di dati sul diabete degli indiani Pima per esaminare le prime 50 righe per comprenderlo meglio -
Esempio
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))
Produzione
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
Possiamo osservare dall'output di cui sopra che la prima colonna fornisce il numero di riga che può essere molto utile per fare riferimento a un'osservazione specifica.
Controllo delle dimensioni dei dati
È sempre una buona pratica sapere quanti dati, in termini di righe e colonne, abbiamo per il nostro progetto ML. Le ragioni alla base sono:
Supponiamo che se abbiamo troppe righe e colonne, sarebbe necessario molto tempo per eseguire l'algoritmo e addestrare il modello.
Supponiamo che se abbiamo troppo meno righe e colonne, allora non avremmo abbastanza dati per addestrare bene il modello.
Di seguito è riportato uno script Python implementato stampando la proprietà shape su Pandas Data Frame. Lo implementeremo sul set di dati iris per ottenere il numero totale di righe e colonne in esso.
Esempio
from pandas import read_csv
path = r"C:\iris.csv"
data = read_csv(path)
print(data.shape)
Produzione
(150, 4)
Possiamo facilmente osservare dall'output che il set di dati iris, che useremo, ha 150 righe e 4 colonne.
Recupero del tipo di dati di ogni attributo
Un'altra buona pratica è conoscere il tipo di dati di ogni attributo. Il motivo è che, in base al requisito, a volte potrebbe essere necessario convertire un tipo di dati in un altro. Ad esempio, potrebbe essere necessario convertire la stringa in virgola mobile o int per rappresentare valori categoriali o ordinali. Possiamo avere un'idea del tipo di dati dell'attributo guardando i dati grezzi, ma un altro modo è usare la proprietà dtypes di Pandas DataFrame. Con l'aiuto della proprietà dtypes possiamo classificare ogni tipo di dati degli attributi. Può essere compreso con l'aiuto del seguente script Python -
Esempio
from pandas import read_csv
path = r"C:\iris.csv"
data = read_csv(path)
print(data.dtypes)
Produzione
sepal_length float64
sepal_width float64
petal_length float64
petal_width float64
dtype: object
Dall'output di cui sopra, possiamo facilmente ottenere i tipi di dati di ogni attributo.
Riepilogo statistico dei dati
Abbiamo discusso la ricetta di Python per ottenere la forma, cioè il numero di righe e colonne, dei dati, ma molte volte abbiamo bisogno di rivedere i riepiloghi da quella forma di dati. Può essere fatto con l'aiuto della funzione description () di Pandas DataFrame che fornisce inoltre le seguenti 8 proprietà statistiche di ogni attributo di dati:
- Count
- Mean
- Deviazione standard
- Valore minimo
- Valore massimo
- 25%
- Mediana cioè 50%
- 75%
Esempio
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())
Produzione
(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
Dall'output di cui sopra, possiamo osservare il riepilogo statistico dei dati del set di dati Pima Indian Diabetes insieme alla forma dei dati.
Revisione della distribuzione delle classi
Le statistiche sulla distribuzione delle classi sono utili nei problemi di classificazione in cui è necessario conoscere l'equilibrio dei valori delle classi. È importante conoscere la distribuzione del valore della classe perché se abbiamo una distribuzione delle classi altamente sbilanciata, ovvero una classe sta avendo molte più osservazioni rispetto ad un'altra classe, potrebbe essere necessaria una gestione speciale nella fase di preparazione dei dati del nostro progetto ML. Possiamo facilmente ottenere la distribuzione delle classi in Python con l'aiuto di Pandas DataFrame.
Esempio
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)
Produzione
Class
0 500
1 268
dtype: int64
Dall'output di cui sopra, si può vedere chiaramente che il numero di osservazioni con la classe 0 è quasi il doppio del numero di osservazioni con la classe 1.
Revisione della correlazione tra attributi
La relazione tra due variabili è chiamata correlazione. Nelle statistiche, il metodo più comune per calcolare la correlazione è il coefficiente di correlazione di Pearson. Può avere tre valori come segue:
Coefficient value = 1 - Rappresenta il pieno positive correlazione tra variabili.
Coefficient value = -1 - Rappresenta il pieno negative correlazione tra variabili.
Coefficient value = 0 - Rappresenta no correlazione tra le variabili.
È sempre positivo per noi rivedere le correlazioni a coppie degli attributi nel nostro set di dati prima di utilizzarlo nel progetto ML perché alcuni algoritmi di apprendimento automatico come la regressione lineare e logistica funzioneranno male se abbiamo attributi altamente correlati. In Python, possiamo facilmente calcolare una matrice di correlazione degli attributi del set di dati con l'aiuto della funzione corr () su Pandas DataFrame.
Esempio
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)
Produzione
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
La matrice nell'output sopra fornisce la correlazione tra tutte le coppie dell'attributo nel set di dati.
Revisione dell'inclinazione della distribuzione degli attributi
L'asimmetria può essere definita come la distribuzione che si presume sia gaussiana ma appare distorta o spostata in una direzione o nell'altra, oppure a sinistra oa destra. La revisione dell'asimmetria degli attributi è uno dei compiti importanti per i seguenti motivi:
La presenza di asimmetria nei dati richiede la correzione in fase di preparazione dei dati in modo da poter ottenere una maggiore precisione dal nostro modello.
La maggior parte degli algoritmi ML presume che i dati abbiano una distribuzione gaussiana, ovvero normale dei dati con curva a campana.
In Python, possiamo facilmente calcolare l'inclinazione di ogni attributo usando la funzione skew () su Pandas DataFrame.
Esempio
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())
Produzione
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
Dall'output di cui sopra, si può osservare un disallineamento positivo o negativo. Se il valore è più vicino a zero, mostra meno inclinazione.