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

5. Категориальные данные

Если вы пойдете и проверите набор данных, есть 2 категориальные переменные, переменная страны и переменная приобретенного продукта. Эти две переменные являются категориальными просто потому, что они содержат категории. Переменная Country содержит 3 категории Непал, Китай и Индия, тогда как ProductPurchase содержит 2 категории yes и no. Поскольку мы знаем, что модели машинного обучения основаны на математических уравнениях, добавление текста в математическое уравнение может вызвать проблемы. Вот почему нам нужно кодировать этот текст в числа.

из sklearn.preprocessing import LabelEncoder
labelEncoder_X = LabelEncoder()
labelEncoder_X.fit_transform(X[:, 0])

Как и раньше, мы импортируем библиотеку из sklearn, называемую предварительной обработкой, из которой мы используем класс LabelEncoder, как определено в первой строке. Во второй строке мы инициализируем объект. Теперь мы используем метод fit_transform класса labelEncoder, который сделает всю работу за нас. Здесь мы хотим, чтобы была закодирована только переменная Country, поэтому X[:,0] представляет все строки из первого столбца.

Если вы продолжите и выполните код, вы больше не увидите страну, написанную в тексте. Однако, если ввести X в консоли, первое значение индекса останется прежним. Это потому, что мы не применили закодированное значение к первому индексу матрицы. Итак, чтобы сделать это, измените последнюю строку как:

X[:,0] = labelEncoder_X.fit_transform(X[:, 0])

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

Вы заметили какое-то странное поведение здесь? Хотя первый индекс закодирован как число, значения равны 0,1 и 2. 2 больше 1, а 1 больше 0, и это повлияет на уравнение модели. Уравнение в модели будет считать, что Непал больше, чем Индия, а Индия больше, чем Китай. Если бы у нас была переменная с именем size со значениями low, medium и high, то приведенная выше кодировка сработала бы. Однако между ними нет никакого относительного порядка, и приведенные выше значения не будут иметь никакого смысла.

Поэтому, чтобы предотвратить это, у нас есть стратегия под названием Фиктивное кодирование.

Вместо одного столбца здесь у нас будет 3 столбца. У нас есть столбцы, равные количеству категорий.Каждый из трех столбцов будет соответствовать одной стране, и каждый столбец будет иметь значение либо 1, либо 0. Таким образом, в столбце Непал значение будет 1, если страна Непал, и 0, если страна не Непал.

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

from sklearn.preprocessing import LabelEncoder,OneHotEncoder
labelEncoder_X = LabelEncoder()
X[:,0] = labelEncoder_X.fit_transform(X[:, 0])
oneHotEncoder = OneHotEncoder(categorical_features = [0])
X = oneHotEncoder.fit_transform(X).toarray()

Инициализируйте объект ключом categorical_features = [0]. Это означает индекс категориальных данных, к которым мы хотим применить это фиктивное кодирование. В последней строке мы подогнали и преобразовали значения в X, нам не нужно указывать здесь строки и столбец, поскольку они уже определены во второй последней строке. Наконец, мы преобразуем значения в массив.

Выберите и выполните первую строку снова, так как есть новый импорт OneHotEncoder, и выберите последние две строки и выполните код. Вывод будет таким:

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

labelEncoder_y = LabelEncoder()
y = labelEncoder_y.fit_transform(y)

Если вас смущает концепция фиктивной переменной, я объясню ее более подробно в следующих сериях статей.

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

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

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

из 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 = 0)

Здесь мы используем библиотеку sklearn model_selection для этой цели, model_selection состоит из класса train_test_split, как следует из названия, отвечает за выполнение работы.

Мы создали 4 переменные X_train, y_train, которая отвечает за обучающую выборку, и X_test и y_test за тестовую выборку. Параметры инициализации объекта требуют, чтобы мы предоставили массив, поэтому мы включили весь наш набор данных X и y, второй параметр — test_size. Здесь мы разместили 0,2, что означает, что 20% набора данных будет использоваться для тестового набора и 80% для обучающего набора. Обычно мы выбираем от 0,25 до максимум 0,3, но иногда и 0,4. Третий параметр — random_state, предназначенный для целей выборки. За совпадение моих результатов с вашими можно поставить 0.

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

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

Если вы посмотрите на столбец «возраст» и «зарплата», они не совпадают по шкале: возраст колеблется от 28 до 53, тогда как зарплата колеблется от 32 000 до 62 000. Это вызовет некоторые проблемы в модели машинного обучения, поскольку многие модели машинного обучения на основе так называемого евклидова расстояния.

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

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

Стандартизация (Xstand) = (X — среднее (x))/стандартное отклонение (X) Нормализация (Xnorm) = (X — среднее (x))/(max (x) — min (X))

Давайте реализуем это на питоне.

from sklearn.preprocessing import StandardScaler
sc_X = StandardScaler()
X_train = sc_X.fit_transform(X_train)
X_test = sc_X.transform(X_test)

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

Есть два вопроса, которые мы должны рассуждать сами.

  1. Нужно ли масштабировать фиктивные переменные?

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

Теперь все переменные масштабируются в одном масштабе.

2. Нужно ли применять масштабирование признаков для зависимой переменной (y)?

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

8. Шаблон предварительной обработки данных

Теперь мы выполнили все шаги, как будет выглядеть весь набор:

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

Поэтому мы будем использовать этот шаблон для подготовки нашей модели машинного обучения. В следующей серии мы начнем регрессию. Следите за новостями!!!