1

Я использую weka для создания случайной модели леса. Мои данные хранятся в базе данных MySQL. Я не мог найти способ создать набор данных weka (объект «Экземпляры») непосредственно из БД (по крайней мере, не простой), поэтому я запрашиваю БД и манипулирую данными в набор данных 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); 

Большая часть данных вводится как «числовой», в то время как мне нужно некоторые из функций (первый и второй), чтобы быть категоричными (или «номинальная», по терминологии ВЕКА). Я попытался преобразовать их номинальными с использованием фильтров:

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 опущены.

Опять же: это просто представление в памяти и когда вы печатаете его в файл или на экран. Фактическое содержимое вашего набора данных не изменилось.

+0

Благодарим вас за очень тщательный ответ. Это представление, как и другие вещи в weka, выглядит очень странно для меня, но я думаю, мне придется жить с ним. – KidCrippler

+1

Добро пожаловать. Вы можете просто использовать «Instance» вместо «SparseInstance», и это должно дать вам нормальный выход. – Sentry

+0

Не является «экземпляром» интерфейса и поэтому не может быть создан без конкретной реализации (например, SparseInstance или DenseInstance)? – KidCrippler

 Смежные вопросы

  • Нет связанных вопросов^_^