Я создал оценщик для очистки столбца, а затем использовал этот оценщик для преобразования столбца. Вот мой оценщик
class CabinImputer(BaseEstimator, TransformerMixin):
def __init__(self, imp='Z'):
self.imputer = SimpleImputer(missing_values=np.NaN, strategy='constant', fill_value=imp)
pat = re.compile(r'^[A-Z]')
self.categorizer = np.vectorize(lambda x: pat.match(x).group())
def fit(self, X=None, y=None):
return self
def transform(self, X):
X = self.imputer.fit_transform(X)
print(X[1:8, 0])
X[:, 0] = self.categorizer(X[:, 0])
print(X.shape)
return X
imputer = ColumnTransformer([
('cabin_imp', CabinImputer(), ['Cabin']),
('Emb_imp', SimpleImputer(strategy='most_frequent'), ['Embarked'])
])
Оценщик просто вменяет все пропущенные значения с помощью 'Z' и извлекает первую заглавную букву из каждого элемента столбца.
Но всякий раз, когда я пытаюсь преобразовать мой данные с использованием столбца трансформатора. Следующая ошибка появляется вверх. AttributeError: 'NoneType' object has no attribute 'group'
Когда я просто использую преобразователь с помощью
cbimp = CabinImputer()
cbimp.fit_transform(data.Cabin.to_frame())
, ошибка не отображается, и первая функция печати дает ожидаемый результат ['C85' 'Z' 'C123' 'Z' 'Z' 'E46' 'Z']
, но при использовании преобразователя столбца imputer.fit_transform(data)
, появляется указанная выше ошибка, и первая функция печати выдает результат, подобный ['C85' 'missing_value' 'C123' 'missing_value' 'missing_value' 'E46' 'missing_value']
Что здесь не так?
Edit1:
В ходе дальнейших исследований я обнаружил, что основная проблема заключается в том, что всякий раз, когда я использую ColumnTransformer
, параметр fill_value
не передается! Почему ??!
Edit2: В конце концов, проблема была решена путем создания объекта SimpleImputer
в функции fit
. Но я не знаю, в чем была проблема с более ранним кодом
def fit(self, X=None, y=None):
# self.imp = imp in __init__ function
self.imputer = SimpleImputer(missing_values=np.NaN, strategy='constant', fill_value=self.imp)
return self