Проблемы с бинарным однократным (одно-K) кодированием в python

Двоичное однократное (также известное как однокоординатное) кодирование заключается в создании одного двоичного столбца для каждого отдельного значения для категориальной переменной. Например, если у вас есть цветной столбец (категориальная переменная), который принимает значения «красный», «синий», «желтый» и «неизвестный», тогда двоичное однострочное кодирование заменяет столбец цвета двоичными колонками «color = красный ',' color = blue 'и' color = yellow '. Я начинаю с данных в кадре данных pandas, и я хочу использовать эти данные для обучения модели с помощью scikit-learn. Я знаю два способа сделать двоичное однократное кодирование, но ни один из них не удовлетворительный для меня.

  1. Pandas и get_dummies в категориальных столбцах кадра данных. Этот метод кажется превосходным, поскольку исходный кадр данных содержит все доступные данные. То есть, вы делаете разогретое кодирование до разделения ваших данных на тренировочных, валидационных и тестовых наборах. Однако, если данные уже разделены в разных наборах, этот метод работает не очень хорошо. Зачем? Поскольку один из наборов данных (скажем, набор тестов) может содержать меньше значений для данной переменной. Например, может случиться так, что в то время как набор тренировок содержит значения красного, синего, желтого и неизвестного для переменного цвета, набор тестов содержит только красный и синий. Таким образом, тестовый набор будет иметь меньше столбцов, чем набор тренировок. (Я не знаю, как сортируются новые столбцы, и даже если они имеют одинаковые столбцы, это может быть в другом порядке в каждом наборе).

  2. Sklearn и DictVectorizer Это решает предыдущую проблему, так как мы можем убедиться, что мы применяем те же самые преобразования к тестовому набору. Однако результатом преобразования является массив numpy вместо кадра данных pandas. Если мы хотим восстановить вывод в виде кадра данных pandas, нам необходимо (или, по крайней мере, так оно и есть): 1) pandas.DataFrame (данные = результат преобразования DictVectorizer, index = индекс исходных данных панд frame, columns = DictVectorizer (). get_features_names) и 2) объединить по индексу результирующий кадр данных с исходным, содержащий числовые столбцы. Это работает, но это несколько громоздко.

Есть ли лучший способ сделать двоичную одноразовую кодировку в кадре данных pandas, если у нас есть наши данные, разделенные на обучение и набор тестов?

  • sklearn LogisticRegression без регуляризации
  • Scikit-learn predict_proba дает неправильные ответы
  • Можно ли печатать дерево решений в scikit-learn?
  • Понимание моделей гауссовой смеси
  • ValueError: отрицательные размеры не допускаются
  • Пользовательский трансформатор для sklearn Pipeline, который изменяет как X, так и y
  • Python - генерировать массив определенной автокорреляции
  • Scikit Узнать SVC decision_function и предсказать
  • 2 Solutions collect form web for “Проблемы с бинарным однократным (одно-K) кодированием в python”

    Если ваши столбцы находятся в одном порядке, вы можете get_dummies , использовать get_dummies , а затем разделить их снова, например,

     encoded = pd.get_dummies(pd.concat([train,test], axis=0)) train_rows = train.shape[0] train_encoded = encoded.iloc[:train_rows, :] test_encoded = encoded.iloc[train_rows:, :] 

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

    Тип данных можно задать категориальным:

     In [5]: df_train = pd.DataFrame({"car":Series(["seat","bmw"]).astype('category',categories=['seat','bmw','mercedes']),"color":["red","green"]}) In [6]: df_train Out[6]: car color 0 seat red 1 bmw green In [7]: pd.get_dummies(df_train ) Out[7]: car_seat car_bmw car_mercedes color_green color_red 0 1 0 0 0 1 1 0 1 0 1 0 

    См. Этот вопрос Панды.

    Python - лучший язык программирования в мире.