weka - 标准化标称值
Posted
技术标签:
【中文标题】weka - 标准化标称值【英文标题】:weka - normalize nominal values 【发布时间】:2012-05-27 06:44:54 【问题描述】:我有这个数据集:
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
应用“标准化”过滤器后,结果将如下所示:
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
问题是仍在字符串“Normalize”过滤器中转换的列不会对其进行规范化...
有什么想法吗?
还有我的第二个问题:除了 SMO,我应该使用什么作为多类分类器?
【问题讨论】:
想要的结果是什么?你想对字符串发生什么?至于替代的多类分类器,knn 或 J48 决策树将是一个很好的基准。 期望的结果是笔记本电脑的品牌(数据集中的最后一列),但是 SMO 评估的结果有问题,正确分类的实例 30.6452 % ,我尝试了几个分类器和正确分类的比例仍然低于 35% 我该怎么办? 您有多少个实例?获取更多数据可以改善结果。你有多少类/品牌?如果你有 200 节课,35% 一点也不差。 我有 200 个实例和 12 个类我需要多少实例? 很难说,取决于数据集的“难度”。但是每个类大约有 16 个实例,每个实例有 10 个属性。这显然不足以覆盖整个实例空间。您还应该问自己目标是什么,什么是合理的结果。常识表明,职业、年龄和预算等因素不足以可靠地确定某人的品牌偏好,但如果您达到 40-50%,那将是一个非常有根据的猜测。可能比人类专家在这项任务上的成就要好。 【参考方案1】:不要将名词/分类转换为浮点数(/整数),然后对其进行规范化。这是没有意义的。垃圾进垃圾出。将它们视为连续数字或数值向量会给出无意义的结果,例如 “'Engineering' + 'Nursing' = 'Architecture' 的平均值”
处理名词/分类的正确方法是将每个变量转换为虚拟变量(也称为“虚拟编码”或“二分法”)。假设如果 Occupation 列(或 Major、Elective 或其他)具有 K 个级别,那么您将创建 K 或 (K-1) 个二进制变量,除了一个包含 1 的对应列之外,它们处处为 0。 查阅 Weka 文档以找到正确的函数调用。
参见。例如SO: Dummy Coding of Nominal Attributes (for Logistic Regression)
【讨论】:
【参考方案2】:我相信将字符串转换为数字的最佳方法是使用过滤器weka.filters.unsupervised.attribute.StringToWordVector
。
完成后,您可以应用“标准化”过滤器weka.classifiers.functions.LibSVM
。
【讨论】:
以上是关于weka - 标准化标称值的主要内容,如果未能解决你的问题,请参考以下文章
Weka 3.7.11 中的随机树对数值属性使用啥分割标准?