1

Accord.Net Frameworkを使用して、機械学習NaiveBayesクラスを使用してベイズ予測を行う方法を理解しようとしています。ドキュメントにリストされているサンプルコードに従い、サンプルからモデルを作成することができました。

私が理解できないのは、そのモデルに基づいて予測を行う方法です。

Accord.Netフレームワークが機能する方法は、Codificationと呼ばれるクラスを使用して、文字列のテーブルをそれらの文字列の数値の構文表現に変換することです。モデルをトレーニングするために入力と出力のDataTableを作成する方法は次のとおりです(このコードの90%は例から直接引用しています)。

        var dt = new DataTable("Categorizer");
        dt.Columns.Add("Word");
        dt.Columns.Add("Category");

        foreach (string category in categories)
        {
            rep.LoadTrainingDataForCategory(category,dt);
        }

        var codebook = new Codification(dt);
        DataTable symbols = codebook.Apply(dt);
        double[][] inputs = symbols.ToArray("Word");
        int[] outputs = symbols.ToIntArray("Category").GetColumn(0);

        IUnivariateDistribution[] priors = {new GeneralDiscreteDistribution(codebook["Word"].Symbols)};
        int inputCount = 1;
        int classCount = codebook["Category"].Symbols;
        var target = new NaiveBayes<IUnivariateDistribution>(classCount, inputCount, priors);

        target.Estimate(inputs, outputs);

そして、これはすべて正常に機能します。これで、作成したばかりのトレーニング済みデータモデルに対してテストしたい新しい入力があります。だから私はこれをやろうとします:

        var testDt = new DataTable("Test Data");
        testDt.Columns.Add("Word");
        foreach (string token in tokens)
        {
            testDt.Rows.Add(token);
        }

        DataTable testDataSymbols = codebook.Apply(testDt);
        double[] testData = testDataSymbols.ToArray("Word").GetColumn(0);

        double logLikelihood = 0;
        double[] responses;
        int cat = target.Compute(testData, out logLikelihood, out responses);

モデルを作成したときに以前使用していたものと同じコードブックオブジェクトを使用していることに注意してください。元のモデルと同じコードブックを使用してデータを体系化する必要があります。そうしないと、同じ単語が2つの完全に異なる値でエンコードされる可能性があります(元のモデルの「bob」という単語は番号23に対応し、新しいモデルでは、数43...それはうまくいきません。)

ただし、次の行でNullReferenceExceptionエラーが発生します。

        DataTable testDataSymbols = codebook.Apply(testDt);

エラーは次のとおりです。

System.NullReferenceException: Object reference not set to an instance of an object.
   at Accord.Statistics.Filters.Codification.ProcessFilter(DataTable data)
   at Accord.Statistics.Filters.BaseFilter`1.Apply(DataTable data)
   at Agent.Business.BayesianClassifier.Categorize(String[] categories, String testText) 

私が渡しているオブジェクトはすべてnullではないので、これはコードのより深いところで起こっているに違いありません。しかし、私にはわかりません。

助けてくれてありがとう。そして、Accord.Netのベイジアンの例から実際に予測が行われる例を誰かが知っているなら、あなたがそれを共有するならば、私は大いに義務づけられるでしょう。

4

1 に答える 1

4

最後の部分のドキュメントが不足していることをお詫びします。新しい単語に対して同じ整数の成文化を取得するには、コードブックのTranslateメソッドを使用できます。

// Compute the result for a sunny, cool, humid and windy day:
double[] input = codebook.Translate("Sunny", "Cool", "High", "Strong").ToDouble(); 

int answer = target.Compute(input);

string result = codebook.Translate("PlayTennis", answer); // result should be "no"

ただし、codebook.Applyを呼び出して、同じ変換を新しいデータセットに適用することも可能である必要があります。これがバグだと思われる場合は、課題追跡システムにバグレポートを記入しますか?

于 2012-10-25T02:01:16.077 に答える