Как мы уже говорили в статье о 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!