#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