Как указать имена столбцов после горячего кодирования с помощью sklearn?

Вот мой вопрос, я надеюсь, что кто-то может помочь мне понять это.

Чтобы объяснить, в моем наборе данных более 10 категориальных столбцов, и каждый из них имеет 200-300 категорий. Я хочу преобразовать их в двоичные значения. Для этого я использовал кодировщик первой метки для преобразования строковых категорий в числа. Код Label Encoder и выходные данные показаны ниже.

Как указать имена столбцов после горячего кодирования с помощью sklearn?

После Label Encoder я снова использовал One Hot Encoder From scikit-learn, и это сработало. НО ПРОБЛЕМА В том, что мне нужны имена столбцов после одного горячего кодировщика. Например, столбец A с категориальными значениями перед кодированием. A = [1,2,3,4,..]

Так и должно быть после кодирования

A-1, A-2, A-3

Кто-нибудь знает, как присвоить имена столбцов (старые имена столбцов - имя значения или номер) после одного горячего кодирования. Вот моя одна горячая кодировка и ее вывод;

Как указать имена столбцов после горячего кодирования с помощью sklearn?

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

Пожалуйста, НЕ используйте изображения кода. Скопируйте фактический текст из редактора кода, вставьте его в вопрос, а затем отформатируйте как код. Это помогает другим легче читать и тестировать ваш код..

sentence 28.05.2019 13:06
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
20
1
19 343
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Вы можете получить имена столбцов, используя атрибут .get_feature_names().

>>> ohenc.get_feature_names()
>>> x_cat_df.columns = ohenc.get_feature_names()

Подробный пример: здесь.

Обновлять

начиная с версии 1.0 используйте get_feature_names_out

get_feature_names устарело в scikit-learn 1.2, вместо этого используйте get_feature_names_out
Lfppfs 16.12.2021 19:54

Спасибо. Я думаю, что это устарело в версии 1.0. ссылка. Кстати, версия 1.2 еще не выпущена!

Venkatachalam 18.12.2021 13:12

Этот пример может помочь будущим читателям:

import pandas as pd
from sklearn.preprocessing import OneHotEncoder

train_X = pd.DataFrame({'Sex':['male', 'female']*3, 'AgeGroup':[0,15,30,45,60,75]})
>>>
     Sex     AgeGroup
0    male         0
1  female        15
2    male        30
3  female        45
4    male        60
5  female        75
encoder=OneHotEncoder(sparse=False)

train_X_encoded = pd.DataFrame (encoder.fit_transform(train_X[['Sex']]))

train_X_encoded.columns = encoder.get_feature_names(['Sex'])

train_X.drop(['Sex'] ,axis=1, inplace=True)

OH_X_train= pd.concat([train_X, train_X_encoded ], axis=1)
>>>
    AgeGroup  Sex_female  Sex_male
0         0         0.0       1.0
1        15         1.0       0.0
2        30         0.0       1.0
3        45         1.0       0.0
4        60         0.0       1.0
5        75         1.0       0.0`

Пытался запустить этот пример и говорит: «ValueError: не удалось преобразовать строку в число с плавающей запятой:« женский »».

Ignacio Alorre 16.10.2020 18:32

Спасибо! Бетон и это работает

Mangostino 23.10.2021 23:20

Эй, у меня была та же проблема, из-за которой у меня был собственный Estimator, который расширил класс BaseEstimator из Sklearn.base.

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

from sklearn.base import BaseEstimator, TransformerMixin
import pandas as pd

class CustomOneHotEncoder(BaseEstimator, TransformerMixin):

    def __init__(self, **kwargs):
        self.feature_names = []

    def fit(self, X, y=None):
        return self

    def transform(self, X):

        result = pd.get_dummies(X)
        self.feature_names = result.columns

        return result

Немного простой, я знаю, но он делает работу, в которой я нуждаюсь.

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

a = model.best_estimator_.named_steps["clf"].feature_importances_
b = model.best_estimator_.named_steps["ohc"].feature_names

df = pd.DataFrame(a,b)
df.sort_values(by=[0], ascending=False).head(20)

Есть еще один простой способ с пакетом category_encoders этот метод использует конвейер, который также является одним из лучших методов обработки данных.

import pandas as pd
from category_encoders.one_hot import OneHotEncoder

X = pd.DataFrame({'Sex':['male', 'female']*3, 'AgeGroup':[0,15,30,45,60,75]})

ohe = OneHotEncoder(use_cat_names=True)
ohe.fit_transform(X)

Обновление: на основании ответа @Venkatachalam метод get_feature_names() устарел в scikit-learn 1.0. Вы получите предупреждение при попытке запустить его. Вместо этого используйте get_feature_names_out():

import pandas as pd
from category_encoders.one_hot import OneHotEncoder

ohenc = OneHotEncoder(sparse=False)
x_cat_df = pd.DataFrame(ohenc.fit_transform(xtrain_lbl))
x_cat_df.columns = ohenc.get_feature_names_out(input_features=xtrain_lbl.columns)

Установка параметра sparse=False в OneHotEncoder() вернет массив вместо разреженной матрицы, поэтому вам не нужно его конвертировать позже. fit_transform() рассчитает параметры и преобразует тренировочный набор в одну строку.

Источник: Документация OneHotEncoder

Другие вопросы по теме