Как использовать 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)
Я исправил ту же проблему, используя приведенный выше код.