#data-science #weka #sampling
Вопрос:
У меня есть набор данных. Я хочу разделить набор данных, используя стратифицированную выборку. Я бы хотел, чтобы 70% данных было в обучающем наборе и 30% в тестовом наборе. Итак, я разделил набор данных на 10 равных подмножеств, используя StratifiedRemoveFold
фильтр в weka. Затем я добавляю 7 наборов данных, чтобы получить 70% обучающего набора данных, и добавляю остальные 3 набора данных, чтобы получить 30% обучающего набора данных. Однако это не очень хороший вариант. Я обнаружил, что для 1-го атрибута test test одно значение отсутствует. Например, мой 1-й атрибут имеет 7 значений. Но в тестовом наборе было только 6 значений для 1-го атрибута. В результате, когда я запускаю классификатор на обучающем наборе, произошла ошибка Training set and Test set are incompatible
.
Я прошел по ссылке Стратифицированная выборка в WEKA. Я обнаружил if I want to generate a 5% subsample, set the folds to 20.
, что если это стратегия, то для 30% тестового набора мне нужно установить numberofFold
of StratifiedRemoveFold
filter = 120? А также как насчет набора тестов? Что я должен установить в качестве numberoffoldsв наборе тестов, где набор тестов составляет 70% от всего набора данных?
Ответ №1:
Вы могли бы попробовать использовать контролируемую повторную выборку (weka.filters.supervised.instance.Вместо этого выполните повторную выборку) фильтруйте без замены и с коэффициентом смещения 0 (для использования распределения входных данных). При использовании флага инвертирования вы получаете оставшуюся часть набора данных.
Комментарии:
1. Да, я мог бы попробовать. Но это требование моего проекта для разделения набора данных с использованием метода стратифицированного фильтра. Как я мог бы разделить 70% на 30%, используя стратифицированную выборку?
Ответ №2:
Если вы действительно хотите использовать StratifiedRemoveFolds, тогда используйте 10 сгибов, примените фильтр 10 раз, чтобы получить все 10 сгибов, а затем объедините 7, чтобы получить 70%, а остальные — 30%.
Комментарии:
1. Эта процедура выдает ошибку, которую я описал выше.
2. StratifiedRemoveFolds не изменяет структуру набора данных, она работает только со строками. Пока вы сохраняете свои наборы данных как ARFF, все будет в порядке (я только что протестировал это с помощью набора данных anneal UCI).
3. Сколько подвыборок вы создали? Вы удалили недостающие значения из набора данных anneal? Я использую фильтр StratifiedRemoveFolds в наборе данных iris, который является набором данных weka по умолчанию. Разделите набор данных на 10. Я получил, что набор ошибок и набор тестов несовместимы. Хотите ли вы автоматически обернуть классификатор в «InputMappedclassifie», прежде чем продолжить, если я нажму Нет. Я получил 2-ю проблему с ошибкой, оценивающую классификатор. Обучающий и тестовый набор несовместимы. Индекс класса отличается на 5!= 83
4. Я вызывал фильтр StratifiedRemoveFolds 10 раз для 10 разных сгибов (каждый раз из исходного набора данных, каждый раз соответствующим образом обновляя параметр сгиба). Все они имели одинаковую структуру. У набора данных anneal есть метка «?» и нет пропущенных значений (у anneal.orig есть пропущенные значения — см. Загрузку Weka ). Должно быть, вы сделали что-то не так, чтобы получить набор данных, полученный из iris, с 83 атрибутами (неверными) и одним с 5 (правильными).
5. Да, извлечение каждого сгиба отдельно. отсюда 10 запусков (вроде очевидно). Самый простой — использовать текстовый редактор для объединения
@data
разделов файлов ARFF (это просто текстовые файлы). В противном случае используйтеweka.core.Instances append
(который вы уже знаете) или пользовательский код Java / Groovy / Jython.