使用sklearn FeatureUnion组合特征时出现fit()参数不匹配错误求助
这个问题我之前在项目里也碰到过,核心原因是你的自定义TfidfEmbeddingVectorizer没有遵循sklearn的标准Transformer接口规范!
问题根源
sklearn的所有Transformer组件(包括FeatureUnion里的子组件),其fit方法都必须遵循fit(self, X, y=None)的参数签名。当你用FeatureUnion组合组件时,它会统一调用每个子组件的fit方法,并且自动传递y参数(哪怕你的模型是无监督任务,y会被设为None)。
但你的TfidfEmbeddingVectorizer的fit方法只定义了self和X两个参数,当FeatureUnion尝试传递第三个参数y时,就会触发TypeError: fit() takes 2 positional arguments but 3 were given这个错误。
修复方案
只需要修改你的fit方法,添加y=None的可选参数,同时确保方法返回self(这也是sklearn接口的强制要求)。
修改后的类示例:
class TfidfEmbeddingVectorizer(object): # 你的初始化方法和其他逻辑... def fit(self, X, y=None): # 添加y=None参数 tfidf = TfidfVectorizer(...) # 你的TfidfVectorizer配置 tfidf.fit(X) # 这里写你的其他fit逻辑,比如保存tfidf模型或者计算权重等 return self # 必须返回self,符合sklearn接口 def transform(self, X): # 你的特征转换逻辑 # 示例:返回tfidf转换后的结果 return tfidf.transform(X)
进阶优化:继承sklearn基类
为了避免后续出现更多接口兼容问题,建议让自定义Transformer继承sklearn.base.BaseEstimator和sklearn.base.TransformerMixin,这两个基类会帮你自动实现fit_transform等基础方法,代码更规范:
from sklearn.base import BaseEstimator, TransformerMixin class TfidfEmbeddingVectorizer(BaseEstimator, TransformerMixin): def __init__(self, tfidf_params=None): self.tfidf_params = tfidf_params or {} self.tfidf = None def fit(self, X, y=None): self.tfidf = TfidfVectorizer(**self.tfidf_params) self.tfidf.fit(X) return self def transform(self, X): return self.tfidf.transform(X)
这样修改后,再用FeatureUnion组合CountVectorizer和你的自定义TfidfEmbeddingVectorizer就不会报错了。
内容的提问来源于stack exchange,提问作者Gi Yeon Shin

