2

Scikit-learn の半教師あり Naive Bayes (Bernoulli) の実装を使用したいと思います。github のこのリンクによると、1 年前にいくつかの作業と議論がありました (クラス SemisupervisedNB)。一方で別の実装(関数 fit_semi?)もあるみたいで、その後別のユーザーが磨いたらしい。ただし、現在の安定版リリースではそれらのどれも利用できません。

Semisupervised Naive Bayes を構築するために、現在のリリースの scikit-learn でこれら 2 つの実装のいずれかを使用する方法の例を誰かに教えてもらえますか? ありがとう。

PS: クラス SklearnClassifier で NLTK の scikit-learn 分類子を使用しています

編集

プロジェクトで SemiSupervisedNB のコードを試し、ラベルのないクラスのラベルを -1 から 2 に変更しました (NLTK の SKlearnClassifier を使用しており、ラベルのないクラスはラベル 2 を取得します)。ただし、切片配列に inf 値が含まれているため、d (モデルの現在のパラメーターと以前のパラメーターの差) を計算するときに、ValueError: array must not contain infs または NaNs を取得しています...これを解決する方法について何か考えはありますか?

4

1 に答える 1

4

数か月前、私はこのトピックについてGitHubで問題を開きました。それぞれのコードをscikit-learnの現在のマスターブランチに追加することができます。

ユーザー@larsmansは、約1年前に実験的なクラスSemisupervisedNBをファイルに追加しましたsklearn/naive_bayes.py。このコードは、彼のフォークされたscikit-learnリポジトリのブランチにあり、ここemnbからアクセスできます。

重要なコードは2つのファイルにあります。

  1. 現在のマスターブランチのファイルnaive_bayes.pyは、ブランチの古いファイルに置き換える必要がありemnbます。

  2. マスターブランチのファイルにあるクラスの編集LabelBinarizerが必要です。sklearn/preprocessing.pyクラス全体を@larsmansのemnbブランチの定義に置き換える必要があります。そこで、それはファイルにありますsklearn/preprocessing/__init__.py

単純ベイズ分類器のコードは1年間あまり変更されていませんが、いくつかのバグ修正が追加されています。naive_bayes.pyしたがって、ファイルとクラスの現在のバージョンを保持しLabelBinarizer、代わりに実験的なバージョンに異なる名前を付けることは理にかなっています。

scikit-learnリポジトリの独自のフォークを作成し、現在の安定したブランチの上に実験ファイルを追加しました0.13.X。このブランチはと呼ばれ、ここ0.13.X-emnbからアクセスできます。最近の3つのコミット(123)を見ると、変更して新しく作成したファイルがわかります。

SemisupervisedNB他の分類子の最新バージョンとは連携しないため、の横に新しいモジュールを追加しましnaive_bayes.pysemisupervised_naive_bayes.py。そこには、古いバージョンの分類子が名前が変更されたバージョンに含まれています。たとえばSemiMultinomialNBMultinomialNB分類子の最新バージョンと衝突しないようにするためです。SemisupervisedLabelBinarizer同様に、隣にクラスを追加しましたLabelBinarizer(名前の選択は少し残念ですが、少なくともそれが何に使用されるべきかは明らかです)。

したがって、半教師ありバージョンの分類器を使用する場合は、モジュールを使用しますsklearn.semisupervised_naive_bayes。現在のバージョンでは、モジュールを使用してsklearn.naive_bayesください。

ただし、これは非常に実験的なものであることに注意してください。これは、この古いコードを機能させるための設定にすぎません。バグは検索していません。

于 2013-01-31T11:29:24.757 に答える