Наивный Байес - нет образцов для класса label 0 - PullRequest
0 голосов
/ 25 октября 2019

Не так давно я задал вопрос о том, что наивный байесовский алгоритм Accord.net выдает ошибку. Оказалось, что это из-за того, что я использовал столбцы ввода дискретных значений, но не дал достаточно обучающих данных для всех значений, которые я перечислил для столбца.

Теперь я получаю точно такую ​​же ошибку, только на этот раззапускается только когда я использую значение Continuous для моего выходного столбца. В частности, выходной столбец целочисленного типа данных. Поскольку это целое число, класс Codification не переводит его, поэтому значения передаются непосредственно в алгоритм Наивного Байеса, и алгоритм, очевидно, не может это обработать.

Если я вручную изменю тип данных столбца на строкуи отправить его через класс Codification для кодификации, а затем отправить результаты этого через алгоритм, который он работает правильно.

Есть ли какая-либо конкретная причина, по которой этот алгоритм не может обрабатывать непрерывные типы данных в качестве выходных данных? Есть ли какие-то настройки, которые мне нужно включить, чтобы эта работа работала?

Пример кода:

        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;
        }

1 Ответ

0 голосов
/ 13 ноября 2019

У меня нет хорошего ответа на этот вопрос, однако, я полагаю, происходит то, что используемый мной алгоритм указан на сайте accord.net в качестве алгоритма классификации.

Основано на чтении здесь , я считаю, что алгоритмы классификации не способны обрабатывать непрерывные выходные значения.

Мне, вероятно, нужно перейти на использование алгоритма регрессии, чтобы получить эту конкретную функциональность.

* 1008В свете этого решение для этого алгоритма состоит в том, чтобы вручную кодифицировать выходной столбец или сначала преобразовать его в строку, чтобы библиотека кодификации выполнила эту работу за меня.
...