Scikit学习自定义变压器尺寸不匹配

2024-04-23 19:44:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我来自R,所以ScikitAPI对我来说还是很困惑。我是按照这个教程http://michelleful.github.io/code-blog/2015/06/20/pipelines/来学习管道的。所以我们创建一个假数据集仅供参考:

x1,x2,y
foo,zoo,1
bar,moo,2
goo,too,3
roo,zoo,4
too,moo,5

我的目标很简单:在y上训练一个线性回归,使用x1和x2的单独tfidf矩阵,加上x1和x2的一些自定义特性(例如,字长等)。在

让我们从一个更简单的任务开始,即只使用x1中的tfidf。以下是完整代码:

^{pr2}$

我得到错误ValueError: dimension mismatch,可能是因为有些术语不会出现在两个train/validation折叠中。正确的做法是什么?谢谢您!在


Tags: iogithubhttpcode教程blogtootfidf
1条回答
网友
1楼 · 发布于 2024-04-23 19:44:30

将您的列图表更改为:

class ColumnNgram(BaseEstimator, TransformerMixin):
    def __init__(self, colname, tokenizer, ngram_rg):
        self.colname = colname
        self.tokenizer = tokenizer
        self.ngram_rg = ngram_rg
        self.tfidf = None

    def transform(self, df, y=None):
        return self.tfidf.transform(df[self.colname].values)

    def fit(self, df, y=None):
        self.tfidf = TfidfVectorizer(tokenizer=self.tokenizer, ngram_range=self.ngram_rg)
        self.tfidf.fit(df[self.colname].values)
        return self

您应该在fit()中声明并了解培训数据。目前,您正在重新拟合对transform()的每个调用中的数据,这显然将在train和validation集中以不同的特性返回,正如您所建议的那样。在

正确的方法是保留一个TfidfVectorizer,它在fit()期间学习数据,然后只转换transform()中的新数据,而不是重新拟合新数据。在

相关问题 更多 >