понимание того, как работает onehotencoder — почему я получаю множественные в столбце ohe?

#scikit-learn #pipeline #categorical-data #sklearn-pandas #one-hot-encoding

#scikit-learn #конвейер #категориальный-данные #sklearn-pandas #одно-горячее кодирование

Вопрос:

Я использую конвейеры sklearn для выполнения однократного кодирования:

 preprocess = make_column_transformer(
    (MinMaxScaler(),numeric_cols),
    (OneHotEncoder(),['country'])
    )

param_grid =    { 
                  'xgbclassifier__learning_rate': [0.01,0.005,0.001],
                 
                  }

model = make_pipeline(preprocess,XGBClassifier())

# Initialize Grid Search Modelg
model = GridSearchCV(model,param_grid = param_grid,scoring = 'roc_auc',
                                 verbose= 1,iid= True,
                                     refit = True,cv  = 3)
model.fit(X_train,y_train)
  

Чтобы увидеть, как страны имеют одну горячую кодировку, я получаю следующее (я знаю, что их два)

 pd.DataFrame(preprocess.fit_transform(X_test))
  

Результатом этого является:

введите описание изображения здесь

Несколько вопросов:

  • теперь поправьте меня, если я ошибаюсь, но в одной горячей кодировке я думал, что это серия из всех 0 и только ОДНО число 1. почему я получаю несколько единиц в одном столбце
  • когда я выполняю model.predict(x_test), он применяет информацию, как определено в обучении piepline fom?
  • как мне получить имена функций при вызове fit_transform?

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

1. (1) по одному 1 на строку (2) да (3) вам необходимо получить доступ OHE к transformer и проверить vocabulary_ атрибут

2. где это есть в документации, я не могу его найти (атрибут vocabulary?)

3. Это categories_ атрибут для установки OHE . Извините, что ввел вас в заблуждение. Документы здесь

4. хорошо, это делается для получения функций после вызова fit_transform. извините, я не понимаю, что вы имеете в виду в (1), правда ли, что вам нужен только один 1 на вектор для категории, потому что в документах, которыми вы только что поделились, если вы прокрутите вниз, векторы ohe имеют более одного 1

5. чтобы добавить, я имел в виду, когда я вызываю fit_transform(X_test), как мне получить имена всех функций??

Ответ №1:

Чтобы помочь вам лучше понять (1), т.Е. Как OHE работает.

Предположим, у вас есть 1 столбец с категориальными данными:

 df = pd.DataFrame({"categorical": ["a","b","a"]})
print(df)
  categorical
0           a
1           b
2           a
  

Тогда вы получите по одному 1 на строку (это всегда будет верно для категориальных данных одного столбца), но не обязательно для каждого столбца:

 from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder()
ohe.fit(df)
ohe_out = ohe.transform(df).todense()
# ohe_df = pd.DataFrame(ohe_out, columns=ohe.get_feature_names(df.columns))
ohe_df = pd.DataFrame(ohe_out, columns=ohe.get_feature_names(["categorical"]))
print(ohe_df)
   categorical_a  categorical_b
0            1.0            0.0
1            0.0            1.0
2            1.0            0.0
  

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

 df = pd.DataFrame({"categorical":["a","b","a"],"nums":[0,1,0]})
print(df)
  categorical  nums
0           a     0
1           b     1
2           a     0
  

 ohe.fit(df)
ohe_out = ohe.transform(df).todense()
# ohe_df = pd.DataFrame(ohe_out, columns=ohe.get_feature_names(df.columns))
ohe_df = pd.DataFrame(ohe_out, columns=ohe.get_feature_names(["categorical","nums"]))
print(ohe_df)
   categorical_a  categorical_b  nums_0  nums_1
0            1.0            0.0     1.0     0.0
1            0.0            1.0     0.0     1.0
2            1.0            0.0     1.0     0.0