【问题标题】:TypeError: fit() takes exactly 3 arguments (2 given) with sklearn and sklearn_pandasTypeError: fit() 使用 sklearn 和 sklearn_pandas 恰好需要 3 个参数(给定 2 个)
【发布时间】:2014-08-26 07:42:58
【问题描述】:

我正在尝试使用 sklearn_pandas 模块来扩展我在 pandas 中所做的工作并涉足机器学习,但我正在努力解决一个我不太了解如何解决的错误。

我正在处理Kaggle 上的以下数据集。

它本质上是一个带有浮点值的无标题表(1000 行,40 个特征)。

import pandas as pdfrom sklearn import neighbors
from sklearn_pandas import DataFrameMapper, cross_val_score
path_train ="../kaggle/scikitlearn/train.csv"
path_labels ="../kaggle/scikitlearn/trainLabels.csv"
path_test = "../kaggle/scikitlearn/test.csv"

train = pd.read_csv(path_train, header=None)
labels = pd.read_csv(path_labels, header=None)
test = pd.read_csv(path_test, header=None)
mapper_train = DataFrameMapper([(list(train.columns),neighbors.KNeighborsClassifier(n_neighbors=3))])
mapper_train

输出:

DataFrameMapper(features=[([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39], KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
       n_neighbors=3, p=2, weights='uniform'))])

到目前为止一切顺利。但后来我尝试了合身

mapper_train.fit_transform(train, labels)

输出:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-6-e3897d6db1b5> in <module>()
----> 1 mapper_train.fit_transform(train, labels)

//anaconda/lib/python2.7/site-packages/sklearn/base.pyc in fit_transform(self, X, y,     **fit_params)
    409         else:
    410             # fit method of arity 2 (supervised transformation)
--> 411             return self.fit(X, y, **fit_params).transform(X)
    412 
    413 

//anaconda/lib/python2.7/site-packages/sklearn_pandas/__init__.pyc in fit(self, X, y)
    116         for columns, transformer in self.features:
    117             if transformer is not None:
--> 118                 transformer.fit(self._get_col_subset(X, columns))
    119         return self
    120 

TypeError: fit() takes exactly 3 arguments (2 given)`

我做错了什么?虽然这种情况下的数据都是一样的,但我计划为混合分类、名义和浮点特征制定一个工作流程,sklearn_pandas 似乎是合乎逻辑的。

【问题讨论】:

  • 在检查了代码之后,作者似乎忘记了处理 y (label) 值。 Look at the code:从未使用过y 参数。我也无法在文档中重现交叉验证示例,但这可能是由于版本控制问题。你真的需要这个吗?我发现 pandas 和 sklearn 结合得很好。
  • 说实话,我不确定我是否需要它,但它看起来好像是一个有用的包装器,想看看它是否有帮助。感谢您花时间浏览代码的事实。我不知道从哪里开始 :)
  • sklearn-pandas 作者在这里。这是一个棘手的领域,因为在 sklearn 中,BaseEstimator 类可以有两个不同的接口,一个是通过 y,一个是不通过。 sklearn-pandas 最初尝试在 try/except 中使用 y,如果它抛出 TypeError,它会在没有 y 的情况下再次尝试。老实说,我不记得为什么会改变,但我一定认为这没有必要。我不确定你是否找到了解决方法,但我已经打开了一个问题来解决这个问题,如果你想跟踪它,问题就在这里:github.com/paulgb/sklearn-pandas/issues/12
  • 保罗,太好了。我很感激你的时间。我刚刚开始使用 sklearn,并试图利用我在 pandas 中积累的知识来扩展自己。虽然我知道足够多的蟒蛇是危险的,但当出现问题时,我通常会超出我的深度。很高兴 Stackoverflow 上的社区。​​span>

标签: python pandas machine-learning scikit-learn kaggle


【解决方案1】:

由于sklearn_pandas 当前不支持接受带有标签的y 向量的估计器,因此您只需将其用于将所有特征转换为Numpy 矩阵,然后在单独的步骤中使用KNeighborsClassifier

更新 2015-08-10 - sklearn_pandas DataFrameMapper 不打算用作转换 + 模型拟合的管道,而仅用于有选择地转换列。如果要转换然后估计模型,请使用普通的 sklearn Pipeline 和数据帧映射器作为第一步。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-07
    • 2012-03-15
    • 2014-05-06
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多