sk-learn: ошибка fit() принимает 2 позиционных аргумента, но 3 были заданы в FeatureUnion

avatar
Gi Yeon Shin
8 апреля 2018 в 07:06
2247
1
1

Я использовал sk-learn в python для подгонки моделей и преобразования input_data через модели.

Я беру FeatureUnion, чтобы объединить CountVectorizer и TfidfEmbeddingVectorizer.<96243974149009>.

Можно использовать только CountVectorizer или только TfidfEmbeddingVectorizer, но если я объединим две функции с помощью Feature Union, возникнет такая ошибка:

TypeError: fit() takes 2 positional arguments but 3 were given

Класс TfidfEmbeddingVectorizer выглядит следующим образом:

class TfidfEmbeddingVectorizer(object):
   ...
    def fit(self, X):
            tfidf = TfidfVectorizer(analyzer=lambda x: x)
            tfidf.fit(X)
            # if a word was never seen - it must be at least as infrequent
            # as any of the known words - so the default idf is the max of 
            # known idf's
            max_idf = max(tfidf.idf_)
            self.word2weight = defaultdict(
                lambda: max_idf,
                [(w, tfidf.idf_[i]) for w, i in tfidf.vocabulary_.items()])

            return self

И я использовал FeatureUnion следующим образом:

model = gensim.models.Word2Vec(speech.train_data, size = 100)
w2v = dict(zip(model.wv.index2word, model.wv.syn0))

count = CountVectorizer(tokenizer=lambda doc: doc, lowercase=False)
w2v_tfidf = TfidfEmbeddingVectorizer(w2v)
feature_union = FeatureUnion([('ngram', count),
                             ('tfidf', w2v_tfidf)])
feature_union.fit(speech.train_data)

Я видел решение, что понижение версии sk-learn до 0.18.0 делает его нормальным, но я не могу понизить версию sk-learn из-за этой ошибки:

error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://andinghub.visualstudio.com/visual-cpp-build-tools

Есть ли другие решения для использования функции подгонки FeatureUnion?

Источник

Ответы (1)

avatar
Vivek Kumar
9 апреля 2018 в 06:45
1

Метод fit() FeatureUnion принимает X и y в качестве входных данных согласно документации:

подходит(X, y=нет)

Fit all transformers using X.

Несмотря на то, что его значение по умолчанию равно None, оно по-прежнему передается внутренним преобразователям. Он присутствует там из соображений совместимости при использовании в конвейере.

Теперь поговорим о методе внутренних трансформаторов fit().

fit(raw_documents, y=None)

Learn vocabulary and idf from training set.

Как видите, он также содержит y по той же причине, хотя нигде его не использует.

  • Ваш пользовательский метод TfidfEmbeddingVectorizer fit() не имеет дополнительного параметра y.

Но объединение функций попытается впихнуть в него y (с его значением None) и, следовательно, ошибка. Просто измените fit на :

def fit(self, X, y=None):
    ....
    ....