Вот мой вопрос, я надеюсь, что кто-то может помочь мне понять это.
Чтобы объяснить, в моем наборе данных более 10 категориальных столбцов, и каждый из них имеет 200-300 категорий. Я хочу преобразовать их в двоичные значения. Для этого я использовал кодировщик первой метки для преобразования строковых категорий в числа. Код Label Encoder и выходные данные показаны ниже.
После Label Encoder я снова использовал One Hot Encoder From scikit-learn, и это сработало. НО ПРОБЛЕМА В том, что мне нужны имена столбцов после одного горячего кодировщика. Например, столбец A с категориальными значениями перед кодированием. A = [1,2,3,4,..]
Так и должно быть после кодирования
A-1, A-2, A-3
Кто-нибудь знает, как присвоить имена столбцов (старые имена столбцов - имя значения или номер) после одного горячего кодирования. Вот моя одна горячая кодировка и ее вывод;
Мне нужны столбцы с именем, потому что я обучил ИНС, но каждый раз, когда появляются данные, я не могу снова и снова преобразовывать все прошлые данные. Итак, я хочу добавлять только новые каждый раз. Все равно спасибо..
Вы можете получить имена столбцов, используя атрибут .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
Спасибо. Я думаю, что это устарело в версии 1.0. ссылка. Кстати, версия 1.2 еще не выпущена!
Этот пример может помочь будущим читателям:
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: не удалось преобразовать строку в число с плавающей запятой:« женский »».
Спасибо! Бетон и это работает
Эй, у меня была та же проблема, из-за которой у меня был собственный 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
Пожалуйста, НЕ используйте изображения кода. Скопируйте фактический текст из редактора кода, вставьте его в вопрос, а затем отформатируйте как код. Это помогает другим легче читать и тестировать ваш код..