分類する必要のある大量のテキスト文書があるので、私は素朴なベイベイ分類子を書いています。私は私の予測をテストしようとすると、しかし、私は分類がどのように動作するかナイーブベイズ理論を知ってるここテキスト分類器の値を正しく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日間、これを苦労してきました。誰かが私が間違っていることについていくつかの洞察を提供でき、私のモデルを完全に訓練し、どのように実行できるのか、私はそれを感謝します。
あなたはtfidfベクトル化装置も保存する必要があり、トレーニングフェーズで**同じ**を使用する必要があります。 – lejlot
@lejlotまったく同じベクタライザを使うことを意味しますか? 1つのメソッドから別のメソッドに渡す必要がありますか? –
はい、あなたもそれを保存しなければならないということです – lejlot