c# - 使用 Accord.Net 的编码对象编码第二个数据集

标签 c# machine-learning bayesian accord.net

我正在尝试弄清楚如何使用 Accord.Net Framework使用机器学习 NaiveBayes 类进行贝叶斯预测。我关注了example code列在文档中,并且已经能够从示例中创建模型。

我想不通的是如何根据该模型进行预测。

Accord.Net 框架的工作方式是使用名为 Codification 的类将字符串表转换为这些字符串的数字符号表示。 .以下是我如何创建输入和输出数据表来训练模型(此代码的 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 的贝叶斯示例进行预测的示例,如果您分享它,我将不胜感激。

最佳答案

很抱歉缺少最后一部分的文档。为了获得新词的相同整数编码,您可以使用密码本的 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 将相同的转换应用于新数据集。如果您认为这是一个错误,是否愿意在问题跟踪器中填写错误报告?

关于c# - 使用 Accord.Net 的编码对象编码第二个数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13052167/

相关文章:

machine-learning - 创建自学习情感词典

r - 在 R 中输出多个绘图(用于动画)

python - PyMC3 和 Arviz : Visualizing highest posterior density for multiple conditions using arviz plot_hpd

r - 正态分布均值贝叶斯推理的玩具 R 代码 [降雪量数据]

c# - 显示Windows窗体时,控制台应用程序不接受输入

c# - 如何检查以 结尾的字符串是否有效?使用正则表达式

c# - 从 C# 程序进行打印的最佳方法是什么?

c# - 如何确定 WCF 3 和 ASP.NET 是否以编程方式注册到 IIS 7

machine-learning - 为什么不能从宏精度和召回率计算宏 F1 度量?

python - 使用 StandardScaler 使用特定功能缩放具有不同形状的数组