Как работает преобразование столбцов в sklearn? - PullRequest
1 голос
/ 05 апреля 2020

Я создал оценщик для очистки столбца, а затем использовал этот оценщик для преобразования столбца. Вот мой оценщик

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 
...