Это мой первый проект машинного обучения, и я впервые использую ColumnTransformer. Моя цель - выполнить два этапа предварительной обработки данных и использовать ColumnTransformer для каждого из них.
На первом шаге я хочу заменить отсутствующие значения в моем фрейме данных строкой «missing_value» для некоторых функций и наиболее частым значением для остальных функций. Поэтому я объединяю эти две операции, используя ColumnTransformer и передавая ему соответствующие столбцы моего информационного кадра.
На втором шаге я хочу использовать только что обработанные данные и применять OrdinalEncoder или OneHotEncoder в зависимости от функций. Для этого я снова использую ColumnTransformer.
Затем я объединяю два этапа в один конвейер.
Я использую набор данных Kaggle Houses Price, у меня есть версия 0.20 scikit-learn, и это упрощенная версия моего кода:
cat_columns_fill_miss = ['PoolQC', 'Alley']
cat_columns_fill_freq = ['Street', 'MSZoning', 'LandContour']
cat_columns_ord = ['Street', 'Alley', 'PoolQC']
ord_mapping = [['Pave', 'Grvl'], # Street
['missing_value', 'Pave', 'Grvl'], # Alley
['missing_value', 'Fa', 'TA', 'Gd', 'Ex'] # PoolQC
]
cat_columns_onehot = ['MSZoning', 'LandContour']
imputer_cat_pipeline = ColumnTransformer([
('imp_miss', SimpleImputer(strategy='constant'), cat_columns_fill_miss), # fill_value='missing_value' by default
('imp_freq', SimpleImputer(strategy='most_frequent'), cat_columns_fill_freq),
])
encoder_cat_pipeline = ColumnTransformer([
('ordinal', OrdinalEncoder(categories=ord_mapping), cat_columns_ord),
('pass_ord', OneHotEncoder(), cat_columns_onehot),
])
cat_pipeline = Pipeline([
('imp_cat', imputer_cat_pipeline),
('cat_encoder', encoder_cat_pipeline),
])
К сожалению, когда я применяю его к housing_cat, подмножество моего информационного кадра, включающее только категориальные функции,
cat_pipeline.fit_transform(housing_cat)
Я получаю ошибку:
AttributeError: у объекта 'numpy.ndarray' нет атрибута 'столбцы'
Во время обработки вышеуказанного исключения произошло другое исключение:
...
ValueError: Указание столбцов с использованием строк поддерживается только для панд DataFrames
Я пробовал этот упрощенный конвейер, и он работает правильно:
new_cat_pipeline = Pipeline([
('imp_cat', imputer_cat_pipeline),
('onehot', OneHotEncoder()),
])
Однако, если я попытаюсь:
enc_one = ColumnTransformer([
('onehot', OneHotEncoder(), cat_columns_onehot),
('pass_ord', 'passthrough', cat_columns_ord)
])
new_cat_pipeline = Pipeline([
('imp_cat', imputer_cat_pipeline),
('onehot_encoder', enc_one),
])
Я начинаю получать ту же ошибку.
Я подозреваю, что эта ошибка связана с использованием ColumnTransformer на втором этапе, но я на самом деле не понимаю, откуда она взялась. Способ идентификации столбцов на втором шаге такой же, как на первом шаге, поэтому мне остается неясным, почему только на втором шаге я получаю ошибку атрибута ...