ML - Compreendendo dados com estatísticas

Introdução

Ao trabalhar com projetos de aprendizado de máquina, geralmente ignoramos duas partes mais importantes chamadas mathematics e data. É porque sabemos que o ML é uma abordagem orientada por dados e nosso modelo de ML produzirá apenas resultados tão bons ou ruins quanto os dados que fornecemos a ele.

No capítulo anterior, discutimos como podemos fazer upload de dados CSV em nosso projeto de ML, mas seria bom entender os dados antes de fazer o upload. Podemos entender os dados de duas maneiras, com estatísticas e com visualização.

Neste capítulo, com a ajuda de seguir as receitas do Python, vamos entender os dados de ML com estatísticas.

Olhando para dados brutos

A primeira receita é para olhar seus dados brutos. É importante observar os dados brutos porque o insight que obteremos depois de examinar os dados brutos aumentará nossas chances de um melhor pré-processamento, bem como do manuseio de dados para projetos de ML.

A seguir está um script Python implementado usando a função head () do Pandas DataFrame no conjunto de dados de diabetes dos índios Pima para examinar as primeiras 50 linhas para obter um melhor entendimento dele -

Exemplo

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

Resultado

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 a partir da saída acima que a primeira coluna fornece o número da linha que pode ser muito útil para fazer referência a uma observação específica.

Verificando Dimensões de Dados

É sempre uma boa prática saber quantos dados, em termos de linhas e colunas, estamos tendo para nosso projeto de ML. As razões por trás são -

  • Suponha que se tivermos muitas linhas e colunas, levaria muito tempo para executar o algoritmo e treinar o modelo.

  • Suponha que se tivermos menos linhas e colunas, não teríamos dados suficientes para treinar bem o modelo.

A seguir está um script Python implementado imprimindo a propriedade de forma no Pandas Data Frame. Vamos implementá-lo no conjunto de dados iris para obter o número total de linhas e colunas nele.

Exemplo

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

Resultado

(150, 4)

Podemos facilmente observar a partir da saída que o conjunto de dados íris, que vamos usar, tem 150 linhas e 4 colunas.

Obtendo o tipo de dados de cada atributo

É outra boa prática saber o tipo de dados de cada atributo. O motivo é que, de acordo com o requisito, às vezes podemos precisar converter um tipo de dados em outro. Por exemplo, podemos precisar converter string em ponto flutuante ou int para representar valores categóricos ou ordinais. Podemos ter uma ideia do tipo de dado do atributo olhando os dados brutos, mas outra forma é usar a propriedade dtypes do Pandas DataFrame. Com a ajuda da propriedade dtypes, podemos categorizar cada tipo de dados de atributos. Pode ser entendido com a ajuda do seguinte script Python -

Exemplo

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

Resultado

sepal_length  float64
sepal_width   float64
petal_length  float64
petal_width   float64
dtype: object

A partir da saída acima, podemos facilmente obter os tipos de dados de cada atributo.

Resumo Estatístico de Dados

Discutimos a receita do Python para obter a forma, ou seja, o número de linhas e colunas dos dados, mas muitas vezes precisamos revisar os resumos dessa forma de dados. Isso pode ser feito com a ajuda da função describe () do Pandas DataFrame que fornece ainda as seguintes 8 propriedades estatísticas de cada e todos os atributos de dados -

  • Count
  • Mean
  • Desvio padrão
  • Valor mínimo
  • Valor máximo
  • 25%
  • Mediana, ou seja, 50%
  • 75%

Exemplo

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

Resultado

(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 da saída acima, podemos observar o resumo estatístico dos dados do conjunto de dados do Diabetes Indiano Pima junto com a forma dos dados.

Revisão da distribuição da classe

A estatística de distribuição de classe é útil em problemas de classificação em que precisamos saber o equilíbrio dos valores de classe. É importante saber a distribuição do valor da classe porque se tivermos uma distribuição de classe altamente desequilibrada, ou seja, uma classe está tendo muito mais observações do que outra classe, então pode precisar de tratamento especial no estágio de preparação de dados de nosso projeto de ML. Podemos facilmente obter distribuição de classes em Python com a ajuda do Pandas DataFrame.

Exemplo

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)

Resultado

Class
0  500
1  268
dtype: int64

A partir da saída acima, pode ser visto claramente que o número de observações com classe 0 é quase o dobro do número de observações com classe 1.

Revisando Correlação entre Atributos

A relação entre duas variáveis ​​é chamada de correlação. Em estatística, o método mais comum para calcular a correlação é o coeficiente de correlação de Pearson. Pode ter três valores da seguinte forma -

  • Coefficient value = 1 - Representa full positive correlação entre variáveis.

  • Coefficient value = -1 - Representa full negative correlação entre variáveis.

  • Coefficient value = 0 - representa no correlação alguma entre as variáveis.

É sempre bom revisarmos as correlações de pares dos atributos em nosso conjunto de dados antes de usá-lo no projeto de ML, porque alguns algoritmos de aprendizado de máquina, como regressão linear e regressão logística, terão um desempenho ruim se tivermos atributos altamente correlacionados. Em Python, podemos calcular facilmente uma matriz de correlação de atributos de conjunto de dados com a ajuda da função corr () no Pandas DataFrame.

Exemplo

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)

Resultado

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

A matriz na saída acima fornece a correlação entre todos os pares do atributo no conjunto de dados.

Revisão da distorção da distribuição de atributos

A assimetria pode ser definida como a distribuição que se presume ser gaussiana, mas aparece distorcida ou deslocada em uma direção ou outra, para a esquerda ou direita. Rever a assimetria de atributos é uma das tarefas importantes devido aos seguintes motivos -

  • A presença de assimetria nos dados requer a correção no estágio de preparação dos dados para que possamos obter mais precisão do nosso modelo.

  • A maioria dos algoritmos de ML assume que os dados têm uma distribuição Gaussiana, ou seja, dados normais ou curvos em sino.

Em Python, podemos calcular facilmente a inclinação de cada atributo usando a função skew () no Pandas DataFrame.

Exemplo

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

Resultado

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 da saída acima, uma inclinação positiva ou negativa pode ser observada. Se o valor estiver mais próximo de zero, ele mostra menos inclinação.