我正在尝试编写一个java程序,它在Weka中调用CfsSubsetEval类来执行特性子集选择。CfsSubsetEval对数据集进行离散化,我试图避免这种情况,因为数据集已经被离散化了。下面是执行离散化的CfsSubsetEval.java中的行。
m_isNumeric = m_trainInstances.attribute(m_classIndex).isNumeric();
if (!m_isNumeric)
{
m_disTransform = new Discretize();
m_disTransform.setUseBetterEncoding(true);
m_disTransform.setInputFormat(m_trainInstances);
m_trainInstances = Filter.useFilter(m_trainInstances, m_disTransform);
}由于class属性是在arff文件中定义的,如下所示:
@ATTRIBUTE class {true,false}该属性不是数字属性,因此将执行离散化。
虽然我对Weka实现有一点了解,但我试图注释掉这些行,以跳过离散化。但是,它不起作用,并报告了以下例外情况:
java.lang.ArrayIndexOutOfBoundsException: 1
at weka.attributeSelection.CfsSubsetEval.symmUncertCorr(CfsSubsetEval.java:515)
at weka.attributeSelection.CfsSubsetEval.correlate(CfsSubsetEval.java:445)
at weka.attributeSelection.CfsSubsetEval.evaluateSubset(CfsSubsetEval.java:392)
at weka.attributeSelection.BestFirst.search(BestFirst.java:806)
at weka.attributeSelection.AttributeSelection.SelectAttributes(AttributeSelection.java:606)
at selecting_features.runFeatureSelection.main(runFeatureSelection.java:39)问题是:如何更改CfsSubsetEval.java,使其不对数据集进行离散化?
我们对你的帮助深表感谢。
发布于 2014-11-05 08:30:19
对称不确定性是一种基于熵的度量,它适用于名义属性。weka.filters.supervised.attribute.Discretize不会改变任何名义属性。您说您的输入属性已经被离散化了--它们实际上是整数值属性,编码为Weka类型数字吗?如果是这样,那么您应该使用weka.filters.unsupervised.attribute.NumericToNominal.对数据进行预处理。这将为您提供一个名义属性,其中包含与数据中该属性的不同值相对应的标签列表。这样做后,CFS中的离散化过程将保持属性不变。
干杯马克。
https://stackoverflow.com/questions/26695120
复制相似问题