学习使用weka进行分类遭遇报错 ‘Train and test set are not compatible’

最近


需要使用weka这种ML工具预跑UK2007数据集查看粗略结果。
为了举办Web Spam Challenge 2008大赛,UK2007官方主页分别提供了SET1和SET2两个类标集用于训练和测试,因为是志愿者交叉标注的,所以类标含spam, nonspam和undecided三种。
针对不需要亲自提取特征和数据预处理的小伙伴,官方页面最下方提供了基于content、link等几种预处理后的数据文件,有csv和weka中适用的arff格式。

  • csv中样本很多但是没有label
  • arff是部分样本也赋好了label的文件,但是label只有spam和nonspam

因为我想测试三种类标都加入进去的分类效果,所以只有自行使用类标集和预处理后的特征csv文件,再根据每条数据唯一的id合并产生trainset.csv和testset.csv两个数据集。

然后


  1. 打开weka,在主界面 Preprocess Tab 选择 open file 读取训练集文件 trainset.csv
  2. 切换至 Classfify Tab 点击 choose 选择合适的分类算法
  3. test options 框中选择 Supplied test set(使用测试集) 项并设置读取测试集文件 testset.csv
  4. 下拉菜单 选取类标所在属性列名 class 并点击 start 开始分类

然后就愉快地得到了 Train and test set are not compatible 的错误提示。
明明两个文件都是从特征csv中,分别加入一列class类标来的,按理说trainset和testset是一致的格式信息才对。

error info

test options 的其余三种选择经测试和预想的一样是可以用的,因为十倍交叉和比例划分本质都是使用trainset自身的数据。

最后


搜索到了weka官方wiki对于这个问题的解释,结果漏看了别人要求 Nominal Attributes(标称属性) 必须完全一致包括取值和顺序。

In case of nominal attributes, you must ensure that the number of labels and the order of the labels are the same.

其间又做了不少无用功,终于在回头查看的时候发现了问题。于是改造原本的数据集最终跑出了结果。

  1. 打开weka,在主界面 Preprocess Tab 选择 open file 读取数据集文件 trainset.csv
  2. Attributes 框中选取与分类不相关的Nominal Attributes,如 域名ID。点击 Remove 预处理清除掉这些特征。
  3. 点击 save 保存处理后的数据为weka的arff格式
  4. 重复上面三个步骤处理testset.csv并保存
  5. 打开新的trainset.arff和testset.arff,查看class列定义取值顺序是否一致,若不一致(如图)则修改为一致。
  6. 重复上一节2~4步骤可以成功运行并取得结果