为什么这个sklearn管道示例中没有fit_transform工作?

时间:2016-06-27 20:09:14

标签: python scikit-learn

我是sklearn Pipeline的新手,并遵循示例代码。我在其他示例中看到我们可以pipeline.fit_transform(train_X),所以我在管道上尝试了同样的事情pipeline.fit_transform(X),但它给了我一个错误

" return self.fit(X,** fit_params).transform(X)

TypeError:fit()只需要3个参数(给定2个)"

如果我删除了svm部分并将管道定义为pipeline = Pipeline([("features", combined_features)]),我仍然看到错误。

有谁知道为什么fit_transform无法在这里工作?

from sklearn.pipeline import Pipeline, FeatureUnion
from sklearn.grid_search import GridSearchCV

from sklearn.svm import SVC
from sklearn.datasets import load_iris
from sklearn.decomposition import PCA
from sklearn.feature_selection import SelectKBest

iris = load_iris()

X, y = iris.data, iris.target

# This dataset is way to high-dimensional. Better do PCA:
pca = PCA(n_components=2)

# Maybe some original features where good, too?
selection = SelectKBest(k=1)

# Build estimator from PCA and Univariate selection:

combined_features = FeatureUnion([("pca", pca), ("univ_select", selection)])

# Use combined features to transform dataset:
X_features = combined_features.fit(X, y).transform(X)

svm = SVC(kernel="linear")

# Do grid search over k, n_components and C:

pipeline = Pipeline([("features", combined_features), ("svm", svm)])

param_grid = dict(features__pca__n_components=[1, 2, 3],
                  features__univ_select__k=[1, 2],
                  svm__C=[0.1, 1, 10])

grid_search = GridSearchCV(pipeline, param_grid=param_grid, verbose=10)
grid_search.fit(X, y)
print(grid_search.best_estimator_)

1 个答案:

答案 0 :(得分:0)

您在上面的示例中遇到错误,因为您还需要将标签传递给管道。你应该打电话给pipeline.fit_transform(X,y)pipeline中的最后一步是分类器SVC,分类器的fit方法也需要将标签作为必需参数。所有分类器的fit方法也需要标签,因为分类算法使用这些标签来训练分类器中的权重。

同样,即使您删除了SVC,仍然会收到错误,因为SelectKBest类的fit方法同时还需要Xy