Как отслеживать столбцы после кодирования категориальных переменных? - PullRequest
1 голос
/ 07 февраля 2020

Мне интересно, как я могу отслеживать исходные столбцы набора данных после выполнения предварительной обработки данных на нем?

В приведенном ниже коде df_columns сообщит мне, что столбец 0 в df_array равно A, столбец 1 равен B и т. д. ...

Однако, когда я кодирую категориальный столбец, B df_columns больше не подходит для отслеживания df_dummies

import pandas as pd
import numpy as np

animal = ['dog','cat','horse']

df = pd.DataFrame({'A': np.random.rand(9),
                   'B': [animal[np.random.randint(3)] for i in range(9)],
                   'C': np.random.rand(9),
                   'D': np.random.rand(9)})

df_array = df.values
df_columns = df.columns

from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer
ct = ColumnTransformer([('encoder', OneHotEncoder(), [1])], remainder='passthrough')
df_dummies = np.array(ct.fit_transform(df_array), dtype=np.float)

Решение должно быть агностично c от позиции категориального столбца ... будь то A, B, C или D. Я могу выполнить грубую работу и постоянно обновлять словарь df_columns ... но это не будет элегантно или "pythoni c"

Более того ... как будет выглядеть решение для отслеживания что значат категорики? {0,0,1} будет кошкой, {0,1,0} будет собакой и т. Д.?

PS - я знаю о фиктивной переменной-ловушке и возьму df_dummies[:,1:], когда я на самом деле используйте это, чтобы обучить мою модель.

1 Ответ

1 голос
/ 07 февраля 2020

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

new_df_reindexed = new_df[df_columns]

Чтобы ответить на другие вопросы, вы можете горячее кодирование ваших данных, используя get_dummies() из pandas. Используйте параметр drop_first, чтобы удалить одно из сгенерированных значений столбца и избежать ловушки фиктивной переменной. Кроме того, сохраните список столбцов фрейма данных с горячим кодированием.

Чтобы новый набор данных / для тестирования / удержания имел такое же определение столбца, как и при обучении модели,

  • Сначала используйте get_dummies() для горячего кодирования нового набора данных.
  • Используйте pandas reindex, чтобы привести новый фрейм данных в ту же структуру, что и при обучении модели - df.reindex(columns=train_one_hot_encode_col_list, axis="columns").
  • Приведенное выше описание создаст столбцы фиктивных переменных для значений категориальных столбцов в наборе обучающих данных, которых нет в категориальных столбцах нового набора данных.
  • Наконец, используйте описанный выше метод для удаления любые столбцы в новом наборе данных, которых нет в старом наборе данных - test_df_reindexed = test_df_onehotencode[train_one_hot_encode_col_list]

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

Я бы также посоветовал вам ознакомиться с приведенным ниже документом для дальнейшего ознакомления: однократное кодирование в pandas - https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.get_dummies.html Повтор столбца индексация - https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.reindex.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...