Как мы уже говорили в статье о FrequencyImputationTransoferm,
обычно категориальные значения заменяются целыми числами. Однако этот подход очень опасен для линейных моделей из-за возможной ложной корреляции. Шагом вперед от этой техники является One Hot Encoding (или фиктивные переменные). Но даже у фиктивных переменных есть свои недостатки - матрица становится очень большой, а еще хуже - разреженной. Мы также сказали, что вменение частоты имеет большой недостаток: если есть две или более категорий с одинаковой частотой, тогда эта категория будет конфликтовать в этом представлении. Эта проблема решается с помощью Target Imputation, давайте посмотрим, как это сделать.

Как работает Target Imputation?

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

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

Использование imperio TargetImputationTransformer:

Все трансформаторы от imperio следуют API трансформаторов от sci-kit-learn, что делает их полностью совместимыми с конвейерами sci-kit learn. Во-первых, если вы не устанавливали библиотеку, вы можете сделать это, набрав следующую команду:

pip install imperio

Теперь вы можете импортировать трансформатор, подогнать его и преобразовать некоторые данные. Не забудьте указать индексы категориальных значений!

from imperio import TargetImputationTransformer
target = TargetImputationTransformer(index = [2, 6, 8, 10, 11, 12])
target.fit(X_train, y_train)
X_transformed = target.transform(X_test)

Кроме того, вы можете одновременно подогнать и преобразовать данные.

X_transformed = target.fit_transform(X_train, y_train)

Как мы уже говорили, его можно легко использовать в конвейере научного обучения.

from sklearn.pipeline import Pipeline
from sklearn.linear_model import LogisticRegression
pipe = Pipeline(
    [
     ('target', TargetImputationFrequency(index = [10, 11, 12]),
     ('model', LogisticRegression())
    ]
)

Помимо sci-kit learn API, у трансформаторов Imperio есть дополнительная функция, которая позволяет применять преобразованное к фрейму данных pandas.

new_df = target.apply(df, target = 'target', columns = ['col1'])

Конструктор TargetImputationTransformer имеет следующие аргументы:

  • reg (bool, default = True): параметр, указывающий, является ли это задачей классификации или регрессии.
  • index (list, default = ‘auto’): список индексов столбцов, к которым применяется преобразователь. Если установлено «авто», столбцы с категориями будут найдены самостоятельно.
  • min_int_freq (int, default = 5): минимальное количество категорий, которые столбец должен быть преобразован. Используется, только если для индекса установлено значение «авто».

У функции apply есть следующие аргументы.

  • df (pd.DataFrame): фрейм данных pandas, к которому следует применить преобразователь.
  • target (str): имя целевого столбца.
  • столбцы (список, по умолчанию = Нет): список с именами столбцов, к которым следует применить преобразователи.

Теперь давайте применим его к набору данных UCI по болезням слуха. Однако мы применим его только к небинарным столбцам: «cp», «restecg», «exang», «slope», «ca» и «thal». Ниже показаны матрицы неточностей до и после применения преобразования. Точность увеличилась на 6%.

Сделано с ❤ от Sigmoid!