weka 中的测试文件是不是需要与训练相同或更少的功能?

Posted

技术标签:

【中文标题】weka 中的测试文件是不是需要与训练相同或更少的功能?【英文标题】:Does test file in weka requires same or less number of features as train?weka 中的测试文件是否需要与训练相同或更少的功能? 【发布时间】:2012-06-12 09:43:04 【问题描述】:

我从两个不同的数据集中准备了两个不同的 .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));


【问题讨论】:

【参考方案1】:

如何将数据集划分为训练集和测试集?

您可以使用 RemovePercentage 过滤器(软件包 weka.filters.unsupervised.instance)。

在资源管理器中,只需执行以下操作:

训练集:

-加载完整的数据集

-在预处理面板中选择 RemovePercentage 过滤器

-为拆分设置正确的百分比

-应用过滤器

-将生成的数据保存为新文件

测试集:

-加载完整的数据集(或仅使用撤消来恢复对数据集的更改)

-如果尚未选择,则选择 RemovePercentage 过滤器

-将 invertSelection 属性设置为 true

-应用过滤器

-将生成的数据另存为新文件

【讨论】:

【参考方案2】:

根据 Weka 的wiki,训练集和测试集的特征数量需要相同。这些特征的类型(例如,名义、数字等)也需要相同。

另外,我假设您没有对任何一个数据集应用任何 Weka 过滤器。如果您在每个数据集上单独应用过滤器(即使它是相同的过滤器),数据集通常会变为 incompatible。

【讨论】:

【参考方案3】:

weka 中的测试文件是否需要与 train 相同或更少的特征?评估代码

需要相同数量的功能。您可能需要插入 ?也适用于类属性。

根据Weka Architect Mark Hall

为了兼容,两组实例的头部信息需要相同——相同 属性的数量,具有相同名称的相同顺序。此外,任何名义属性必须 在两组实例中以相同的顺序声明相同的值。 对于测试集中的未知类值,只需将每个值设置为缺失 - 即“?”。

【讨论】:

以上是关于weka 中的测试文件是不是需要与训练相同或更少的功能?的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 中的 while / foreach 内包装 3 个或更少的对象

Cassandra - 许多小的或更少的大节点?

Rails 可以期待每秒 100 个或更少的请求(对于非缓存页面)吗?

weka中用J48(即C4.5)算法对数据集进行训练建模与测试,结果不是很理想,

如何在 React Native 中将 TextInput 与数组中未知长度的项目集中在一起?数组中可能有更多或更少的项目来自数据库

包裹第 n 个或更少的元素,错误的结果