我有一个较大的数据集,我正在使用Weka进行探索。它是这样的:今天我将尽可能多地分析数据,并创建一个训练有素的分类器。我将此模型保存为文件。然后明天我将获得一批新数据,并希望使用保存的模型来预测新数据的类。这每天都在重复。最终我将更新保存的模型,但现在假设它是静态的。
由于此任务的大小和频率,我想自动运行,这意味着命令行或类似。但是,我的问题也存在于资源管理器中。
我的问题与以下事实有关:随着我的数据集的增长,属性的可能标签列表也会增长。 Weka说这样的属性列表不能改变,或者训练集和测试集被认为是不兼容的(参见:http://weka.wikispaces.com/Why+do+I+get+the+error+message+%27training+and+test+set+are+not+compatible%27%3F)。但在我的世界中,我今天无法知道下周我将偶然发现的所有属性标签。
为了纠正这种情况,建议我运行批量过滤(http://weka.wikispaces.com/How+do+I+generate+compatible+train+and+test+sets+that+get+processed+with+a+filter%3F)。好吧,这似乎意味着我需要每天使用重新过滤的训练数据重建我的模型。
此时整个事情看起来很难,我担心我会犯一个可怕的,简单的新手错误,所以我求助。
详情:
该模型由
创建java -Xmx1280M weka.classifiers.meta.FilteredClassifier ^
-t .\training.arff -d .\my.model -c 15 ^
-F "weka.filters.supervised.attribute.Discretize -R first-last" ^
-W weka.classifiers.trees.J48 -- -C 0.25 -M 2
天真地预测我会尝试:
java -Xmx1280M weka.core.converters.DatabaseLoader ^
-url jdbc:odbc:(database) ^
-user (user) ^
-password (password) ^
-Q "exec (my_stored_procedure) '1/1/2012', '1/2/2012' " ^
\> .\NextDay.arff
然后:
java -Xmx1280M weka.classifiers.trees.J48 ^
-T .\NextDay.arff ^
-l .\my.model ^
-c 15 ^
-p 0 ^
\> .\MyPredictions.txt
这会产生:
java.lang.Exception: training and test set are not compatible
at weka.classifiers.Evaluation.evaluateModel(Evaluation.java:1035)
at weka.classifiers.Classifier.runClassifier(Classifier.java:312)
at weka.classifiers.trees.J48.main(J48.java:948)
相关问题请访问kdkeys.net/training-and-test-set-are-not-compatible-weka /
相关问题是数据库提取的命令行版本需要生成临时.arff文件,并且看起来JDBC生成的arff文件无法正确处理“日期”数据。我的数据库生成ISO-8601格式“yyyy-MM-dd'T'HH:mm:ss”的日期,但是JDBC数据库和JDBC数据生成的.arff文件都将这些文件表示为NOMINAL类型。因此,标题中日期属性的标签列表非常非常长,从数据集到数据集从不相同。
我不是java或python程序员,但如果这就是它需要的东西,我会去买一些书!提前谢谢。
答案 0 :(得分:1)
我认为您可以使用增量分类器。但只有少数分类器可以支持此选项。像SMO一样,J48分类器不支持这一点。因此,您将使用其他分类器进行分类。
了解更多信息
http://weka.wikispaces.com/Classifying+large+datasets
http://wiki.pentaho.com/display/DATAMINING/Handling+Large+Data+Sets+with+Weka
答案 1 :(得分:1)
似乎你的计划也存在更大的问题。如果您拥有第1天的数据并且使用它来构建模型,那么您将使用它来自第n天的数据,这些数据具有新的且从未见过的类标签,因为没有训练数据,所以无法预测新标签对他们来说同样,如果您有新属性,则无法使用这些属性进行分类,因为您的训练数据都不会将它们与类标签相关联。
因此,如果您想使用仅对新数据属性/类的子集进行数据训练的模型,那么您也可以过滤新数据以删除新类/属性,因为它们不会被使用即使你可以在两个不同的数据集上执行weka而没有错误。
如果它不在您的训练集中,请将其从测试集中排除。一切都应该有效。如果您需要能够对其进行测试/预测,那么您需要重新训练具有新类/属性示例的新模型。
在您的环境中执行此操作可能需要手动将数据库中的数据查询到arff文件中,以便仅查询训练集中的属性/类。查看sql和任何主要的脚本语言(例如perl,python)来做到这一点,不用大惊小怪。
答案 2 :(得分:0)
维护Weka的大学还创建了MOA(大规模在线分析)来分析和解决您的问题。它们的所有分类器都是可更新的,您可以比较数据流的分类器性能。它还允许您检测模型的变化(概念漂移/移位)并优化(即限制)您的数据窗口(忘记旧数据机制......)。
完成MOA测试和调优后,您可以使用Weka的MOA分类器(有一个扩展来启用它)并批量处理所有过程。