如何在WEKA中更改属性类型?

时间:2016-12-17 09:12:46

标签: csv machine-learning attributes weka

我是WEKA的新学员。我使用Car Evaluation数据集。首先,我在Excel中正确复制了所有属性,实例和值,并保存为csv文件。我在WEKA打开了那个csv文件。我可以看到所有课程,属性等等。但是,我看不到门和人的属性。我得到了"属性既不是数字也不是名义。"

这些属性可以获得诸如" 2"," 3"和"更多"。它们采用数值和名义值。在WEKA中,他们的类型是字符串。如何更改属性类型或应用哪种方法来查看其可视化和计数?

2 个答案:

答案 0 :(得分:0)

WEKA可以读取csv文件,但csv不提供有关属性类型的信息。这就是为什么WEKA鼓励您使用arff文件格式。 arff格式与csv相同,只是它有一个描述变量的标题(并允许注释和其他文档)。标题将包含

之类的内容
@attribute mpg numeric
@attribute cyl numeric
@attribute doors {2,3,more}

表示mpg和cyl将具有数值,而门将是可以采用三个值中的任何一个的因子" 2"," 3"或&#34 ;更&#34 ;.您需要确保为门等因素指定所有的可能值。如果你知道标题应该是什么样的,你可以简单地在文本编辑器中添加标题。您可以在This WEKA siteThis University of Waikato site获取有关arff格式的更多详细信息。

答案 1 :(得分:0)

也许您应该决定将属性设置为全数字,还是所有名义(也称为分类或所有字符串)。

所有数字属性的好处:算法可以确定该属性与任何其他属性之间的数学关系,包括目标(或期望的输出),例如相关性,依赖性/独立性,协方差。此外,如果使用基于树的算法,则节点可以定义决策规则,例如门> 3或人<2。

拥有所有名义属性的好处包括:算法可以更快地完成,因为可以使用分类值完成的事情数量有限。缺点:大多数算法不直接支持名义属性。基于树的算法在它们可以产生的决策节点类型方面受到限制,例如,门是“3”和“3”。或者人不是“更多”。

警告:如果您正在处理的属性是目标或期望的输出,那么将其全部 numeric 将使weka将其解释为回归问题,同时具有该功能属性名义将自动解释为分类问题。

如果您有兴趣将您的属性设置为全数字,则可以使用excel替换所有出现more,例如-1

如果稍后您需要从所有数字转到名义属性,您可以简单地use a filter do to that。或者,如果您使用的是Java API,则可以检查Walter's solution

import weka.core.Instances;
import weka.filters.Filter;
import weka.filters.unsupervised.attribute.NumericToNominal;

public class Main {
  public static void main(String[] args) throws Exception {     
    //load training instances 
    Instances originalTrain= //...load data with numeric attributes 
        NumericToNominal convert= new NumericToNominal();
    String[] options= new String[2];
    options[0]="-R";
    options[1]="1-2";  //range of variables to make numeric

    convert.setOptions(options);
    convert.setInputFormat(originalTrain);

    Instances newData=Filter.useFilter(originalTrain, convert);

    System.out.println("Before");
    for(int i=0; i&#60;2; i=i+1) {
      System.out.println("Nominal? "+originalTrain.attribute(i).isNominal());
    }

    System.out.println("After");
    for(int i=0; i&#60;2; i=i+1) {
      System.out.println("Nominal? "+newData.attribute(i).isNominal());
    }   
  }
}