【问题标题】:Sklearn-Pandas DataFrameMapper: mapper.fit_transform gives ValueError: bad input shape (8, 2)Sklearn-Pandas DataFrameMapper: mapper.fit_transform 给出 ValueError: bad input shape (8, 2)
【发布时间】:2016-12-01 20:58:38
【问题描述】:

我能够复制Github repo 中给出的示例。但是,当我对自己的数据进行尝试时,我得到了 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 in fit_transform(self, X, y, **fit_params) 453 如果 y 为无: 454 # arity 1的拟合方法(无监督变换) --> 455 返回 self.fit(X, **fit_params).transform(X) 456 其他: 457 # arity 2的拟合方法(监督变换)

C:\Users\E245713\AppData\Local\Continuum\Anaconda3\lib\site-packages\sklearn_pandas\dataframe_mapper.py in fit(self, X, y) 95列,self.features中的变压器: 96 如果变压器不是无: ---> 97 个transformers.fit(self._get_col_subset(X, columns)) 98回归自我 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,警告) 第549章 550 --> 551 raise ValueError("bad input shape {0}".format(shape)) 552 第553章

ValueError: bad input shape (8, 2)

谁能帮忙?

谢谢

【问题讨论】:

    标签: python pandas sklearn-pandas


    【解决方案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)
    

    【讨论】:

    • 谢谢@jeff carey!我怀疑我的错误来自那条线,但不知道为什么。我很关注文档中说你可以用 1 个变压器做多列的部分。我想这取决于变压器..很高兴知道!至于 (['children','salary'], [StandardScaler(), MinMaxScaler()]) 实际上适用于同一元组中的多个列和多个转换器(至少对于这些转换器......)。再次感谢!
    • 此外,来自 github 的 master 分支具有将默认转换器应用于转换器中未明确列出的列的功能,以防这对您有用:github.com/paulgb/sklearn-pandas#applying-a-default-transformer
    猜你喜欢
    • 2021-01-22
    • 2021-04-14
    • 2023-03-19
    • 2015-09-27
    • 2018-06-25
    • 2016-11-12
    • 2019-08-07
    • 2019-09-22
    • 2020-09-06
    相关资源
    最近更新 更多