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

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

Рисунок 1: Образец набора данных

Предварительная обработка данных состоит из 6 этапов:

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

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

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

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

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

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

Импорт библиотек

 import numpy as np
 import pandas as pd
 import matplotlib.pyplot as plt

На первом этапе мы собираемся импортировать 3 библиотеки: Numpy, matplotlib и pandas. Библиотека Numpy позволит нам работать с массивами, потому что вы действительно увидите, что ваши будущие модели машинного обучения будут ожидать массивы в качестве входных данных. Библиотека Matplotlib позволит нам построить очень красивые диаграммы. А библиотека Pandas позволит нам не только импортировать набор данных, но и создать матрицу признаков и вектор зависимой переменной.

Импорт набора данных

dataset = pd.read_csv('Data.csv')
X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, -1].values

Первый шаг — создать новую переменную "набор данных", которая будет содержать набор данных. Мы будем использовать функцию под названием read_csv из библиотеки pandas, которая будет читать набор данных и возвращать фрейм данных. Фрейм данных будет точно таким же, как набор данных. Эта функция требует ввода только пути к набору данных. Следующим шагом будет создание двух новых объектов. Первый — это матрица признаков «X», а второй — вектор зависимых переменных «y».

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

X = dataset.iloc[:, :-1].values

Итак, мы создадим матрицу признаков «X» и зависимую переменную «y». И это то, что мы всегда должны делать на этапе предварительной обработки данных. Для создания матрицы признаков мы будем использовать переменную "набор данных", содержащую все столбцы, а затем передадим индексы необходимых столбцов. Мы будем использовать функцию под названием iloc, что означает индексы поиска, которые будут принимать индексы столбцов и строк, которые мы хотим извлечь из набора данных. Мы начнем с включения всех строк с помощью “:” без указания нижней или верхней границы. А для столбцов мы возьмем все столбцы, кроме последних столбцов, которые являются вектором зависимой переменной. Для этого мы будем использовать “:-1”, что означает, что мы берем всю индексацию, кроме последнего столбца. «-1» в python — это индекс последнего столбца, однако функция диапазона всегда будет исключать верхнюю границу.

y = dataset.iloc[:, -1].values

Для зависимой переменной «y» будет точно так же, нам просто нужно сделать одно простое изменение индексов «iloc» функция. Мы будем использовать “:”, чтобы нижняя граница брала все строки, и “-1”, чтобы верхняя граница выбирала только последнюю. столбец.

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

Забота о недостающих данных

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

Если мы посмотрим на наш набор данных, упомянутый выше, мы увидим, что в столбцах возраста и зарплаты отсутствуют данные. Вообще говоря, вы не хотите иметь отсутствующие данные в своем наборе данных, потому что иногда это будет вызывать ошибки при обучении вашей модели машинного обучения, и поэтому вы должны с ними справиться. Есть несколько способов справиться с этим, первый способ — игнорировать наблюдение, удалив его, и это действительно сработает, если у вас большой набор данных. Но иногда у вас есть много недостающих данных, и поэтому вы должны правильно с ними обращаться. Итак, второй способ — заменить пропущенные значения средним значением всех значений в столбце, в котором отсутствуют данные. В нашем случае мы хотим заменить отсутствующую зарплату средним значением всех значений в столбце зарплаты. Для этого мы должны использовать одну из лучших библиотек для анализа данных под названием scikit-learn. Это замечательная библиотека, включающая в себя множество инструментов, включая инструменты предварительной обработки данных (https://scikit-learn.org/stable/). Класс, который мы собираемся использовать, называется "SimpleImputer" и относится к модулю "impute" в sklearn. Сначала нам нужно импортировать класс "SimpleImputer" из модуля "impute", а затем создать экземпляр или объект этого класса. Этот объект позволит нам точно заменить отсутствующие значения средними. И тогда у нас будет новая матрица признаков без каких-либо недостающих данных. Мы назвали этот объект или переменную "импутером". Используя SimpleImputer, мы можем заменить отсутствующее значение средним, медианным или наиболее частым значением. Самый классический способ — средний, которым мы и воспользуемся в данном случае. Первый аргумент, который мы должны передать, — это "missing_values", и он равен значению nan библиотеки numpy, которое равно "np.nan" , а второе значение — это стратегия.

Теперь нам нужно подключить этот объект к нашей матрице признаков. Класс «SimpleImputer» содержит некоторые операции и действия, которые мы можем применять к переменным, и они называются методами или функциями, и одна из них — «подгонка». Что будет делать метод «подгонки», так это то, что он будет искать пропущенные значения в столбце зарплаты и вычислять пропущенные значения по среднему значению зарплаты. Затем, чтобы заменить значения, мы должны вызвать другой метод под названием «преобразование», который заменит отсутствующие значения средним значением. Как для функции «подгонки», так и для функции «преобразования» мы должны передать только столбец с числовыми значениями, в котором есть пропущенные значения. Имейте в виду, что функция диапазона в python исключает верхнее значение индекса.

Кодирование категорийных данных

Как мы видим, образец набора данных, использованный в этой статье, включает один столбец категории для столбца страны со значениями "США, Канада и Великобритания", который не имеет любые заказы или отношения, поэтому мы собираемся использовать «OneHotEncoder». "OneHotEncoder" преобразует страну категории в три столбца, потому что у нас есть три разных значения. И это создаст двоичный вектор для каждой страны, например, Соединенные Штаты будут иметь значение "100", Канада "010" и Великобритания "001". Это означает, что между этими тремя странами не будет числовых заказов. Затем для столбца Куплено, содержащего значения Да и Нет ” мы преобразуем его в 0 и 1, и это очень хорошо, поскольку он содержит двоичный вывод и не повлияет на будущие значения.

Кодирование независимой переменной

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

Для этого мы будем использовать класс «ColumnTransformer» из библиотеки «scikit-learn», которая принадлежит модулю «compose». И второй класс — «OneHotEncoder» из библиотеки «scikit-learn», которая относится к модулю «препроцессинг».

Первый шаг — создать объект класса «ColumnTransformer», а затем нам нужно передать два аргумента. Во-первых, какой тип преобразования мы собираемся сделать и для каких индексов мы собираемся это сделать. И второй аргумент — это остаток, чтобы указать, собираемся ли мы сохранить другие столбцы, к которым мы не будем применять трансформацию. Таким образом, для первого аргумента «трансформеры» мы укажем, какой тип преобразования мы хотим выполнить «кодер», какой тип кодировки "OneHotEncoder" и индекс столбца "0". Для второго аргумента «остаток» мы укажем значение «сквозной», что означает, что мы сохраним другие столбцы. Если мы не передадим аргумент остаток, результат будет содержать только те столбцы, в которых произошло преобразование. В классе "ColumnTransformer" есть метод с именем "fit_transform", который позволяет нам подгонять и преобразовывать одновременно время. Но метод «fit_tranform» не вернет результат в виде массива numpy, и обязательно иметь результат в виде массива numpy, как ожидается моделями машинного обучения, поэтому мы должны использовать «np.array , чтобы преобразовать его.

Кодирование зависимой переменной

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
y = le.fit_transform(y)

Для зависимой переменной мы будем использовать другой класс с именем «LabelEncoder», который будет кодировать «Да». и "Нет" в "1" и "0" . Класс «LabelEncoder» принадлежит модулю «предварительной обработки» из «scikit- учиться” библиотеку. Затем мы создадим объект этого класса и вызовем функцию fit_transform.

Разделение набора данных на обучающий набор и тестовый набор

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state= 1)

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

Мы выполним разделение, импортировав класс "train_test_split" из модуля "model_selection", который находится внутри библиотеку scikit-learn. Эта функция "train_test_split" создаст четыре отдельных набора, поскольку мы создадим парную матрицу функций для обучающего набора (X_train) и зависимой переменной (y_train) и то же самое для тестового набора (X_test, y_test). . Это требуется для будущего метода подбора модели машинного обучения, который требует обучения в качестве входных данных (X_train, y_train) и запросов прогнозирования (X_test , y_test).

Функция «train_test_split» принимает в качестве входных данных матрицу признаков «X» и «y». » вектор зависимой переменной. Затем размер разделения «test_size», где мы хотим много наблюдений в тренировочном наборе и мало в тестовом наборе. Рекомендуемый размер разделения составляет 80% наблюдения в тренировочном наборе и 20% наблюдения в тестовом наборе. Последним аргументом является «random_state», которому мы передадим значение «1», чтобы получить тот же результат для целей обучения, так что мы получим тот же тренировочный и тестовый наборы.

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

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train[:, 3:] = sc.fit_transform(X_train[:, 3:])
X_test[:, 3:] = sc.transform(X_test[:, 3:])

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

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

Двумя основными методами масштабирования признаков являются стандартизация и нормализация. Стандартизация (Xstand = (X — среднее(x))/стандартное отклонение(X)) — это вычитание среднего из признака и деление его на стандартное отклонение признаков . Этот метод будет помещать все значения функции между -3 и +3. Нормализация (Xnorm= (X — min(X))/(max(x) — min(x))) — это вычитание минимума из каждой функции и деление его на вычитание минимума из максимума признаков. Этот метод поместит все значения функций от 0 до 1. Метод нормализации рекомендуется, когда у вас есть нормальное распределение между всеми вашими функциями. Техника стандартизации всегда хорошо работает. Поэтому я рекомендую использовать метод стандартизации, так как он будет работать постоянно.

Для реализации масштабирования функций мы будем использовать класс "StandardScaler", принадлежащий модулю "preprocessing" из библиотеку scikit-learn. Затем мы создадим объект из класса StandardScaler. Это не требует каких-либо входных данных, поскольку мы будем использовать метод стандартизации. Имейте в виду, что мы не предполагаем применять масштабирование функций к вторым категориальным переменным, таким как столбец «Страна». Мы реализуем масштабирование признаков только по столбцам Age и Salary. В функции fit_transform подгонка найдет среднее значение и стандартное отклонение, а трансформация применит их ко всему набору.

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

Полный код шаблона предварительной обработки данных и образец набора данных можно найти по следующей ссылке в моем репозитории github: