TypeError: fit() 需要3个参数(给定2个)与sklearn和sklearn_pandas
我正在尝试使用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看起来是个合适的选择。
1 个回答
1
因为 sklearn_pandas
目前不支持接受带标签的 y
向量的估计器,所以你只能用它来把所有特征转换成一个 Numpy 矩阵,然后再单独使用 KNeighborsClassifier
。
更新于2015-08-10 - sklearn_pandas
的 DataFrameMapper
不是用来作为一个包含转换和模型拟合的流水线,而只是用来选择性地转换列。如果你想先转换数据再估计模型,可以使用一个普通的 sklearn
Pipeline
,把数据框映射器作为第一步。