Я использую 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}
Почему я потерял значение второго атрибута?
Благодарим вас за очень тщательный ответ. Это представление, как и другие вещи в weka, выглядит очень странно для меня, но я думаю, мне придется жить с ним. – KidCrippler
Добро пожаловать. Вы можете просто использовать «Instance» вместо «SparseInstance», и это должно дать вам нормальный выход. – Sentry
Не является «экземпляром» интерфейса и поэтому не может быть создан без конкретной реализации (например, SparseInstance или DenseInstance)? – KidCrippler