Weka 过滤器导致数据丢失

Posted

技术标签:

【中文标题】Weka 过滤器导致数据丢失【英文标题】:Weka filters cause data loss 【发布时间】:2015-10-25 17:18:55 【问题描述】:

我正在使用 weka 构建随机森林模型。 我的数据存储在 mysql 数据库中。我找不到直接从数据库创建 weka 数据集(“实例”对象)的方法(至少不是一个简单的对象),所以我查询数据库并使用此代码将数据操作到 weka 数据集(实例) :

    List<MetadataRecord> metadata = acquireMetadata(); // Loading from DB

    int datasetSize = metadata.size();
    int numFeatures = MetadataRecord.FEATURE_NUM;  // Currently set to 14

    ArrayList<Attribute> atts = new ArrayList<Attribute>();
    List<Instance> instances = new ArrayList<Instance>();
    for (int feature = 0; feature < numFeatures; feature++) 
        Attribute current = new Attribute("Attribute" + feature, feature);
        if (feature == 0) 
            for (int obj = 0; obj < datasetSize; obj++) 
                instances.add(new SparseInstance(numFeatures));
            
        

        for (int obj = 0; obj < datasetSize; obj++) 
            MetadataRecord record = metadata.get(obj);
            Instance inst = instances.get(obj);
            switch (feature) 
            case 0:
                inst.setValue(current, record.labelId);
                break;
            case 1:
                inst.setValue(current, record.isSecured ? 2 : 1);
                break;
            case 2:
                inst.setValue(current, record.pageCount);
                break;
                // Spared cases 3-13...
            
        
        atts.add(current);
    

    Instances newDataset = new Instances("Metadata", atts, instances.size());

    for (Instance inst : instances) 
        newDataset.add(inst);
    
    newDataset.setClassIndex(0);

大部分数据以“数字”形式输入,而我需要一些特征(第一个和第二个)是分类的(或“名义”,根据 weka 术语)。 我尝试使用过滤器将它们转换为标称:

    NumericToNominal nomFilter = new NumericToNominal();
    nomFilter.setAttributeIndicesArray(new int[]  0, 1 );
    nomFilter.setInputFormat(newDataset);
    newDataset = Filter.useFilter(newDataset, nomFilter);

这很好用,但令人惊讶的是,在调试数据集时,部分数据丢失了!

在应用过滤器之前:

@attribute Attribute0 numeric
@attribute Attribute1 numeric
@attribute Attribute2 numeric
// Spared the other 10 Attributes
@data
0 1005,1 1,2 19,3 1123,4 7,5 25,6 0.66,7 49,8 2892.21,9 5.32,10 22.63,11 0.4,12 48.95,13 5.29

应用过滤器后:

@attribute Attribute0 0,2,3,4,5,6,7,9,11,12,18,22,23,24,25,35,36,39,40,45,51,56,60,67,68,69,78,79,83,84,85,88,94,98,126,127,128,1001,1003,1004,1005,1007,1008,1009,1012,1013,1017,1018,1019,1022
@attribute Attribute1 1,2
@attribute Attribute2 numeric
// Spared the other 10 Attributes
@data
0 1005,2 19,3 1123,4 7,5 25,6 0.66,7 49,8 2892.21,9 5.32,10 22.63,11 0.4,12 48.95,13 5.29

为什么我失去了第二个属性的值?

【问题讨论】:

【参考方案1】:

该功能不会丢失,只是没有明确包含在您的输出中,因为它是稀疏格式。看看ARFF:

稀疏 ARFF 文件与 ARFF 文件非常相似,但值为 0 的数据没有被明确表示

稀疏 ARFF 文件具有相同的标头(即 @relation 和 @attribute 标记),但数据部分不同。而不是按顺序表示每个值,如下所示:

@data
0, X, 0, Y, "class A"
0, 0, W, 0, "class B"

非零属性由属性编号明确标识,并声明其值,如下所示:

@data
1 X, 3 Y, 4 "class A"
2 W, 4 "class B"

每个实例都用大括号括起来,每个条目的格式为:其中index为属性索引(从0开始)。

请注意,稀疏实例中的省略值为 0,它们不是“缺失”值!如果值未知,则必须用问号 (?) 明确表示它。

尤其是最后一句话很重要。您的Attribute1 有两个可能的值,1 和 2。由于它现在是标称值,因此值 1 的索引为 0。索引为 0 的值被省略。

再说一遍:这只是内存中的表示,当您将其打印到文件或屏幕时。您的数据集的实际内容没有改变。

【讨论】:

感谢您非常彻底的回答。这种表示,就像 weka 中的其他东西一样,对我来说看起来很奇怪,但我想我必须忍受它。 不客气。您可以只使用“Instance”而不是“SparseInstance”,但它应该会为您提供正常的输出。 “Instance”不是一个接口,因此如果没有具体的实现(例如 SparseInstance 或 DenseInstance)就无法实例化? 取决于您的 Weka 版本。在稳定分支(3.6.x)中,它是一个类。

以上是关于Weka 过滤器导致数据丢失的主要内容,如果未能解决你的问题,请参考以下文章

Redis数据丢失问题

服务器,read,重构,会不会导致数据丢失

POST提交大量数据,导致后面数据丢失

服务器断电导致虚拟机数据丢失怎么恢复?

虚拟化还原快照导致数据丢失恢复过程

腾讯云硬盘故障,导致用户「数据完全丢失」