Каким должен быть формат функций с одним горячим кодированием для scikit-learn?

#python #python-3.x #scikit-learn #one-hot-encoding

Вопрос:

Я пытаюсь использовать регрессор/классификаторы библиотеки scikit-learn. Я немного смущен форматом функций с одним горячим кодированием, так как я могу отправлять массивы данных или массивы numpy в модель. Допустим, у меня есть категориальные признаки с именами «а», » в » и «с». Должен ли я приводить их в отдельных столбцах (с pandas.get_dummies() ), как показано ниже:

a b c
1 1 1
1 0 1
0 0 1

или вот так (слил все)

слитый
1,1,1
1,0,1
0,0,1

И как сказать модели scikit-learn, что это категориальные функции с одним горячим кодированием?

Ответ №1:

Вы не можете передать функцию, содержащую объединенный список, непосредственно в модель. Сначала вы должны однократно кодировать в отдельные столбцы:

  • Если вам просто нужно что-то быстрое и простое, get_dummies подойдет для разработки, но большинство источников, которые я читал, обычно предпочитают следующие подходы.
  • Если вы хотите закодировать свои входные данные, используйте OneHotEncoder (OHE) для кодирования одного или нескольких столбцов, а затем объедините их с другими функциями. OHE обеспечивает хороший контроль над форматом вывода, хранит промежуточные данные и обрабатывает ошибки. Хорошо для производства.
  • Если вам нужно закодировать один столбец, обычно, но не ограничиваясь метками, используйте LabelBinarizer для однократного кодирования столбца с одним значением или используйте MultiLabelBinarizer для однократного кодирования столбца с несколькими значениями.

Как только у вас есть данные/метки с одним горячим кодом, вам не нужно «сообщать» модели, что некоторые функции являются горячими. Вы просто тренируете модель на основе набора данных clf.fit(X_train, y_train) и делаете прогнозы с помощью clf.predict(X_test) .

О, пример

 from sklearn.preprocessing import OneHotEncoder
import pandas as pd

X = [['Male', 1], ['Female', 3], ['Female', 2]]
ohe = OneHotEncoder(handle_unknown='ignore')
X_enc = ohe.fit_transform(X).toarray()

# Convert to dataframe if you need to merge this with other features:
df = pd.DataFrame(X_enc, columns=ohe.get_feature_names())
 

Пример MLB

 from sklearn.preprocessing import MultiLabelBinarizer
import pandas as pd

df = pd.DataFrame({
   'style': ['Folk', 'Rock', 'Classical'],
   'instruments': [['guitar', 'vocals'], ['guitar', 'bass', 'drums', 'vocals'], ['piano']]
})

mlb = MultiLabelBinarizer()
encoded = mlb.fit_transform(df['instruments'])
encoded_df = pd.DataFrame(encoded, columns=mlb.classes_, index=df['instruments'].index)

# Drop old column and merge new encoded columns
df = df.drop('instruments', axis=1)
df = pd.concat([df, encoded_df], axis=1, sort=False)
 

Комментарии:

1. Как насчет MultiLabelBinarizer() ?

2. @MehmedB MLB используется для кодирования меток. Я добавил MLB в свой ответ для большей ясности. Дайте мне знать, если у вас все еще есть вопросы. Если вы хотите получить более подробную информацию, пожалуйста, добавьте образец кода к вашему вопросу.

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

4. Они должны быть однократно закодированы в отдельных столбцах и объединены с любыми другими имеющимися у вас функциями (для входной матрицы X ). Если вы однократно кодируете метки ( y ), то вы передаете метки, закодированные в отдельных столбцах fit(X, y) метода (нет необходимости объединяться с вашей матрицей объектов, так как метки передаются в отдельном аргументе).