ML: comprensión de datos con estadísticas

Introducción

Mientras trabajamos con proyectos de aprendizaje automático, generalmente ignoramos dos partes más importantes llamadas mathematics y data. Es porque sabemos que ML es un enfoque basado en datos y nuestro modelo ML producirá solo resultados tan buenos o malos como los datos que le proporcionamos.

En el capítulo anterior, discutimos cómo podemos cargar datos CSV en nuestro proyecto ML, pero sería bueno comprender los datos antes de cargarlos. Podemos entender los datos de dos formas, con estadísticas y con visualización.

En este capítulo, con la ayuda de las siguientes recetas de Python, vamos a comprender los datos de ML con estadísticas.

Mirando datos brutos

La primera receta es para mirar sus datos sin procesar. Es importante observar los datos sin procesar porque la información que obtendremos después de ver los datos sin procesar aumentará nuestras posibilidades de mejorar el preprocesamiento y el manejo de datos para proyectos de ML.

A continuación, se muestra un script de Python implementado mediante el uso de la función head () de Pandas DataFrame en el conjunto de datos de diabetes de los indios Pima para ver las primeras 50 filas y comprenderlo mejor:

Ejemplo

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

Salida

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

Podemos observar de la salida anterior que la primera columna da el número de fila que puede ser muy útil para hacer referencia a una observación específica.

Comprobación de las dimensiones de los datos

Siempre es una buena práctica saber cuántos datos, en términos de filas y columnas, tenemos para nuestro proyecto de AA. Las razones detrás son:

  • Supongamos que si tenemos demasiadas filas y columnas, llevaría mucho tiempo ejecutar el algoritmo y entrenar el modelo.

  • Supongamos que si tenemos menos filas y columnas, entonces no tendríamos suficientes datos para entrenar bien el modelo.

A continuación se muestra un script de Python implementado mediante la impresión de la propiedad de forma en el marco de datos de Pandas. Lo implementaremos en el conjunto de datos de iris para obtener el número total de filas y columnas en él.

Ejemplo

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

Salida

(150, 4)

Podemos observar fácilmente a partir de la salida que el conjunto de datos de iris que vamos a usar tiene 150 filas y 4 columnas.

Obtener el tipo de datos de cada atributo

Otra buena práctica es conocer el tipo de datos de cada atributo. La razón detrás es que, según el requisito, a veces es posible que necesitemos convertir un tipo de datos a otro. Por ejemplo, es posible que necesitemos convertir una cadena en coma flotante o int para representar valores categóricos u ordinales. Podemos tener una idea sobre el tipo de datos del atributo mirando los datos sin procesar, pero otra forma es usar la propiedad dtypes de Pandas DataFrame. Con la ayuda de la propiedad dtypes podemos categorizar cada tipo de datos de atributos. Se puede entender con la ayuda de la siguiente secuencia de comandos de Python:

Ejemplo

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

Salida

sepal_length  float64
sepal_width   float64
petal_length  float64
petal_width   float64
dtype: object

De la salida anterior, podemos obtener fácilmente los tipos de datos de cada atributo.

Resumen estadístico de datos

Hemos discutido la receta de Python para obtener la forma, es decir, el número de filas y columnas de datos, pero muchas veces necesitamos revisar los resúmenes de esa forma de datos. Se puede hacer con la ayuda de la función describe () de Pandas DataFrame que además proporciona las siguientes 8 propiedades estadísticas de cada atributo de datos:

  • Count
  • Mean
  • Desviación Estándar
  • Valor mínimo
  • Valor máximo
  • 25%
  • Mediana, es decir, 50%
  • 75%

Ejemplo

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

Salida

(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

A partir del resultado anterior, podemos observar el resumen estadístico de los datos del conjunto de datos de diabetes de los indios Pima junto con la forma de los datos.

Revisión de la distribución de clases

Las estadísticas de distribución de clases son útiles en problemas de clasificación en los que necesitamos conocer el equilibrio de los valores de clase. Es importante conocer la distribución del valor de la clase porque si tenemos una distribución de clases altamente desequilibrada, es decir, una clase tiene muchas más observaciones que otra clase, entonces puede necesitar un manejo especial en la etapa de preparación de datos de nuestro proyecto ML. Podemos obtener fácilmente la distribución de clases en Python con la ayuda de Pandas DataFrame.

Ejemplo

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)

Salida

Class
0  500
1  268
dtype: int64

A partir del resultado anterior, se puede ver claramente que el número de observaciones con clase 0 es casi el doble que el número de observaciones con clase 1.

Revisión de la correlación entre atributos

La relación entre dos variables se llama correlación. En estadística, el método más común para calcular la correlación es el coeficiente de correlación de Pearson. Puede tener tres valores de la siguiente manera:

  • Coefficient value = 1 - Representa lleno positive correlación entre variables.

  • Coefficient value = -1 - Representa lleno negative correlación entre variables.

  • Coefficient value = 0 - Representa no correlación en absoluto entre variables.

Siempre es bueno para nosotros revisar las correlaciones por pares de los atributos en nuestro conjunto de datos antes de usarlo en el proyecto ML porque algunos algoritmos de aprendizaje automático, como la regresión lineal y la regresión logística, funcionarán mal si tenemos atributos altamente correlacionados. En Python, podemos calcular fácilmente una matriz de correlación de atributos del conjunto de datos con la ayuda de la función corr () en Pandas DataFrame.

Ejemplo

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)

Salida

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 matriz en la salida anterior da la correlación entre todos los pares del atributo en el conjunto de datos.

Revisión de la desviación de la distribución de atributos

La asimetría puede definirse como la distribución que se supone que es gaussiana pero que parece distorsionada o desplazada en una dirección u otra, o hacia la izquierda o hacia la derecha. Revisar la asimetría de los atributos es una de las tareas importantes debido a las siguientes razones:

  • La presencia de asimetría en los datos requiere la corrección en la etapa de preparación de datos para que podamos obtener más precisión de nuestro modelo.

  • La mayoría de los algoritmos ML asumen que los datos tienen una distribución gaussiana, es decir, datos normales o curvados en campana.

En Python, podemos calcular fácilmente el sesgo de cada atributo usando la función skew () en Pandas DataFrame.

Ejemplo

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

Salida

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

A partir de la salida anterior, se puede observar una desviación positiva o negativa. Si el valor está más cerca de cero, muestra menos sesgo.