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.