【问题标题】:Training and Test Set in Weka InCompatible in Text ClassificationWeka 中的训练和测试集在文本分类中不兼容
【发布时间】:2018-08-19 19:19:34
【问题描述】:
我有两个关于一个句子是否包含药物不良事件提及的数据集,训练集和测试集都只有两个字段文本和标签{Adverse Event, No Adverse Event} 我用过weka stringtoWordVector 过滤器在训练集上使用随机森林构建模型。
我想测试通过从测试数据集中删除类标签构建的模型,在其上应用 StringToWordVector 过滤器并使用它测试模型。当我尝试这样做时,它给了我一个错误,说训练和测试集不兼容可能是因为过滤器为测试数据集识别了一组不同的属性。我该如何解决这个问题并输出测试集的预测。
【问题讨论】:
标签:
weka
random-forest
text-classification
【解决方案1】:
对一次性测试执行此操作的最简单方法不是预先过滤训练集,而是使用 Weka 的 FilteredClassifier 并使用 StringToWordVector 过滤器对其进行配置,并使用您选择的分类器进行分类。使用 Weka 进行更多数据挖掘在线课程的 this video 对此进行了很好的解释。
对于更通用的解决方案,如果您想构建一次模型,然后在将来在不同的测试集上对其进行评估,您需要使用InputMappedClassifier:
处理不兼容的训练和测试数据的包装分类器
通过在分类器拥有的训练数据之间建立映射
使用和传入的测试实例的结构构建。模型
在传入实例中找不到的属性接收
缺失值,传入的名义属性值也是如此
分类器以前没见过。可以训练一个新的分类器或
从文件中加载的现有文件。
【解决方案2】:
Weka 即使是测试数据也需要一个标签。它使用测试数据的标签或“基本事实”来比较模型的结果并测量模型的性能。如果您不知道模型的预测是对还是错,您将如何判断模型是否表现良好。因此,测试数据需要与 WEKA 中的训练数据具有完全相同的结构,包括标签。不用担心,标签不会用于帮助模型进行预测。
最好的方法是选择交叉验证(例如 10 折交叉验证),它会自动将您的数据分成 10 个部分,其中 9 个用于训练,其余 1 个用于测试。该过程重复 10 次,因此 10 个零件中的每一个都曾用作测试数据。最终性能判定将是所有 10 轮的平均值。交叉验证可以让您对新的、看不见的数据的模型性能进行非常现实的估计。
您尝试做的事情,即使用完全相同的数据进行训练和测试是一个坏主意,因为您最终得到的测量性能过于乐观。这意味着,您将在测试期间获得非常令人印象深刻的数据,例如 98% 的准确度 - 但一旦您使用该模型处理新的不可见数据,您的准确度可能会下降到更差的水平。