Вопрос или проблема
Я написал следующий код для кодирования категориальных признаков датафрейма (названного ‘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)
Заключение
Кодирование категориальных столбцов является критическим шагом в предварительной обработке данных. Важно правильно выбрать способ кодирования в зависимости от требований вашей модели и специфики данных. Предложенные методы помогут вам эффективно справиться с кодированием категориальных параметров для анализа данных и машинного обучения. Если вы столкнулись с дополнительными трудностями, не стесняйтесь задавать вопросы!