Я пытаюсь понять, как использовать 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, я был бы очень признателен, если бы вы им поделились.