1

我有一个较大的数据集,我正在使用 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+过滤器%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 数据生成的 .arff 文件都将它们表示为 NOMINAL 类型。因此,标题中日期属性的标签列表非常非常长,并且从数据集到数据集永远不会相同。

我不是 java 或 python 程序员,但如果需要的话,我会去买一些书!提前致谢。

4

3 回答 3

1

看来你的计划也有更大的问题。如果您有第 1 天的数据并使用它来构建模型,那么您将它用于第 n 天的具有新的且从未见过的类标签的数据,因为没有训练数据,所以无法预测新标签为他们。同样,如果您有新属性,则无法将其用于分类,因为您的训练数据中没有一个将它们与类标签相关联。

因此,如果您想使用仅包含新数据属性/类的子集的数据训练模型,那么您不妨过滤新数据以删除新类/属性,因为即使您不会使用它们可以在两个不同的数据集上执行 weka 而不会出错。

如果它不在您的训练集中,请将其从测试集中排除。然后一切都应该工作。如果您需要能够对其进行测试/预测,那么您需要重新训练具有新类/属性示例的新模型。

在您的环境中执行此操作可能需要手动将数据库中的数据查询到 arff 文件中,以便仅查询训练集中的属性/类。研究 sql 和任何主要的脚本语言(例如 perl、python)来做到这一点,而不用大惊小怪。

于 2012-08-31T00:00:23.993 回答
1

我认为您可以使用增量分类器。但只有少数分类器可以支持此选项。与 SMO 一样,J48 分类器不支持这一点。因此,您将使用其他一些分类器进行分类。

要了解更多请访问

http://weka.wikispaces.com/Classifying+large+datasets

http://wiki.pentaho.com/display/DATAMINING/Handling+Large+Data+Sets+with+Weka

于 2012-08-30T09:23:31.833 回答
0

维护 Weka 的大学还创建了 MOA(大规模在线分析)来分析和解决您的问题。他们所有的分类器都是可更新的,您可以比较分类器在一段时间内的数据流性能。它还允许您检测模型的变化(概念漂移/偏移)并随着时间的推移优化(即限制)您的数据窗口(忘记旧的数据机制......)。

一旦你完成了 MOA 的测试和调整,你就可以使用 Weka 的 MOA 分类器(有一个扩展来启用它)并批处理你的所有过程。

于 2014-01-24T11:26:37.480 回答