0

分類する必要のある大量のテキスト文書があるので、私は素朴なベイベイ分類子を書いています。私は私の予測をテストしようとすると、しかし、私は分類がどのように動作するかナイーブベイズ理論を知ってるここテキスト分類器の値を正しくtfidf変換して「フィット」するにはどうすればよいですか?

を尋ねる前にやった

sklearn.utils.validation.NotFittedError: TfidfVectorizer - Vocabulary wasn't fitted.

次のエラーを取得します。

nまであなたが分類し、Pたい別個のクラスです
      P(B|A)*P(A) 
    P(A|B) =   ____________________ 

      P(B|A)*P(A) + P(B|C)*P(C) +...+P(B|n)*P(n) 

(B | A)はAが発生したとP(A)が発生する確率であることを考えると起こるBの確率です。私は多次元的な素朴なベイを使って具体的に作業していることに注意してください。私は予測を行うか、私をテストしようとすると、

SciPy and scikit-learn - ValueError: Dimension mismatch

と同様に、この質問

cannot cast array data when a saved classifier is called

は、しかし、私はまだ問題を抱えている:

また、私はこの質問を見つけました予測。

私はトレーニングを作成するために使用する以下の機能を書いて、テストの作成と訓練モデルを

def create_and_fit_baes_model(data_set): 

    train = [] 
    expect = [] 

    for data in data_set['training set']: 
     train.append(data[1]) 
     expect.append(data[0]) 

    vectorizer = TfidfVectorizer(min_df=1) 

    # I think this is one of the places where I'm doing something 
    # incorrectly 
    vectorized_training_data = vectorizer.fit_transform(train) 


    model = MultinomialNB() 


    model.fit(vectorized_training_data, expect) 

    return model 

と私のモデル

def test_nb_model(data_set, model): 

    test = [] 
    expect = [] 

    for data in data_set['testing set']: 
     test.append(data[1]) 
     expect.append(data[0]) 

    #This is the other section where I think that 
    # I'm doing something incorrectly 
    vectorizer = TfidfVectorizer(min_df=1) 
    vectorized_testing_data = vectorizer.transform(test) 
    fitted_vectorized_testing_data = vectorizer.fit(vectorized_testing_data) 

    predicted = model.predict(fitted_vectorized_testing_data) 

    print(metrics.confusion_matrix(expect,predicted)) 
    print(metrics.classification_report(expect, predicted)) 
をテストするために

def split_data_set(original_data_set, percentage): 
    test_set = [] 
    train_set = [] 

    forbidden = set() 

    split_sets = {} 

    if is_float(percentage): 
     stop_len = int(percentage * len(original_data_set)) 

    while len(train_set) < stop_len: 
     random_selection = randrange(0, len(original_data_set)) 
     if random_selection not in forbidden: 
      forbidden.add(random_selection) 
      train_set.append(original_data_set[random_selection]) 

    for j in range(0, len(original_data_set)-1): 
     if j not in forbidden: 
      test_set.append(original_data_set[j]) 

    split_sets.update({'testing set': test_set}) 
    split_sets.update({'training set': train_set}) 
    split_sets.update({'forbidden': forbidden}) 

    return split_sets 

を設定

私は変換/フィッティングの段階で問題があると思います。

私はこれは別の用語のカウントを有する文書で構成された通常の行列になり

を次のようにTFIDFベクトルが働くことを知っています。

 _term1____term2____term3____termn____________ 
doc1| 5 | 0 |  13 | 1 
doc2| 0 | 8 |  2 | 0 
doc3| 1 | 5 |  5 | 10 
. | . | . |  . | . 
. | . | . |  . | . 
. | . | . |  . | . 
docn| 10 | 0 |  0 | 0 

ここから、特定の単語がコーパスにどれくらい重要かを判断するための重み付けスキームを適用します。

私は理論的にどのように動作するのか知っていますが、私は紙で数学を使うことができますが、私がすべてをコード化する方法についてはまだ少し混乱しています。

私はこの2日間、これを苦労してきました。誰かが私が間違っていることについていくつかの洞察を提供でき、私のモデルを完全に訓練し、どのように実行できるのか、私はそれを感謝します。

+1

あなたはtfidfベクトル化装置も保存する必要があり、トレーニングフェーズで**同じ**を使用する必要があります。 – lejlot

+0

@lejlotまったく同じベクタライザを使うことを意味しますか? 1つのメソッドから別のメソッドに渡す必要がありますか? –

+0

はい、あなたもそれを保存しなければならないということです – lejlot

答えて

2

あなたのベクタマイザーにあなたのクラシファイアをパッケージ化するのに最もクリーンなオプションはPipelineだと思います。 model.fitを呼び出すと、これはあなたのベクタライザのボキャブラリとタームの頻度に合っており、後の機能のために利用できます。このようにして、訓練機能から単一の「モデル」を返すことができます。また、モデルを保存する必要がある場合は、これをピケットすることもできます。あなたはsklearn.cross_validation.train_test_splitを使用することができ、電車/テスト用の分割のための独自のコードを記述する必要はありませんちなみに

from sklearn.pipeline import Pipeline 

def create_and_fit_model(data): 
    # ... get your train and expect data 
    vectorizer = TfidfVectorizer(min_df=1) 
    nb = MultinomialNB() 
    model = Pipeline([('vectorizer', vectorizer), ('nb', nb)]) 
    model.fit(train, expect) 
    return model 

。また、プレーンリストではなく、データを格納するためにパンダを使用することを検討する必要があります。列の抽出が容易になります。

関連する問題