Использование объекта кодификации Accord.Net для кодификации второго набора данных

Я пытаюсь понять, как использовать Accord.Net Framework для создания байесовского прогноза с использованием класс машинного обучения NaiveBayes. Я воспользовался примером кода, приведенным в документации, и смог создать модель из примера.

Чего я не могу понять, так это того, как сделать прогноз на основе этой модели.

Платформа Accord.Net работает следующим образом: она переводит таблицу строк в числовое символическое представление этих строк с помощью класса с именем Кодификация. Вот как я создаю входные и выходные данные 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);

Обратите внимание, что я использую тот же объект кодовой книги, который я использовал ранее, когда строил модель. Я хочу, чтобы данные кодировались с использованием той же кодовой книги, что и исходная модель, иначе одно и то же слово может быть закодировано двумя совершенно разными значениями (слово «боб» в исходной модели может соответствовать числу 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) 

Все объекты, которые я передаю, не нулевые, поэтому это должно быть что-то более глубокое в коде. Но я не уверен, что.

Спасибо за любую помощь. И если кто-нибудь знает пример, в котором предсказание действительно делается на основе байесовского примера для Accord.Net, я был бы очень признателен, если бы вы им поделились.


person CleverPatrick    schedule 24.10.2012    source источник


Ответы (1)


Извините за отсутствие документации по финальной части. Чтобы получить ту же целочисленную кодировку для нового слова, вы можете использовать метод 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, чтобы применить то же преобразование к новому набору данных. Если вы считаете, что это ошибка, вы хотели бы заполнить отчет об ошибке в системе отслеживания проблем?

person Cesar    schedule 25.10.2012
comment
Спасибо за ответ, Цезарь. Я изменил приведенный выше код (намного проще, чем я пытался!), И все еще получаю ошибки. Я помещу полный код для воспроизведения в отчет об ошибке на кодовой странице Google. Я наверное просто что-то не так делаю. - person CleverPatrick; 25.10.2012
comment
Проблема № 16 опубликована в репозитории кода Google: code.google.com/ p/accord/issues/detail?id=16 - person CleverPatrick; 25.10.2012