weka - 标准化名义值

时间:2012-05-20 13:33:08

标签: machine-learning normalization weka svm

我有这个数据集:

Instance num 0 : 300,24,'Social worker','Computer sciences',Music,10,5,5,1,5,''
Instance num 1 : 1000,20,Student,'Computer engineering',Education,10,5,5,5,5,Sony
Instance num 2 : 450,28,'Computer support specialist',Business,Programming,10,4,1,0,4,Lenovo
Instance num 3 : 1000,20,Student,'Computer engineering','3d Design',1,1,2,1,3,Toshiba
Instance num 4 : 1000,20,Student,'Computer engineering',Programming,2,5,1,5,4,Dell
Instance num 5 : 800,16,Student,'Computer sciences',Education,8,4,3,4,4,Toshiba

我希望使用SMO和其他多类分类器进行分类,因此我使用以下代码将所有名义值转换为数字:

int [] indices={2,3,4,10};  // indices of nominal columns
for (int i = 0; i < indices.length; i++) {
  int attInd = indices[i];
  Attribute att = data.attribute(attInd);
  for (int n = 0; n < att.numValues(); n++) {

    data.renameAttributeValue(att, att.value(n), "" + n);
  }
}

结果是:

Instance num 0 : 300,24,0,0,0,10,5,5,1,5,0
Instance num 1 : 1000,20,1,1,1,10,5,5,5,5,1
Instance num 2 : 450,28,2,2,2,10,4,1,0,4,2
Instance num 3 : 1000,20,1,1,3,1,1,2,1,3,3
Instance num 4 : 1000,20,1,1,2,2,5,1,5,4,4
Instance num 5 : 800,16,1,0,1,8,4,3,4,4,3

应用“Normalize”过滤器后,结果如下:

Instance num 0 : 0,0.666667,0,0,0,1,1,1,0.2,1,0
Instance num 1 : 1,0.333333,1,1,1,1,1,1,1,1,1
Instance num 2 : 0.214286,1,2,2,2,1,0.75,0,0,0.5,2
Instance num 3 : 1,0.333333,1,1,3,0,0,0.25,0.2,0,3
Instance num 4 : 1,0.333333,1,1,2,0.111111,1,0,1,0.5,4
Instance num 5 : 0.714286,0,1,0,1,0.777778,0.75,0.5,0.8,0.5,3

问题是仍然在String中的转换列“Normalize”过滤器不会将它们标准化...

有什么想法吗?

和我的第二个问题:我应该在SMO旁边使用什么作为多类分类器?

2 个答案:

答案 0 :(得分:0)

不要 将名词/分类转换为浮点数(/整数),然后将它们标准化。这毫无意义。垃圾进垃圾出。将它们视为连续数字或数字向量会产生无意义的结果,例如“工程'的平均值+'护理'='建筑'”

处理名义/分类的正确方法是将每个变换为虚拟变量(也称为“虚拟编码”或“二分法”)。如果占用列(或主要,或选择,或其他)具有K级别,则创建K或(K-1)二进制变量,除了包含1的一个相应列之外,它们处于0。 查找Weka文档以找到正确的函数调用。

比照例如SO: Dummy Coding of Nominal Attributes (for Logistic Regression)

答案 1 :(得分:-1)

我相信使用过滤器weka.filters.unsupervised.attribute.StringToWordVector可以将字符串转换为数字的最佳方法。

执行此操作后,您可以应用“标准化”过滤器weka.classifiers.functions.LibSVM