2

私はTfIdfVectorizerとMultinomialNBを使用して自分のモデルを訓練し、ピクルファイルに保存しました。tfidfvectorizer保存されたクラシファイアを予測する

他のファイルの分類子を使用して、目に見えないデータを予測しようとしているので、分類子の機能の数が私の機能の数と同じではない現在のコーパス。

これは私が予測しようとしているコードです。関数do_vectorizeは、トレーニングで使用される関数とまったく同じです。

def do_vectorize(data, stop_words=[], tokenizer_fn=tokenize): 
    vectorizer = TfidfVectorizer(stop_words=stop_words, tokenizer=tokenizer_fn) 
    X = vectorizer.fit_transform(data) 
    return X, vectorizer 

# Vectorizing the unseen documents 
matrix, vectorizer = do_vectorize(corpus, stop_words=stop_words) 

# Predicting on the trained model 
clf = pickle.load(open('../data/classifier_0.5_function.pkl', 'rb')) 
predictions = clf.predict(matrix) 

は、しかし、私はこれは私もテストするために、トレーニングから自分の語彙を保存しなければならないことを意味

ValueError: Expected input with 65264 features, got 472546 instead 

機能の数が異なっているというエラーを受け取りますか?トレーニングに存在しない用語がある場合はどうなりますか?

私はscikit-learnのパイプラインを同じベクタライザとクラシファイアと両方で同じパラメータで使用しようとしました。しかし、それは1時間から6時間以上に遅すぎたので、私は手動で行うことを好む。

答えて

1

これは、テストするために訓練から私の語彙を保存する必要があることを意味しますか?

はい、あなたは特に語彙を節約する意味全体TFIDFのベクトル化を、保存する必要があります。

トレーニングに存在しない用語がある場合はどうなりますか?

彼らはこのようにそこに(まだそれを使用することができ、より複雑な方法がある考慮すべきものは何もありませんが、そうではない、あなたが全くトレーニングデータこの程度を持っていないので、完璧な理にかなっている、無視されますtfidfのような簡単なアプローチを使用してください)。

私はscikit-learnのパイプラインを同じベクタライザとクラシファイアと両方で同じパラメータで使用しようとしました。しかし、それは1時間から6時間以上に遅すぎたので、私は手動で行うことを好む。

パイプラインを使用する場合、オーバーヘッドはほとんどまたはまったくないはずですが、手動で操作することは、ベクタライザも同様に格納することができれば問題ありません。

関連する問題