Не удается закодировать несколько категориальных столбцов одновременно [дубликат]

Вопрос или проблема

Я написал следующий код для кодирования категориальных признаков датафрейма (названного ‘t’)

from sklearn.compose import ColumnTransformer

categorical_columns = ['warehouse_ID', 'Product_Type','month', 'is_weekend', 'is_warehouse_closed']

transformer = ColumnTransformer(transformers= [('le',preprocessing.LabelEncoder()  ,categorical_columns)],remainder="passthrough")

Train_transform = transformer.fit_transform(t) 

Но он выдает эту ошибку –

TypeError: fit_transform() принимает 2 позиционных аргумента, но было передано 3

Вам даже не обязательно использовать LabelEncoder()

Один простой подход, используя минимальный пример, выглядит так:

from sklearn.compose import ColumnTransformer
from sklearn import preprocessing
import pandas as pd

categorical_columns = ['warehouse_ID', 'Product_Type','month', 'is_weekend', 'is_warehouse_closed']

t = pd.DataFrame([['CategoryString'] * len(categorical_columns)], columns=categorical_columns) # создать фиктивный t; будет удалено
display(t)

t = pd.DataFrame({col: t[col].astype('category').cat.codes for col in categorical_columns}, index=t.index)

display(t)

Дополнительные подходы, включая то, как использовать LabelEncoder() для нескольких столбцов, уже можно найти здесь

.

Ответ или решение

Ошибка кодирования нескольких категориальных столбцов в Pandas и Scikit-learn

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

Проблема

Вы пытались использовать LabelEncoder через ColumnTransformer, что в результате вызвало ошибку:

TypeError: fit_transform() takes 2 positional arguments but 3 were given

Причина в том, что LabelEncoder не предназначен для работы с несколькими столбцами одновременно через ColumnTransformer. Он предназначен для обработки одного столбца за раз, так как он кодирует метки категорий в целочисленные значения.

Решение

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

Подход 1: Использование pd.get_dummies()

Один из простых способов кодирования категориальных переменных заключается в использовании функции pd.get_dummies():

import pandas as pd

# Пример данных
t = pd.DataFrame({
    'warehouse_ID': ['A', 'B', 'A', 'C'],
    'Product_Type': ['Type1', 'Type2', 'Type1', 'Type3'],
    'month': ['January', 'February', 'March', 'April'],
    'is_weekend': [1, 0, 1, 0],
    'is_warehouse_closed': [0, 1, 0, 1]
})

# Применяем One-Hot Кодирование
t_encoded = pd.get_dummies(t, columns=['warehouse_ID', 'Product_Type', 'month'], drop_first=True)

print(t_encoded)
Подход 2: Использование ColumnTransformer с OneHotEncoder

Если вы хотите использовать ColumnTransformer и OneHotEncoder, необходимо сделать следующее:

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
import pandas as pd

# Создаем пример данных
t = pd.DataFrame({
    'warehouse_ID': ['A', 'B', 'A', 'C'],
    'Product_Type': ['Type1', 'Type2', 'Type1', 'Type3'],
    'month': ['January', 'February', 'March', 'April'],
    'is_weekend': [1, 0, 1, 0],
    'is_warehouse_closed': [0, 1, 0, 1]
})

# Определяем категориальные колонки
categorical_columns = ['warehouse_ID', 'Product_Type', 'month']

# Создаем трансформер
transformer = ColumnTransformer(
    transformers=[('ohe', OneHotEncoder(drop='first'), categorical_columns)],
    remainder='passthrough'
)

# Применяем трансформацию
t_encoded = transformer.fit_transform(t)

# Для просмотра результата преобразования
print(t_encoded)
Подход 3: Использование LabelEncoder для отдельных столбцов

Если вам действительно необходимо использовать LabelEncoder, рассмотрите возможность применения его по отдельности для каждого столбца:

from sklearn.preprocessing import LabelEncoder

# Применяем LabelEncoder для каждого столбца
label_encoders = {}
for column in categorical_columns:
    le = LabelEncoder()
    t[column] = le.fit_transform(t[column])
    label_encoders[column] = le  # Сохраняем преобразователь на случай необходимости

print(t)

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...