我试图弄清楚如何使用Accord.Net 框架使用机器学习 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);
请注意,我使用的是之前构建模型时使用的相同码本对象。我希望使用与原始模型相同的码本对数据进行编码,否则同一个单词可能会使用两个完全不同的值进行编码(原始模型中的单词“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)
我传入的对象都不是空的,所以这一定是代码中发生的更深层次的事情。但我不确定是什么。
谢谢你的帮助。如果有人知道一个实际是根据 Accord.Net 的贝叶斯示例进行预测的示例,如果您分享它,我将非常感激。