Подготовка данных - один из незаменимых шагов в любом жизненном цикле разработки машинного обучения. В современном мире данные представлены как в структурированной, так и в неструктурированной форме. Чтобы иметь дело с такими данными, специалисты по данным потратили почти 70–80% своего времени на подготовку данных для дальнейшего анализа, который включает:

  • Обработка отсутствующих значений
  • Кодирование строковых значений в целочисленные значения
  • Разделение данных на набор данных для тестирования и проверки
  • Масштабирование функций

Давайте обсудим каждый термин один за другим вместе с их реализацией с использованием пакетов Python.

Обработка отсутствующих значений

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

Давайте возьмем демонстрационный набор данных, содержащий некоторые пропущенные значения.

Employee Age Salary Purchased
Anjali   45  71000  No
Parul    28  48000  Yes
Kanisha  31  53000  No
Parul    35  61000  No
Kanisha  42      .  Yes
Anjali   35  59000  Yes
Parul     .  53000  No
Anjali   47  80000  Yes
Kanisha  51  81000  No
Anjali   36  68000  Yes

Сохраните указанный выше набор данных в необработанном файле .csv в вашей локальной системе и прочтите файл с помощью библиотеки Python.

#Importing libraries
import pandas as pd
import numpy as np
#Importing dataset
df = pd.read_csv("data.csv", sep=' ')
print(df)

Как видите, у нас есть 2 ячейки с пропущенными значениями на изображении выше в строках №4 и №6. Мы можем обработать эти недостающие значения, заменив значения следующими агрегированными значениями:

  • Иметь в виду
  • Режим (наиболее частый)
  • Медиана
  • Постоянное значение
  • Удалить всю строку / столбец с пропущенными значениями

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

Прежде чем передавать пропущенные значения, разделим независимую и зависимую переменные.

X = df.iloc[:,[0,1,2]].values
y = df.iloc[:,3].values
print(X)
print(y)

Мы воспользуемся классом SimpleImputer из библиотеки sklearn.impute, чтобы заменить отсутствующие значения средним значением соответствующих столбцов.

#Handling missing values
from sklearn.impute import SimpleImputer
imputer = SimpleImputer(missing_values=np.nan,strategy="mean")
imputer.fit(X[:,1:3])
X[:,1:3] = imputer.transform(X[:,1:3])
print(X)

Мы заменили отсутствующие значения на 38,88 и 63777,77 соответственно. Вместо среднего значения мы также можем заменить значения соответствующим режимом, медианой или любыми постоянными значениями, изменив параметр «стратегия».

Кодирование функций набора данных

Очевидно, что в наборе данных есть строковый столбец в форме имен, адресов и так далее. Но ни один алгоритм машинного обучения не может обучить модель со строковыми переменными в ней. Следовательно, мы должны кодировать эти переменные в числовые переменные, прежде чем углубляться в какой-либо алгоритм машинного обучения.

Есть несколько способов обработки таких данных. Здесь мы будем использовать 2 специальные библиотеки Python для преобразования строковых переменных в числовые.

#encoding the independent variables
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
ct = ColumnTransformer(transformers=[('encoder', OneHotEncoder(), [0])], remainder='passthrough')
X = ct.fit_transform(X)
X = np.array(X)
print(X)

В указанной выше программе происходит много всего. Во-первых, как вы можете видеть, у нас есть 3 уникальных значения в столбце «Сотрудник». В приведенном выше коде значения заменены числовыми значениями, как показано ниже.

На рисунке 6 вам должно быть интересно, как появились дополнительные столбцы, которых раньше не было. Если да, то вы идете по правильному пути.

Алгоритм машинного обучения не имеет ничего общего с именами столбцов, вместо этого он пытается найти закономерности в данных. Из рисунка 7 легко сделать вывод, что значение 2 больше, чем значения 1 и 0; он также может сделать вывод о числовом порядке в данных. Следовательно, может произойти некоторая неправильная интерпретация между независимыми переменными и зависимыми переменными, что может привести к неправильным корреляциям и будущим результатам.

Чтобы смягчить такие проблемы, мы создадим по одному столбцу для каждого значения с 0 и 1; 0 означает отсутствие значения, а 1 присутствует.

Если вы заметили, зависимая переменная также является строковой. Но зависимый столбец имеет только 2 уникальных значения; в этом случае мы можем пропустить описанный выше процесс и напрямую закодировать значения от [«Нет», «Да»] до [0,1] соответственно. После кодирования вы заметите, что у нас есть только 0 и 1 в зависимом столбце, и это то, что мы хотим. Давайте быстро изменим зависимую переменную «y» на числовую переменную.

#encoding the dependent variables
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
y = le.fit_transform(y)
print(y)

Вот как мы обрабатываем строковые переменные в процессе построения модели. Перейдем к следующим шагам.

Разделение данных на набор данных для тестирования и проверки

В каждом процессе разработки модели нам необходимо обучить модель с помощью подмножества исходных данных, кроме того, модель прогнозирует значения для новых невидимых данных, чтобы оценить ее производительность с точки зрения точности, кривой ROC-AUC и т. Д. Мы не будем обсуждать здесь какие-либо параметры оценки, поскольку они выходят за рамки этого руководства, но я обязательно расскажу о них в своем следующем руководстве, а пока следите за обновлениями. :)

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

Обучающий набор данных: он состоит более чем из половины исходного набора данных, единственная цель этого набора данных - обучать модель и обновлять веса модели.

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

Набор данных тестирования: он составляет от 10 до 25% исходных данных для оценки производительности модели на основе различных параметров оценки, описанных выше.

Как правило, рекомендуется разделить отношения на 70–30 или 80–20 на разделение на поезд и на 60–20–20 или на 70–15–15 в случае набора данных для разделения на поезд и валидацию.

Рассмотрим приведенный ниже пример со 100 строками в исходном наборе данных. В среднем разбиении между набором данных для обучения и тестирования получилось соотношение 80–20. Далее набор обучающих данных разделен на 75–25 соотношений разбиения между наборами обучающих и проверочных данных в последнем разбиении.

Давайте реализуем то же самое на Python.

#split data into train and test dataset
from sklearn.model_selection import train_test_split  #(for python2)
#from sklearn.model_selection import train_test_split  (for python3)
X_train, X_test, y_train, y_test = train_test_split(X,y, test_size=0.2, random_state=0)
print('X_train.shape: ', X_train.shape)
print('X_test.shape:  ', X_test.shape)
print('y_train.shape: ', y_train.shape)
print('y_test.shape:  ', y_test.shape)

Как видите, разбить набор данных очень просто с помощью класса train_test_split из библиотеки sklearn.model_selection. Выберите параметр test_size от 0 до 1, в нашем случае мы взяли 0,2, чтобы получить 20% данных тестирования. Рекомендуется установить начальный параметр random_state, чтобы добиться воспроизводимости результатов. Если мы не зададим начальное значение, каждый раз будет происходить случайное разделение наборов данных, и, следовательно, результаты будут отличаться при каждом запуске модели.

Масштабирование функций

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

Мы можем добиться этого разными способами, но здесь мы обсудим 2 наиболее популярных метода масштабирования функций, то есть минимальное и максимальное масштабирование и стандартизацию. Давайте обсудим это по порядку.

Минимальное и максимальное масштабирование. В этом методе функции / переменные масштабируются от 0 до 1.

Стандартизация: здесь функции были масштабированы до значений, так что распределение со средним значением = 0 и стандартным отклонением = 1.

В нашем случае мы применим метод стандартизации для масштабирования независимых функций в наборе данных для обучения и тестирования с помощью библиотеки sklearn.preprocessing.

#feature scaling of training dataset
from sklearn.preprocessing import StandardScaler
sc_X = StandardScaler()
X_train = sc_X.fit_transform(X_train)
X_test = sc_X.transform(X_test)
print(X_train)
print(X_test)

Здесь, если вы заметили, я использовал метод fit_transform для набора обучающих данных и метод transform для набора данных тестирования, причина в том, что мы узнаем параметр масштабирования из набора обучающих данных, и использовали те же параметры для масштабирования набора данных тестирования.

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

Теперь возникает большой вопрос, где применять масштабирование функций, а где нет. Эмпирическое правило гласит: применяйте масштабирование функций к моделям на основе расстояния, таким как KNN, PCA и т. Д. Это дополнительно помогает ускорить обучение модели и время прогнозирования. Мы можем пропустить масштабирование функций в случае моделей на основе дерева, таких как Дерево решений или вероятностных моделей, таких как Наивный Байес, потому что в этих моделях вес назначается в соответствии с значения, присутствующие в данных.

Заключение

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

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

Ссылки на изображения

Https://www.talend.com/wp-content/uploads/what-is-data-preparation.jpg

Https://www.thermofisher.com/blog/proteomics/wp-content/uploads/sites/2/2016/06/missing_values-1.jpg

Https://previews.123rf.com/images/nizovatina/nizovatina1812/nizovatina181200002/114320769-vector-antonyms-and-opposites-cartoon-characters-illustration-on-white-background-card-for-children-.jpg