3

シナリオ


JavaGUIアプリケーション内のデータセットに対して教師あり学習を実装しようとしています。ユーザーには、検査するアイテムまたは「レポート」のリストが提供され、使用可能なラベルのセットに基づいてそれらにラベルが付けられます。教師あり学習が完了すると、ラベル付けされたインスタンスが学習アルゴリズムに渡されます。これにより、ユーザーがそれらを表示する可能性がどの程度あるかについて、残りのアイテムを並べ替えようとします。

ユーザーの時間を最大限に活用するために、レポートのコレクション全体に関するほとんどの情報を提供するレポートを事前に選択し、ユーザーにラベルを付けてもらいたいと思います。私が理解しているように、これを計算するには、各レポートのすべての相互情報量の値の合計を見つけて、その値で並べ替える必要があります。次に、教師あり学習からのラベル付きレポートを使用してベイジアンネットワークを形成し、残りの各レポートのバイナリ値の確率を見つけます。


ここで、人為的な例が説明に役立つ可能性があり、間違いなく間違った用語を使用した場合の混乱を解消する可能性があります:-)アプリケーションがユーザーにニュース記事を表示する例を考えてみましょう。表示されるユーザーの好みに基づいて、最初に表示するニュース記事を選択します。相関関係のあるニュース記事の特徴は、、country of originまたはcategoryですdate。したがって、ユーザーがスコットランドからのニュース記事を興味深いものとしてラベル付けすると、スコットランドの他のニュース記事がユーザーにとって興味深いものになる可能性が高くなることを機械学習者に伝えます。スポーツなどのカテゴリ、または2004年12月12日などの日付についても同様です。

この設定は、すべてのニュース記事の任意の順序(たとえば、カテゴリ別、日付別)を選択するか、ランダムに並べ替えてから、ユーザーが進むにつれて優先度を計算することで計算できます。私がやりたいのは、ユーザーに少数の特定のニュース記事を見て、それらに興味があるかどうかを言わせることによって、その注文の一種の「有利なスタート」を取得することです(教師あり学習の部分)。ユーザーに表示するストーリーを選択するには、ストーリーのコレクション全体を考慮する必要があります。ここで相互情報量が出てきます。各ストーリーについて、ユーザーが分類したときに、他のすべてのストーリーについてどれだけ教えてくれるか知りたいです。たとえば、スコットランドを起源とするストーリーが多数ある場合は、ユーザーにそのうちの1つを(少なくとも)分類してもらいたいと思います。カテゴリや日付などの他の相関機能についても同様です。目標は、分類されたときに他のレポートに関するほとんどの情報を提供するレポートの例を見つけることです。

問題


私の数学は少し錆びていて、機械学習に慣れていないので、相互情報量の定義をJavaの実装に変換するのに問題があります。ウィキペディアでは、相互情報量の方程式を次のように説明しています。

相互情報量方程式

しかし、何も分類されておらず、学習アルゴリズムがまだ何も計算していないときに、これが実際に使用できるかどうかはわかりません。

私の例のように、このクラスの新しいラベルのないインスタンスが多数あったとします。

public class NewsStory {
    private String countryOfOrigin;
    private String category;
    private Date date;
    // constructor, etc.
}

私の特定のシナリオでは、フィールド/機能間の相関は完全一致に基づいているため、たとえば、1日と10年の日付の違いはそれらの不平等において同等です。

相関の要因(たとえば、日付はカテゴリよりも相関が高いですか?)は必ずしも等しいとは限りませんが、事前定義して一定にすることができます。これは、関数の結果が事前定義された値であることを意味しますかp(x,y) それとも用語を混同していますか?

質問 (ついに)


この(偽の)ニュース記事の例を前提として、相互情報量の計算を実装するにはどうすればよいですか?ライブラリ、javadoc、コード例などはすべて歓迎すべき情報です。また、このアプローチに根本的な欠陥がある場合は、その理由を説明することも同様に価値のある答えになります。


PS。私はWekaやApacheMahoutなどのライブラリを知っているので、それらについて言及するだけではあまり役に立ちません。私はまだ相互情報量に関するものを具体的に探しているこれら両方のライブラリのドキュメントと例を探しています。私が本当に役立つのは、これらのライブラリが相互情報量に役立つリソース(コード例、javadoc)を指すことです。

4

2 に答える 2

4

あなたの問題は次のようなものだと思います...

「ラベルのない例のリストが与えられた場合、ユーザーが例にラベルを付けてトレーニング セットに追加した場合にモデルの予測精度がどの程度向上するかでリストを並べ替えます。」

この場合、2 つのインスタンス間の MI を計算できないため、相互情報量を使用するのは適切ではないと思います。MI の定義は確率変数に関するものであり、個々のインスタンスは確率変数ではなく、単なる値です。

機能とクラス ラベルは確率変数と見なすことができます。つまり、データセット全体に値が分布しています。2 つの機能間の相互情報量を計算して、1 つの機能が他の機能にどのように「冗長」であるかを確認したり、機能とクラス ラベルの間で、その機能が予測にどの程度役立つかを把握したりできます。これは、教師あり学習の問題で相互情報量を通常どのように使用するかです。

アクティブラーニングの方法を検討するというferdystschenkoの提案は良いものだと思います。


Grundlefleck のコメントに応えて、Java オブジェクトの類推という彼の考えを使用して、用語についてもう少し詳しく説明します...

まとめて、分類されるオブジェクトを参照するために、「インスタンス」、「モノ」、「レポート」、および「例」という用語を使用しました。これらを Java クラスのインスタンスと考えてみましょう (ボイラープレート コンストラクターは省きました)。


class Example
{ String f1;
  String f2;
}

Example e1 = new Example("foo", "bar");
Example e2 = new Example("foo", "baz");

機械学習の通常の用語は、e1 はであり、すべての例には 2 つの機能f1 と f2 があり、e1 の場合、f1 は値「foo」を取り、f2 は値「bar」を取るというものです。例の集まりはデータセットと呼ばれます。

データ セット内のすべての例について f1 のすべての値を取得します。これは文字列のリストであり、分布と考えることができます。機能は確率変数と考えることができ、リスト内の各値はその確率変数から取得されたサンプルです。したがって、たとえば、f1 と f2 の間の MI を計算できます。擬似コードは次のようになります。

mi = 0
for each value x taken by f1:
{  sum = 0
   for each value y taken by f2:
   {  p_xy = number of examples where f1=x and f2=y
      p_x = number of examples where f1=x
      p_y = number of examples where f2=y
      sum += p_xy * log(p_xy/(p_x*p_y))
   }
   mi += sum
}

ただし、e1 と e2 の間の MI を計算することはできません。そのように定義されていないだけです。

于 2010-01-08T00:20:24.387 に答える