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

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

Я использую FeatureUnion для объединения CountVectorizer и TfidfEmbeddingVectorizer.

Можно использовать только 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?


person Gi Yeon Shin    schedule 08.04.2018    source источник


Ответы (1)


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

подходит (Х, у = нет)

Fit all transformers using X.

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

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

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

Learn vocabulary and idf from training set.

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

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

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

def fit(self, X, y=None):
    ....
    ....
person Vivek Kumar    schedule 09.04.2018