OneHotEncoder поднимает проблему NaN после того, как SimpleImputer уже был вызван - PullRequest
1 голос
/ 14 октября 2019

Мне сложно понять, как конвейеры должны работать в Склеарне. Ниже приведен пример использования титанового набора данных.

data = pd.read_csv('datasets/train.csv')

cat_attribs = ["Embarked", "Cabin", "Ticket", "Name"]

num_pipeline = Pipeline([
        ('imputer', SimpleImputer(strategy="median")),
    ])


str_pipeline = Pipeline([
        ('imputer', SimpleImputer(strategy="most_frequent")),
    ])


full_pipeline = ColumnTransformer([
        ("num", num_pipeline, ["Pclass", "Age", "SibSp", "Parch", "Fare"]),
        ("str", str_pipeline, ["Cabin", "Sex"]),
        ("cat", OneHotEncoder(), ["Cabin"]),
    ])

full_pipeline.fit_transform(data)

Я ожидаю, что это заполнит все отсутствующие атрибуты NaN значений (как в числовом, так и в строковом формате), а затем, наконец, преобразует атрибут Cabin вчисловой.

Вместо этого код заканчивается следующей ошибкой:

ValueError: Вход содержит NaN. Если я удаляю строку, вызывающую OneHotEncoder и печатающую преобразованный массив, значение NaN отсутствует.

Следовательно, мне интересно. Как я должен звонить OneHotEncoder в этой ситуации.

1 Ответ

1 голос
/ 14 октября 2019

Я бы порекомендовал применить OneHotEncoder ко всем категориальным переменным. Следовательно, сделайте это как отдельный конвейер.

Поскольку это одностадийный процесс для числовых столбцов, вы можете напрямую использовать ColumnTransformer.

Попробуйте это!

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

cat_preprocess = make_pipeline(SimpleImputer(strategy="most_frequent"), OneHotEncoder())

ct = make_column_transformer([
        ("num", SimpleImputer(strategy="median"), ["Pclass", "Age", "SibSp", "Parch", "Fare"]),
        ("str", cat_preprocess, ["Cabin", "Sex"]),
    ])

pipeline = Pipeline([('preprocess', ct)])
...