Что такое предварительная обработка данных и почему это важно?

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

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

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

Давайте поработаем с приведенным выше набором данных, чтобы понять необходимые методы предварительной обработки данных с использованием Python.

Импорт необходимых библиотек

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

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

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

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

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

В приведенном выше фрагменте набор переменных данных содержит матрицу из файла данных. Функция «iloc» на объекте pandas помогает нам выбрать нужную часть строк и столбцов из матрицы.

Первый атрибут «:» (двоеточие) в приведенном выше синтаксисе означает выбор всех строк, а второй атрибут «:-1» означает выбор всех столбцов, кроме последнего. [-1] в Python обозначает последний элемент массива.

Теперь у нас есть наборы независимых переменных и зависимых переменных. Распечатайте значения «X» и «y», чтобы проверить значения.

X = [['Mumbai' 34.0 72.0]  ['Delhi' 17.0 48.0]  ['Hyderabad' 20.0 54.0]  ['Delhi' 28.0 61.0]  ['Hyderabad' 30.0 nan]  ['Mumbai' 25.0 58.0]  ['Delhi' nan 52.0]  ['Mumbai' 38.0 79.0]  ['Hyderabad' 40.0 83.0]  ['Mumbai' 27.0 67.0]]
y = ['No' 'Yes' 'No' 'No' 'Yes' 'Yes' 'No' 'Yes' 'No' 'Yes']

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

В основном мы можем работать с отсутствующими значениями двумя способами.
Либо мы можем игнорировать эти строки, игнорирование строк является хорошей идеей, если количество таких строк составляет менее 1% от общего числа строк данных.
Для второго варианта мы можем заполнить эти поля средним значением или медианой соответствующего столбца. Наиболее часто используемое соглашение заключается в замене отсутствующего значения средним/средним значением столбца.

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

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

Класс SimpleImputer принимает два параметра. Во-первых, параметр «missing_values», в который мы передаем значение «np.nan», что означает найти все ячейки, которые являются nan (не числом), а второй параметр — «стратегия», в которую мы передали значение как «средний». Теперь для всех ячеек с nan значения будут заменены средним значением соответствующего столбца.

output
[['Mumbai' 34.0 72.0]  ['Delhi' 17.0 48.0]  ['Hyderabad' 20.0 54.0]  ['Delhi' 28.0 61.0]  ['Hyderabad' 30.0 63.77777777777778]  ['Mumbai' 25.0 58.0]  ['Delhi' 28.77777777777778 52.0]  ['Mumbai' 38.0 79.0]  ['Hyderabad' 40.0 83.0]  ['Mumbai' 27.0 67.0]]

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

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

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

Используя OneHotEncoder, мы можем закодировать значения столбца города, такие как метка «Мумбаи», в три значения столбца, такие как (1 0 0), «Дели» в (0 1 0) и Хайдарабад в (0 0 1). Это важно, потому что мы не хотим, чтобы наша модель учитывала закономерности возникновения этих городов, а не просто экземпляр уникального набора функций.

Output
[[0.0 0.0 1.0 34.0 72.0]  [1.0 0.0 0.0 17.0 48.0]  [0.0 1.0 0.0 20.0 54.0]  [1.0 0.0 0.0 28.0 61.0]  [0.0 1.0 0.0 30.0 63.77777777777778]  [0.0 0.0 1.0 25.0 58.0]  [1.0 0.0 0.0 28.77777777777778 52.0]  [0.0 0.0 1.0 38.0 79.0]  [0.0 1.0 0.0 40.0 83.0]  [0.0 0.0 1.0 27.0 67.0]]

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

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

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

Output
[0 1 0 0 1 1 0 1 0 1]

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

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)

Очень важно разделить набор данных на две части. Одна часть будет полезна при обучении модели, а другая часть поможет в тестировании производительности модели. Обычный разрыв между поездом и тестовым набором составляет 80–20.

x_train
[[1.0 0.0 0.0 28.77777777777778 52.0]  [0.0 1.0 0.0 30.0 63.77777777777778]  [0.0 0.0 1.0 34.0 72.0]  [1.0 0.0 0.0 28.0 61.0]  [1.0 0.0 0.0 17.0 48.0]  [0.0 0.0 1.0 38.0 79.0]  [0.0 1.0 0.0 40.0 83.0]  [0.0 0.0 1.0 25.0 58.0]]
x_test
[[0.0 1.0 0.0 20.0 54.0]  [0.0 0.0 1.0 27.0 67.0]]
y_train
[0 1 0 0 1 1 0 1]
y_test
[0 1]