Sklearn-Pandas DataFrameMapper: mapper.fit_transform дает ValueError: неправильную форму ввода (8, 2)

Мне удалось воспроизвести пример, приведенный в репозитории Github. Однако когда я попробовал это на своих данных, у меня возникла ошибка ValueError.

Ниже приведены фиктивные данные, которые дают ту же ошибку, что и мои настоящие данные.

import pandas as pd
import numpy as np
from sklearn_pandas import DataFrameMapper
from sklearn.preprocessing import LabelEncoder, StandardScaler, MinMaxScaler

data = pd.DataFrame({'pet':['cat', 'dog', 'dog', 'fish', 'cat', 'dog','cat','fish'], 'children': [4., 6, 3, 3, 2, 3, 5, 4], 'salary':   [90, 24, 44, 27, 32, 59, 36, 27], 'feat4': ['linear', 'circle', 'linear', 'linear', 'linear', 'circle', 'circle', 'linear']})

mapper = DataFrameMapper([
    (['pet', 'feat4'], LabelEncoder()),
    (['children', 'salary'], [StandardScaler(),
                              MinMaxScaler()])
]) 

np.round(mapper.fit_transform(data.copy()),2)

Ниже ошибка


ValueError Traceback (последний вызов последним) в () ----> 1 np.round (mapper.fit_transform (data.copy ()), 2)

C: \ Users \ E245713 \ AppData \ Local \ Continuum \ Anaconda3 \ lib \ site-packages \ sklearn \ base.py в fit_transform (self, X, y, ** fit_params) 453 if y is None: 454 # fit method of arity 1 (неконтролируемое преобразование) -> 455 return self.fit (X, ** fit_params) .transform (X) 456 else: 457 # метод соответствия арности 2 (контролируемое преобразование)

C: \ Users \ E245713 \ AppData \ Local \ Continuum \ Anaconda3 \ lib \ site-packages \ sklearn_pandas \ dataframe_mapper.py in fit (self, X, y) 95 для столбцов, преобразователи в self. Функции: 96, если преобразователи не Нет: ---> 97 transformers.fit (self._get_col_subset (X, columns)) 98 return self 99

C: \ Users \ E245713 \ AppData \ Local \ Continuum \ Anaconda3 \ lib \ site-packages \ sklearn \ preprocessing \ label.py in fit (self, y) 106 self: возвращает экземпляр self. 107 "" "-> 108 y = column_or_1d (y, warn = True) 109 _check_numpy_unicode_bug (y) 110 self.classes_ = np.unique (y)

C: \ Users \ E245713 \ AppData \ Local \ Continuum \ Anaconda3 \ lib \ site-packages \ sklearn \ utils \ validation.py в column_or_1d (y, warn) 549 return np.ravel (y) 550 -> 551 raise ValueError ("неправильная форма ввода {0}". формат (форма)) 552 553

ValueError: неправильная форма ввода (8, 2)

Кто-нибудь может помочь?

Благодарность


person wi3o    schedule 27.07.2016    source источник


Ответы (1)


Вы должны отправлять несколько массивов в преобразование, только если оно действительно принимает несколько входных данных (например, sklearn.decomposition.PCA (1) в документации). В вашем случае ошибка в конечном итоге исходит из этой строки:

(['pet', 'feat4'], LabelEncoder()),

Даже это не работает:

(['pet', 'feat4'], [LabelEncoder(), LabelEncoder()]),

Вместо этого вам нужно сделать что-то вроде этого:

mapper_good = DataFrameMapper([
(['pet'], LabelEncoder()),
(['feat4'], LabelEncoder()),
(['children'],  StandardScaler()),
(['salary'],    MinMaxScaler())
])

np.round(mapper_good.fit_transform(data.copy()),2)
person jeff carey    schedule 27.07.2016
comment
Спасибо, @jeff Carey! Я подозревал, что моя ошибка связана с этой строкой, но не мог понять, почему. Я был зациклен на той части документа, в которой говорится, что вы можете делать несколько столбцов с одним трансформатором. Я думаю, это зависит от трансформатора .. Полезно знать! Что касается (['children', 'salary'], [StandardScaler (), MinMaxScaler ()]) на самом деле работает для нескольких столбцов и нескольких преобразователей в одном кортеже (по крайней мере, для этих преобразователей ...). Спасибо еще раз! - person wi3o; 28.07.2016
comment
Кроме того, основная ветка из github имеет функцию применения преобразователя по умолчанию к столбцам, явно не указанным в преобразователе, на случай, если это будет полезно для вас: github.com/paulgb/sklearn-pandas#applying-a-default-transformer - person dukebody; 28.07.2016