ML - Comprendre les données avec les statistiques

introduction

Lorsque nous travaillons avec des projets d'apprentissage automatique, nous ignorons généralement deux parties les plus importantes appelées mathematics et data. C'est parce que nous savons que le ML est une approche basée sur les données et que notre modèle de ML ne produira que des résultats aussi bons ou aussi mauvais que les données que nous lui avons fournies.

Dans le chapitre précédent, nous avons discuté de la façon dont nous pouvons télécharger des données CSV dans notre projet ML, mais il serait bon de comprendre les données avant de les télécharger. Nous pouvons comprendre les données de deux manières, avec des statistiques et avec une visualisation.

Dans ce chapitre, à l'aide des recettes Python suivantes, nous allons comprendre les données ML avec des statistiques.

Examen des données brutes

La toute première recette consiste à examiner vos données brutes. Il est important d'examiner les données brutes, car les informations que nous obtiendrons après avoir examiné les données brutes augmenteront nos chances d'améliorer le prétraitement et le traitement des données pour les projets ML.

Voici un script Python implémenté à l'aide de la fonction head () de Pandas DataFrame sur l'ensemble de données sur le diabète des Indiens Pima pour examiner les 50 premières lignes pour mieux le comprendre -

Exemple

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

Production

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

Nous pouvons observer à partir de la sortie ci-dessus que la première colonne donne le numéro de ligne qui peut être très utile pour référencer une observation spécifique.

Vérification des dimensions des données

C'est toujours une bonne pratique de savoir combien de données, en termes de lignes et de colonnes, nous avons pour notre projet ML. Les raisons derrière sont -

  • Supposons que si nous avons trop de lignes et de colonnes, il faudrait beaucoup de temps pour exécuter l'algorithme et entraîner le modèle.

  • Supposons que si nous avons trop moins de lignes et de colonnes, nous n'aurions pas assez de données pour bien entraîner le modèle.

Voici un script Python implémenté en imprimant la propriété shape sur Pandas Data Frame. Nous allons l'implémenter sur l'ensemble de données d'iris pour obtenir le nombre total de lignes et de colonnes qu'il contient.

Exemple

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

Production

(150, 4)

Nous pouvons facilement observer à partir de la sortie que l'ensemble de données d'iris, que nous allons utiliser, comporte 150 lignes et 4 colonnes.

Obtention du type de données de chaque attribut

Connaître le type de données de chaque attribut est une autre bonne pratique. La raison en est que, conformément à l'exigence, nous pouvons parfois avoir besoin de convertir un type de données en un autre. Par exemple, nous pouvons avoir besoin de convertir une chaîne en virgule flottante ou en entier pour représenter des valeurs catégorielles ou ordinales. Nous pouvons avoir une idée du type de données de l'attribut en regardant les données brutes, mais une autre façon consiste à utiliser la propriété dtypes de Pandas DataFrame. Avec l'aide de la propriété dtypes, nous pouvons catégoriser chaque type de données d'attributs. Cela peut être compris à l'aide du script Python suivant -

Exemple

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

Production

sepal_length  float64
sepal_width   float64
petal_length  float64
petal_width   float64
dtype: object

À partir de la sortie ci-dessus, nous pouvons facilement obtenir les types de données de chaque attribut.

Résumé statistique des données

Nous avons discuté de la recette Python pour obtenir la forme, c'est-à-dire le nombre de lignes et de colonnes, de données, mais nous devons souvent revoir les résumés de cette forme de données. Cela peut être fait à l'aide de la fonction describe () de Pandas DataFrame qui fournit en outre les 8 propriétés statistiques suivantes de chaque attribut de données -

  • Count
  • Mean
  • Écart-type
  • Valeur minimum
  • Valeur maximum
  • 25%
  • Médiane soit 50%
  • 75%

Exemple

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

Production

(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

À partir de la sortie ci-dessus, nous pouvons observer le résumé statistique des données de l'ensemble de données Pima Indian Diabetes ainsi que la forme des données.

Révision de la distribution des classes

Les statistiques de distribution de classe sont utiles dans les problèmes de classification où nous avons besoin de connaître l'équilibre des valeurs de classe. Il est important de connaître la distribution des valeurs de classe car si nous avons une distribution de classe très déséquilibrée, c'est-à-dire qu'une classe a beaucoup plus d'observations qu'une autre classe, elle peut nécessiter un traitement spécial au stade de la préparation des données de notre projet ML. Nous pouvons facilement obtenir une distribution de classe en Python avec l'aide de Pandas DataFrame.

Exemple

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)

Production

Class
0  500
1  268
dtype: int64

À partir du résultat ci-dessus, on peut clairement voir que le nombre d'observations avec la classe 0 est presque le double du nombre d'observations avec la classe 1.

Examen de la corrélation entre les attributs

La relation entre deux variables est appelée corrélation. En statistique, la méthode la plus courante pour calculer la corrélation est le coefficient de corrélation de Pearson. Il peut avoir trois valeurs comme suit -

  • Coefficient value = 1 - Il représente plein positive corrélation entre les variables.

  • Coefficient value = -1 - Il représente plein negative corrélation entre les variables.

  • Coefficient value = 0 - Il représente no corrélation du tout entre les variables.

Il est toujours bon pour nous de passer en revue les corrélations par paires des attributs de notre ensemble de données avant de les utiliser dans un projet ML, car certains algorithmes d'apprentissage automatique tels que la régression linéaire et la régression logistique fonctionneront mal si nous avons des attributs hautement corrélés. En Python, nous pouvons facilement calculer une matrice de corrélation des attributs de jeu de données à l'aide de la fonction corr () sur Pandas DataFrame.

Exemple

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)

Production

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 dans la sortie ci-dessus donne la corrélation entre toutes les paires de l'attribut dans l'ensemble de données.

Examen de l'inclinaison de la distribution des attributs

L'asymétrie peut être définie comme la distribution supposée gaussienne mais qui semble déformée ou décalée dans un sens ou dans l'autre, ou vers la gauche ou vers la droite. L'examen de l'asymétrie des attributs est l'une des tâches importantes pour les raisons suivantes -

  • La présence d'asymétrie dans les données nécessite la correction au stade de la préparation des données afin que nous puissions obtenir plus de précision de notre modèle.

  • La plupart des algorithmes ML supposent que les données ont une distribution gaussienne, c'est-à-dire soit la normale des données courbes en cloche.

En Python, nous pouvons facilement calculer l'inclinaison de chaque attribut en utilisant la fonction skew () sur Pandas DataFrame.

Exemple

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

Production

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

À partir de la sortie ci-dessus, un biais positif ou négatif peut être observé. Si la valeur est plus proche de zéro, cela montre moins de biais.