Требуется ли для тестового файла в weka такое же или меньшее количество функций, что и для train?

Я подготовил два разных файла .arff из двух разных наборов данных: один для тестирования, другой для обучения. Каждый из них имеет одинаковые экземпляры, но разные объекты, изменяющие размерность вектора объектов для каждого файла. Когда я сделал перекрестную проверку каждого из этих файлов, они работают отлично. Это показывает, что .arff файлы правильно подготовлены и не имеют ошибок.

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

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5986
at  weka.classifiers.bayes.NaiveBayesMultinomial.probOfDocGivenClass(NaiveBayesMultinomial.java:295)
at weka.classifiers.bayes.NaiveBayesMultinomial.distributionForInstance(NaiveBayesMultinomial.java:254)
at weka.classifiers.Evaluation.evaluationForSingleInstance(Evaluation.java:1657)
at weka.classifiers.Evaluation.evaluateModelOnceAndRecordPrediction(Evaluation.java:1694)
at weka.classifiers.Evaluation.evaluateModel(Evaluation.java:1574)
at TrainCrossValidateARFF.main(TrainCrossValidateARFF.java:44)

Требуется ли для тестового файла в weka такое же или меньшее количество функций, что и для train? Код для оценки

public class TrainCrossValidateARFF{
    private static DecimalFormat df = new DecimalFormat("#.##");
    public static void main(String args[]) throws Exception
    {
            if (args.length != 1 && args.length != 2) {
                    System.out.println("USAGE: CrossValidateARFF <arff_file> [<stop_words_file>]");
                    System.exit(-1);
            }
            String TrainarffFilePath = args[0];
            DataSource ds = new DataSource(TrainarffFilePath);
            Instances Train = ds.getDataSet();
            Train.setClassIndex(Train.numAttributes() - 1);

            String TestarffFilePath = args[1];
            DataSource ds1 = new DataSource(TestarffFilePath);
            Instances Test  = ds1.getDataSet();
            // setting class attribute
            Test.setClassIndex(Test.numAttributes() - 1);

            System.out.println("-----------"+TrainarffFilePath+"--------------");
            System.out.println("-----------"+TestarffFilePath+"--------------");
            NaiveBayesMultinomial naiveBayes = new NaiveBayesMultinomial();
            naiveBayes.buildClassifier(Train);

            Evaluation eval = new Evaluation(Train);
            eval.evaluateModel(naiveBayes,Test);
            System.out.println(eval.toSummaryString("\nResults\n======\n", false));
}
}

Ответы на вопрос(3)

В соответствии с Wekaвикиколичество функций должно быть одинаковым как для учебных, так и для тестовых наборов. Также тип этих функций (например, номинальный, числовой и т. Д.) Должен быть одинаковым.

Кроме того, я предполагаю, что вы не применяли какие-либо фильтры Weka ни к одному из своих наборов данных. Наборы данных часто становятсянесовместимый если вы применяете фильтры отдельно для каждого набора данных (даже если это один и тот же фильтр).

Как разделить набор данных на тренировочный и тестовый набор?

Вы можете использовать фильтр RemovePercentage (пакет weka.filters.unsupervised.instance).

В проводнике просто сделайте следующее:

Обучающий набор:

-Загрузить полный набор данных

-выберите фильтр RemovePercentage в панели предварительной обработки

установить правильный процент для разделения

-применить фильтр

-сохранить сгенерированные данные как новый файл

тестовый набор:

-Загрузить полный набор данных (или просто использовать отменить, чтобы отменить изменения в наборе данных)

-выберите фильтр RemovePercentage, если еще не выбран

установите для свойства invertSelection значение true

-применить фильтр

-сохранить сгенерированные данные как новый файл

Does test file in weka requires same or less number of features as train ? Code for evaluation

Такое же количество функций необходимо. Возможно, вам нужно вставить? для атрибута класса тоже.

В соответствии сWeka Архитектор Марк Холл

To be compatible, the header information of the two sets of instances needs to be the same - same number of attributes, with the same names in the same order. Furthermore, any nominal attributes must have the same values declared in the same order in both sets of instances. For unknown class values in your test set just set the value of each to missing - i.e "?".

Ваш ответ на вопрос