マルチラベルテキスト分類子を作成するために、Doc2Vecモデルをトレーニングしようとしています。
そのために、約70000の記事を含むデータセットを選択しました。すべての記事には、1500〜2000語が含まれています。
これらの記事は5つのクラスに分かれています。
入力を設定するときに、ドキュメントのタグとして対応するラベルを選択しました。私は次のようにそれを行いました:tagged_article = data.apply(lambda r: TaggedDocument(words=r['article'].split(), tags=[r.labels]), axis=1)
それから私は次のラインコードで私のモデルを訓練しました:
model_dbow = Doc2Vec(dm=1, vector_size=300, negative=5, min_count=10, workers=cores)
model_dbow.build_vocab([x for x in tqdm(tagged_article.values)])
print("Training the Doc2Vec model for ", no_epochs, "number of epochs" )
for epoch in range(no_epochs):
model_dbow.train(utils.shuffle([x for x in tqdm(tagged_article.values)]),total_examples=len(tagged_article.values), epochs=1)
model_dbow.alpha -= 0.002
model_dbow.min_alpha = model_dbow.alpha
その後、すべての記事のタグを予測するために、ロジスティック回帰モデルを作成しました。
そのために、次の関数を作成しました:\
def vec_for_learning(model, tagged_docs):
sents = tagged_docs.values
targets, regressors = zip(*[(doc.tags[0], model.infer_vector(doc.words, steps=inference_steps)) for doc in tqdm(sents)])
return targets, regressors
y_train, X_train = vec_for_learning(model_dbow, tagged_article)
logreg = LogisticRegression(solver='lbfgs',max_iter=1000)
logreg.fit(X_train, y_train)
残念ながら、私は非常に悪い結果を得ています。実際、正解率は22%、F1スコアは21%です。
なぜ私がこれらの悪い結果を得ているのか説明してもらえますか?
何よりもまず、自分自身train()
を管理しalpha
ているときに、自分のループを使用して複数回呼び出すことはほぼ間違いなく望ましくありません。参照:私のDoc2Vecコードは、トレーニングを何度も繰り返した後、良い結果が得られていません。何が悪いのでしょうか?
あなたは自分のno_epochs
価値を示さないので、あなたが絶対的に最悪のことをしているとは確信できません-最終的alpha
には負の値に減少します-しかしあなたはそうかもしれません。それでも、エラーが発生しやすいループは必要ありません。(そして、このコードテンプレートを提案したソースに連絡して、アンチパターンを推進していることを知らせてください。)
たった5つの既知のラベルをドキュメントタグとして使用するのもおそらく間違いです。つまり、すべての記事が5つの巨大なテキストの断片であるかのように、モデルは基本的に5つのドキュメントベクトルのみを学習します。既知のラベルをタグとして使用(または追加)すると便利な場合もありますが、より古典的なトレーニング方法でDoc2Vec
は、各ドキュメントに一意のIDが与えられるため、モデルは(あなたの場合)約70,000の異なるドキュメントベクトルを学習し、より豊富に学習できます。すべてのドキュメントとラベルによって、さまざまな不規則な形状にまたがるドキュメントの可能性のあるスペースをモデル化します。
あなたのデータは確かにDoc2Vec
アルゴリズムの価値を示す公開された作品に匹敵するサイズですが、あなたのコーパスは巨大ではありません(そしてあなたの語彙がどれほど大きくて多様であるかは不明です)。したがって、300のディメンションは、データの量や種類に対してmin_count=10
大きすぎるか、重要性が低く、サンプリングが不十分な単語をトリミングするのに積極的すぎる(または十分に積極的ではない)可能性があります。
最後に、Doc2Vec
クラスはデフォルトepochs
値の5を継承しますが、公開されているほとんどの作業では10〜20のトレーニングエポックが使用されており、データセットが小さい場合はさらに役立つ場合があります。さらに、推論はepochs
モデルの作成時に同じセット(またはデフォルト)を再利用し、(少なくとも)epochs
トレーニングと同じ数で最適に機能しinference_steps
ますが、何を使用しているかは不明です。
(コードの読みやすさの別の問題として:モデルmodel_dbow
に名前を付けましたが、dm=1
実際に使用することにより、PV-DBOWモードではなくPV- DMモードを使用しています。)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加