Недавно я задал вопрос о Accord.net Алгоритм наивного Байеса выдает ошибку. Оказалось, что это произошло из-за того, что я использовал столбцы ввода дискретных значений, но не предоставил достаточно обучающих данных для всех значений, которые я указал для столбца.
Теперь я получаю точно такую же ошибку, только на этот раз она срабатывает только тогда, когда я использую непрерывное значение для своего выходного столбца. В частности, выходной столбец целочисленного типа данных. Поскольку это целое число, класс кодификации не переводит его, поэтому значения передаются непосредственно в алгоритм наивного Байеса, а алгоритм, по-видимому, не может с этим справиться.
Если я вручную изменю тип данных столбца на строку и отправлю его через класс кодификации для кодификации, а затем отправлю результаты этого через алгоритм, он работает правильно.
Есть ли какая-то конкретная причина, по которой этот алгоритм не может обрабатывать непрерывные типы данных в качестве выходных данных? Есть ли какой-то параметр, который мне нужно включить, чтобы это работало?
Некоторый пример кода:
DataTable symbols = TrainingCodebook.Apply(DataTraining, AllAttributeNames);
double[][] inputs = symbols.ToJagged<double>(KeptAttributeNames.ToArray());
// *** The line that is breaking ***
int[] outputs = symbols.ToArray<int>(outputCol);
// *** The replacement test code that does work ***
// DataStringTraining is the same as DataTraining, but all values are strings
//Codification codeee = new Codification(DataStringTraining, outputCol);
//var sym = codeee.Apply(DataStringTraining, outputCol);
//int[] outputs = sym.ToArray<int>(outputCol);
/*
* Create a new instance of the learning algorithm
* and build the algorithm
*/
var learner = new NaiveBayesLearning<IUnivariateFittableDistribution>()
{
// Tell the learner how to initialize the distributions
Distribution = (classIndex, variableIndex) => attributList[variableIndex],
};
NaiveBayes<IUnivariateFittableDistribution> alg = null;
try
{
ProgPerformStep("Computing and training algorithm");
alg = learner.Learn(inputs, outputs);
}
catch (Exception ex)
{
ProgPerformStep($"ERROR: Naive Bayes: {ex.Message}", ex);
return;
}