Работая с проектами машинного обучения, мы обычно игнорируем две самые важные части, называемые математикой и данными . Это потому, что мы знаем, что 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
Из вышеприведенного вывода можно наблюдать положительный или отрицательный перекос. Если значение ближе к нулю, то оно показывает меньший перекос.