Наивный байесовский метод — нет образцов для метки класса 0

Недавно я задал вопрос о 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;
        }

person Jereme Guenther    schedule 25.10.2019    source источник


Ответы (1)


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

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

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

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

person Jereme Guenther    schedule 13.11.2019