Простой трюк для повышения производительности модели.

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

Существует три распространенных категориальных типа данных:

  1. Порядковый - это набор заказов. Пример: оцените счастье по шкале от 1 до 10.
  2. Двоичный - имеет только два значения. Пример: мужчина или женщина.
  3. Номинальный - не имеет набора заказов. Пример: страны

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

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

Итак, приступим.

Комбинирование категориальных функций в моделях машинного обучения

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

df["new_feature"] = (
	df.feature_1.astype(str)
	 + "_"
	 + df.feature_2.astype(str)
	)

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

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

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

Цель этого набора данных - предсказать, у кого, скорее всего, будет банковский счет. Итак, это проблема классификации.

1.Загрузите набор данных

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

Импортируйте важные пакеты Python.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
np.random.seed(123)
warnings.filterwarnings('ignore')
%matplotlib inline

Загрузите набор данных.

# Import data
data = pd.read_csv('data/Train_v2.csv')

Давайте посмотрим на форму нашего набора данных.

# print shape
print('data shape :', data.shape)
data shape : (23524, 13)

Приведенный выше вывод показывает количество строк и столбцов в наборе данных. У нас есть 13 переменных в наборе данных, 12 независимых переменных и 1 зависимая переменная.

Мы можем наблюдать первые пять строк из нашего набора данных, используя метод head () из библиотеки pandas.

# inspect data 
data.head()

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

2. понимание набора данных

Мы можем получить больше информации о функциях, представленных с помощью метода info () от pandas.

#show Some information about the dataset
print(train_data.info())

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

3. Подготовка данных для моделей машинного обучения.

Следующим шагом является отделение независимых переменных и цели (bank_account) от данных. Затем преобразуйте целевые значения из типа данных объекта в числовые с помощью LabelEncoder.

#import preprocessing module
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import MinMaxScaler
# Convert target label to numerical Data
le = LabelEncoder()
data['bank_account'] = le.fit_transform(data['bank_account'])
#Separate training features from target
X = data.drop(['bank_account'], axis=1)
y = data['bank_account']
print(y)

Целевые значения преобразованы в числовые типы данных, 1 означает «Да», а 0 - «Нет».

Я создал простую функцию предварительной обработки, чтобы:

# function to preprocess our data 
def preprocessing_data(data):
    # Convert the following numerical labels from interger to float
    float_array = data[["household_size", "age_of_respondent", "year"]].values.astype(float
    )
    
    # categorical features to be converted to One Hot Encoding
    categ = [
        "relationship_with_head",
        "marital_status",
        "education_level",
        "job_type",
        "country",
    ]
    
    # One Hot Encoding conversion
    data = pd.get_dummies(data, prefix_sep="_", columns=categ)
    
    # Label Encoder conversion
    data["location_type"] = le.fit_transform(data["location_type"])
    data["cellphone_access"] = le.fit_transform(data["cellphone_access"])
    data["gender_of_respondent"] = le.fit_transform(data["gender_of_respondent"])
    
    # drop uniquid column
    data = data.drop(["uniquid"]), axis=1)
    
    # scale our data 
    scaler = StandardScaler()
    data = scaler.fit_transform(data)
    
    return data

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

# preprocess the train data 
processed_test_data = preprocessing_data(X_train)

4. Построение модели и эксперименты.

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

# Split train_data
from sklearn.model_selection import train_test_spilt
X_Train, X_val, y_Train, y_val = train_test_split(processed_train_data, y_train, stratify = y, test_size = 0.1, random_state=42)

Только 10% набора данных будет использоваться для оценки моделей машинного обучения. Параметр stratify = y обеспечит равный баланс значений из обоих классов («да» и «нет») как для обучающего, так и для проверочного набора.

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

#import classifier algorithm here
from sklearn.linear_model import LogisticRegression
# create classifier
lg_model = LogisticRegression()
#Training the classifier
lg_model.fit(X_Train,y_Train)

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

# import evaluation metrics
from sklearn.metrics import confusion_matrix, accuracy_score
# evaluate the model
y_pred = lg_model.predict(X_val)
# Get the accuracy
print("Accuracy Score of Logistic Regression classifier: ","{:.4f}".format(accuracy_score(y_val, lg_y_pred)))

Оценка точности классификатора логистической регрессии: 0,8874

1-й эксперимент: объедините функции education_level и job_type.

Теперь, когда мы знаем производительность базовой модели, давайте посмотрим, сможем ли мы улучшить ее, объединив функции education_level и job_type.

Что нам нужно сделать в нашем первом эксперименте, так это обновить созданную нами функцию предварительной обработки, а затем запустить остальной код.

# function to preprocess our data 
 
def preprocessing_data(data):
    # Convert the following numerical labels from integer to float
    float_array = data[["household_size", "age_of_respondent", "year"]].values.astype(float)
    # combine some cat features 
    data["features_combination"] = (data.education_level.astype(str) + "_" + data.job_type.astype(str) )
    # remove individual features that are combined together
    data = data.drop(['education_level','job_type'], axis=1)
    # categorical features to be converted by One Hot Encoding
    categ = [
      "relationship_with_head",
      "marital_status",
      "features_combination",
      "country"
      ]
    # One Hot Encoding conversion
    data = pd.get_dummies(data, prefix_sep="_", columns=categ)
    # Label Encoder conversion
    data["location_type"] = le.fit_transform(data["location_type"])
    data["cellphone_access"] = le.fit_transform(data["cellphone_access"])
    data["gender_of_respondent"] = le.fit_transform(data["gender_of_respondent"])
    # drop uniquid column
    data = data.drop(["uniqueid"], axis=1)
    # scale our data 
    scaler = StandardScaler()
    data = scaler.fit_transform(data)
    return data

В приведенной выше функции предварительной обработки я обновил код,

  • Объедините education_level и job_type, чтобы создать новую функцию под названием «features_combination».
  • Удалите отдельные функции (education_level и job_type) из набора данных.
  • Добавьте новую функцию под названием «feature_combinaton» в список категориальных функций, которые будут преобразованы с помощью One Hot Encoding.

Примечание. Я выбрал только номинальные категориальные характеристики (имеют более двух уникальных значений).

После повторного обучения классификатора логистической регрессии для 1-го эксперимента производительность модели увеличилась с 0,8874 до 0,8882. Это показывает, что объединение категориальных признаков может улучшить производительность модели. Имейте в виду, что мы не меняли ничего, например гиперпараметров, в вашем классификаторе машинного обучения.

2-й эксперимент: объедините функции Relations_with_head и marital_status

Во втором эксперименте мы собираемся объединить две другие категориальные характеристики: Relationship_with_head и marital_status.

Нам просто нужно обновить функцию предварительной обработки (как в первом эксперименте), а затем запустить остальной код.

# function to preprocess our data 
def preprocessing_data(data):
    # Convert the following numerical labels from integer to float
    float_array = data[["household_size", "age_of_respondent", "year"]].values.astype(
        float
    )
    
    # combine some cat features 
    data["features_combination"] = (data.relationship_with_head.astype(str) + "_"
                           + data.marital_status.astype(str) 
                      )
    # remove individual features that are combined together
    data = data.drop(['relationship_with_head','marital_status'], axis=1)

    # categorical features to be converted by One Hot Encoding
    categ = [
        "features_combination",
        "education_level",
        "job_type",
        "country",
    ]
    # One Hot Encoding conversion
    data = pd.get_dummies(data, prefix_sep="_", columns=categ)
    # Label Encoder conversion
    data["location_type"] = le.fit_transform(data["location_type"])
    data["cellphone_access"] = le.fit_transform(data["cellphone_access"])
    data["gender_of_respondent"] = le.fit_transform(data["gender_of_respondent"])
    # drop uniquid column
    data = data.drop(["uniqueid"], axis=1)
    # scale our data 
    scaler = StandardScaler()
    data = scaler.fit_transform(data)
    return data

В приведенной выше функции предварительной обработки я обновил код,

  • Объедините Relations_with_head и marital_status, чтобы создать новую функцию под названием «features_combination».
  • Удалите отдельные функции (Relations_with_head и marital_status) из набора данных.
  • Добавьте новую функцию под названием «feature_combination» в список категориальных функций, которые будут преобразованы с помощью One Hot Encoding.

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

Заключение

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

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

Если вы узнали что-то новое или вам понравилось читать эту статью, поделитесь ею, чтобы другие могли ее увидеть. А пока до встречи в следующем посте!

Вы также можете найти меня в Twitter @Davis_McDavid.

Ранее опубликовано здесь.