«ValueError: все входные массивы должны иметь одинаковое количество измерений» Ошибка в конвейере sklearn - PullRequest
0 голосов
/ 30 октября 2018

Я строю конвейер машинного обучения, используя конвейер sklearn. На этапе предварительной обработки я пытаюсь выполнить две разные обработки для двух разных переменных sting 1) Одна горячая кодировка в BusinessType 2) Среднее кодирование в AreaCode, как показано ниже:

preprocesses_pipeline = make_pipeline (
    FeatureUnion (transformer_list = [
        ("text_features1",  make_pipeline(
            FunctionTransformer(getBusinessTypeCol, validate=False), CustomOHE()
        )),
        ("text_features2",  make_pipeline(
            FunctionTransformer(getAreaCodeCol, validate=False)
        ))
    ])
)

preprocesses_pipeline.fit_transform(trainDF[X_cols])

С классами TransformerMixin, определенными как:

class MeanEncoding(BaseEstimator, TransformerMixin):
    def fit(self, X, y=None):
        return self

    def transform(self, X):
        tmp = X['AreaCode1'].map(X.groupby('AreaCode1')['isFail'].mean())
        return tmp.values

class CustomOHE(BaseEstimator, TransformerMixin):
    def fit(self, X, y=None):
        return self

    def transform(self, X):
        tmp = pd.get_dummies(X)
        return tmp.values

и функции FunctionTransformer, возвращающие требуемые поля

def getBusinessTypeCol(df):
    return df['BusinessType']

def getAreaCodeCol(df):
    return df[['AreaCode1','isFail']]

Теперь, когда я запускаю вышеуказанный конвейер, он генерирует следующую ошибку

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-146-7f3a31a39c81> in <module>()
     15 )
     16 
---> 17 preprocesses_pipeline.fit_transform(trainDF[X_cols])

~\Anaconda3\lib\site-packages\sklearn\pipeline.py in fit_transform(self, X, y, **fit_params)
    281         Xt, fit_params = self._fit(X, y, **fit_params)
    282         if hasattr(last_step, 'fit_transform'):
--> 283             return last_step.fit_transform(Xt, y, **fit_params)
    284         elif last_step is None:
    285             return Xt

~\Anaconda3\lib\site-packages\sklearn\pipeline.py in fit_transform(self, X, y, **fit_params)
    747             Xs = sparse.hstack(Xs).tocsr()
    748         else:
--> 749             Xs = np.hstack(Xs)
    750         return Xs
    751 

~\Anaconda3\lib\site-packages\numpy\core\shape_base.py in hstack(tup)
    286         return _nx.concatenate(arrs, 0)
    287     else:
--> 288         return _nx.concatenate(arrs, 1)
    289 
    290 

ValueError: all the input arrays must have same number of dimensions

Кажется, что ошибка происходит на линии, имеющей "MeanEncoding" в конвейере, так как удаление его делает конвейер нормально работающим. Не уверен, что именно с ним не так. Нужна помощь.

1 Ответ

0 голосов
/ 31 октября 2018

ОК, я решаю головоломку. По сути, MeanEncoding() после преобразования возвращает массив формата (n,), тогда как возвращаемый вызов ожидает формат в (n,1), поэтому он может объединить этот (n,1) с другими уже обработанными массивами (n,k), возвращенными первым конвейером, CustomOHE(). Поскольку numpy не может объединять (n,) и (n,k), его необходимо преобразовать в (n,1). Итак, теперь мой MeanEncoding класс выглядит следующим образом:

class MeanEncoding(BaseEstimator, TransformerMixin):
    def fit(self, X, y=None):
        return self

    def transform(self, X):
        tmp = X['AreaCode1'].map(X.groupby('AreaCode1')['isFail'].mean())
        return tmp.values.reshape(len(tmp), 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...