Учебники

ML — Понимание данных со статистикой

Работая с проектами машинного обучения, мы обычно игнорируем две самые важные части, называемые математикой и данными . Это потому, что мы знаем, что ML — это подход, основанный на данных, и наша модель ML даст только такие же хорошие или плохие результаты, как и данные, которые мы ей предоставили.

В предыдущей главе мы обсуждали, как мы можем загрузить данные CSV в наш проект ML, но было бы хорошо понять данные перед их загрузкой. Мы можем понять данные двумя способами: с помощью статистики и визуализации.

В этой главе, с помощью следующих рецептов Python, мы разберем данные ML со статистикой.

Глядя на необработанные данные

Самый первый рецепт для просмотра ваших необработанных данных. Важно смотреть на необработанные данные, потому что понимание, которое мы получим после просмотра необработанных данных, повысит наши шансы на лучшую предварительную обработку, а также обработку данных для проектов ML.

Ниже приведен сценарий Python, реализованный с использованием функции head () Pandas DataFrame в наборе данных диабета индейцев Пима для просмотра первых 50 строк, чтобы лучше понять его.

пример

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

Выход

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

Из вышеприведенного вывода мы можем наблюдать, что в первом столбце указан номер строки, который может быть очень полезен для ссылки на конкретное наблюдение.

Проверка размеров данных

Полезно всегда знать, сколько данных, с точки зрения строк и столбцов, у нас есть для нашего проекта ML. Причины этого —

  • Предположим, что если у нас слишком много строк и столбцов, тогда потребуется много времени для запуска алгоритма и обучения модели.

  • Предположим, что если у нас слишком мало строк и столбцов, тогда у нас не будет достаточно данных, чтобы хорошо обучить модель.

Предположим, что если у нас слишком много строк и столбцов, тогда потребуется много времени для запуска алгоритма и обучения модели.

Предположим, что если у нас слишком мало строк и столбцов, тогда у нас не будет достаточно данных, чтобы хорошо обучить модель.

Ниже приведен скрипт Python, реализованный путем печати свойства shape в Pandas Data Frame. Мы собираемся реализовать его на наборе данных радужной оболочки для получения общего количества строк и столбцов в нем.

пример

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

Выход

(150, 4)

Из результатов мы можем легко заметить, что набор данных iris, который мы будем использовать, имеет 150 строк и 4 столбца.

Получение типа данных каждого атрибута

Еще одна полезная практика — знать тип данных каждого атрибута. Причина в том, что согласно требованию иногда нам может потребоваться преобразовать один тип данных в другой. Например, нам может потребоваться преобразовать строку в число с плавающей запятой или int для представления категориальных или порядковых значений. Мы можем получить представление о типе данных атрибута, посмотрев на необработанные данные, но другой способ — использовать свойство dtypes в Pandas DataFrame. С помощью свойства dtypes мы можем классифицировать каждый тип данных атрибутов. Это можно понять с помощью следующего скрипта Python —

пример

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

Выход

sepal_length   float64
sepal_width    float64
petal_length   float64
petal_width    float64
dtype: object

Исходя из вышеприведенного вывода, мы можем легко получить типы данных каждого атрибута.

Статистическая сводка данных

Мы обсудили рецепт Python, чтобы получить форму, то есть количество строк и столбцов данных, но много раз нам нужно было просматривать сводки по этой форме данных. Это можно сделать с помощью функции description () Pandas DataFrame, которая дополнительно предоставляет следующие 8 статистических свойств каждого атрибута данных —

  • подсчитывать
  • Имею в виду
  • Стандартное отклонение
  • Минимальное значение
  • Максимальное значение
  • 25%
  • Медиана то есть 50%
  • 75%

пример

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

Выход

(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

Исходя из вышеприведенного вывода, мы можем наблюдать статистическую сводку данных набора данных Pima Indian Diabetes вместе с формой данных.

Просмотр распределения классов

Статистика распределения классов полезна в задачах классификации, где нам нужно знать баланс значений классов. Важно знать распределение значений классов, потому что если у нас очень несбалансированное распределение классов, то есть один класс имеет намного больше наблюдений, чем другой класс, то он может нуждаться в специальной обработке на этапе подготовки данных нашего проекта ML. Мы можем легко получить распределение классов в Python с помощью Pandas DataFrame.

пример

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)

Выход

Class
0 500
1 268
dtype: int64

Из вышеприведенного вывода ясно видно, что количество наблюдений с классом 0 почти вдвое превышает количество наблюдений с классом 1.

Проверка корреляции между атрибутами

Связь между двумя переменными называется корреляцией. В статистике наиболее распространенным методом расчета корреляции является коэффициент корреляции Пирсона. Может иметь три значения следующим образом:

  • Значение коэффициента = 1 — представляет полную положительную корреляцию между переменными.

  • Значение коэффициента = -1 — представляет полную отрицательную корреляцию между переменными.

  • Значение коэффициента = 0не представляет никакой корреляции между переменными.

Значение коэффициента = 1 — представляет полную положительную корреляцию между переменными.

Значение коэффициента = -1 — представляет полную отрицательную корреляцию между переменными.

Значение коэффициента = 0не представляет никакой корреляции между переменными.

Для нас всегда полезно проанализировать попарные корреляции атрибутов в нашем наборе данных, прежде чем использовать его в проекте ML, потому что некоторые алгоритмы машинного обучения, такие как линейная регрессия и логистическая регрессия, будут работать плохо, если у нас будут сильно коррелированные атрибуты. В Python мы можем легко рассчитать корреляционную матрицу атрибутов набора данных с помощью функции corr () в Pandas DataFrame.

пример

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)

Выход

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

Матрица в вышеприведенном выводе дает корреляцию между всеми парами атрибута в наборе данных.

Обзор перекоса распределения атрибутов

Асимметрия может быть определена как распределение, которое предполагается гауссовым, но выглядит искаженным или смещенным в том или ином направлении или либо влево, либо вправо. Проверка асимметрии атрибутов является одной из важных задач по следующим причинам:

  • Наличие асимметрии в данных требует корректировки на этапе подготовки данных, чтобы мы могли получить больше точности из нашей модели.

  • В большинстве алгоритмов ML предполагается, что данные имеют гауссово распределение, т.е. либо нормаль данных изогнутого колокола.

Наличие асимметрии в данных требует корректировки на этапе подготовки данных, чтобы мы могли получить больше точности из нашей модели.

В большинстве алгоритмов ML предполагается, что данные имеют гауссово распределение, т.е. либо нормаль данных изогнутого колокола.

В Python мы можем легко рассчитать перекос каждого атрибута с помощью функции skew () в DataFrame Pandas.

пример

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

Выход

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

Из вышеприведенного вывода можно наблюдать положительный или отрицательный перекос. Если значение ближе к нулю, то оно показывает меньший перекос.