【问题标题】:weka inputmappedclassifier mappedinstance Value not defined for given nominal attributeweka inputmappedclassifier mappedinstance 未为给定的名义属性定义值
【发布时间】:2016-05-01 23:32:18
【问题描述】:

我在 weka 中使用 InputMappedClassifer 将所有缺失的属性值替换为缺失值(“?”),但由于某种原因,我仍然得到未为给定名义属性异常定义的值,我的代码如下:

Instance mappedInstance = inputMappedClassifier.constructMappedInstance(testData.instance(index));

clsLabel = inputMappedClassifier.classifyInstance(mappedInstance);
mappedInstance.setClassValue(clsLabel);

String key = mappedInstance.stringValue(mappedInstance.numAttributes() - 1);

注意加载输入映射分类器的方法是这样的:

public static InputMappedClassifier loadInputMappedClassifier(SerializedClassifier serializedClassifier, String modelName) throws Exception {
    InputMappedClassifier inputMappedClassifier = new InputMappedClassifier();
    inputMappedClassifier.setClassifier(serializedClassifier);
    try {
        inputMappedClassifier.setModelPath("src/main/resources/" + modelName + ".model");
    } catch (Exception e) {
        e.printStackTrace();
    }
    inputMappedClassifier.setModelHeader((Instances) SerializationHelper.readAll("src/main/resources/" + modelName + ".model")[1]);
    inputMappedClassifier.setDebug(true);
    return inputMappedClassifier;
}

例外情况如下:

java.lang.IllegalArgumentException: Value not defined for given nominal attribute!
    at weka.core.AbstractInstance.setValue(AbstractInstance.java:507)
    at classifiers.Verbs.loadTestInstance(Verbs.java:122)
    at realizer.TestRealizer.main(TestRealizer.java:119)

我使用 java 代码创建了一个测试实例,我想使用 inputmappedclassifier 对其进行分类,但测试实例可能包含训练数据集的标称属性值中不存在的实例值,因此它会引发该异常。如果我把这一切都做对了。

例如名义属性。

@attribute LemmaLast {a,o,n,e,l,y,d,s,r,t,z,u,c,b,f,p,m,é,ú,i,k,j,x,v,g,á,ó,w,.,í,h,7,q,4,+,3,0,5,9,6,2,1,!,à,ç,8}

表示引理中的最后一个字符。 测试实例的最后一个字符可以是“|”标称值属性中没有显示,因此 inputmappedclassifier 应该自动填充该值? (缺失值)

【问题讨论】:

    标签: java classification weka test-data


    【解决方案1】:

    如果你想替换所有缺失的属性值,那么你应该使用Remove Missing Values Fiter

       public Instances removeMissingValues(Instances data) throws Exception {        
                ReplaceMissingValues replaceMissingValues = new ReplaceMissingValues();
                replaceMissingValues.setInputFormat(data);
                return Filter.useFilter(data, replaceMissingValues);
        }
    

    但是如果你需要改变一些值的名字,你可以使用Rename Nominal Values Filter

    我认为您没有正确指出您的问题。请在此处添加您的异常日志和数据的示例部分。

    --编辑

    您可能会在名义属性没有此值的情况下放置一个具有该值的新实例。 在 weka 中创建名义实例时,您必须指定名义值。 例如:(红、蓝、白) 但是当您尝试使用 value=black 对实例进行分类时,就会引发此异常。

    【讨论】:

    • 当名义属性没有您尝试在实例中传递的定义值时,会发生此异常。
    • 是的,我想做的是设置我想传递给缺失的这个值(?),因为它没有定义,但 inputmappedclassifer 应该这样做
    • 显示数据示例。所以在这个名义属性中定义'? loadInputMappedClassifier 中的值
    • 我编辑了问题以显示一个示例案例。感谢您的帮助和支持,我很感激。
    猜你喜欢
    • 2014-09-18
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    • 2012-09-16
    • 2023-02-01
    相关资源
    最近更新 更多