Как использовать Sklearn Column Transformer?

Я пытаюсь преобразовать категориальное значение (в моем случае это столбец страны) в закодированное значение с помощью LabelEncoder, а затем с OneHotEncoder и смог преобразовать категориальное значение. Но я получаю предупреждение, как будто ключевое слово категорическое_разделение OneHotEncoder устарело: вместо этого используйте ColumnTransformer. Так как же я могу использовать ColumnTransformer для достижения того же результата?

Ниже мой набор входных данных и код, который я попробовал

Input Data set

Country Age Salary
France  44  72000
Spain   27  48000
Germany 30  54000
Spain   38  61000
Germany 40  67000
France  35  58000
Spain   26  52000
France  48  79000
Germany 50  83000
France  37  67000


import pandas as pd
import numpy as np
from sklearn.preprocessing import LabelEncoder, OneHotEncoder

#X is my dataset variable name

label_encoder = LabelEncoder()
x.iloc[:,0] = label_encoder.fit_transform(x.iloc[:,0]) #LabelEncoder is used to encode the country value
hot_encoder = OneHotEncoder(categorical_features = [0])
x = hot_encoder.fit_transform(x).toarray()

И на выходе я получаю как, Как я могу получить тот же выход с трансформатором столбца

0(fran) 1(ger) 2(spain) 3(age)  4(salary)
1         0       0      44        72000
0         0       1      27        48000
0         1       0      30        54000
0         0       1      38        61000
0         1       0      40        67000
1         0       0      35        58000
0         0       1      36        52000
1         0       0      48        79000
0         1       0      50        83000
1         0       0      37        67000

я попробовал следующий код

from sklearn.compose import ColumnTransformer, make_column_transformer

preprocess = make_column_transformer(

    ( [0], OneHotEncoder())
)
x = preprocess.fit_transform(x).toarray()

мне удалось закодировать столбец страны с вышеуказанным кодом, но пропустив столбец возраста и зарплаты из переменной x после преобразования

Ответ 1

Странно, что вы хотите закодировать непрерывные данные в качестве зарплаты. Это не имеет смысла, если вы не связали свою зарплату с определенными диапазонами/категориями. Если бы я где ты, я бы сделал:

import pandas as pd
import numpy as np

from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler, OneHotEncoder



numeric_features = ['Salary']
numeric_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='median')),
    ('scaler', StandardScaler())])

categorical_features = ['Age','Country']
categorical_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='constant', fill_value='missing')),
    ('onehot', OneHotEncoder(handle_unknown='ignore'))])

preprocessor = ColumnTransformer(
    transformers=[
        ('num', numeric_transformer, numeric_features),
        ('cat', categorical_transformer, categorical_features)])

отсюда вы можете передать его с помощью классификатора, например,

clf = Pipeline(steps=[('preprocessor', preprocessor),
                  ('classifier', LogisticRegression(solver='lbfgs'))])  

Используйте это так:

clf.fit(X_train,y_train)

это применяет препроцессор и затем передает преобразованные данные предиктору.

Ответ 2

Я думаю, что плакат не пытается изменить возраст и зарплату. Из документации (https://scikit-learn.org/stable/modules/generated/sklearn.compose.make_column_transformer.html) вы ColumnTransformer (и make_column_transformer) только столбцы, указанные в преобразователе (т.е. [0] в вашем примере). Вы должны установить remainder = "passthrough", чтобы получить остальные столбцы. Другими словами:

preprocessor = make_column_transformer( (OneHotEncoder(),[0]),remainder="passthrough")
x = preprocessor.fit_transform(x)

Ответ 3

@Fawwaz Yusran Чтобы справиться с этим предупреждением...

FutureWarning: The handling of integer data will change in version 0.22. Currently, the categories are determined based on the range [0, max(values)], while in the future they will be determined based on the unique values. If you want the future behaviour and silence this warning, you can specify "categories='auto'". In case you used a LabelEncoder before this OneHotEncoder to convert the categories to integers, then you can now use the OneHotEncoder directly. warnings.warn(msg, FutureWarning)

Удалить следующее...

labelencoder_X = LabelEncoder()
X[:, 0] = labelencoder_X.fit_transform(X[:, 0])

Поскольку вы используете OneHotEncoder напрямую, вам не нужен LabelEncoder.

Ответ 4

Daniel,

На самом деле, как вы инициализировали свои X_train и y_train в clf.fit(X_train,y_train)? Я сделал это с помощью X_train = dataset.iloc[:, :2] и y_train = dataset.iloc[:, 2:3] но, похоже, это не правильно...

Ответ 5

from sklearn.compose import make_column_transformer
        preprocess = make_column_transformer(

( OneHotEncoder(categories='auto'), [0] ),remainder="passthrough"
 ) X = preprocess.fit_transform(X)

Я исправил ту же проблему, используя приведенный выше код.