Генетические алгоритмы: фитнес-функция не работает должным образом
У меня есть двоичный набор данных (m x n) m экземпляров и n функций с m >> n. И есть целевая переменная или атрибут класса, также двоичный. Я хочу сделать выбор функции с использованием генетического алгоритма. Я решил использовать 0/ 1 строки в GA, где 0, если функция не выбрана, и 1, если функция выбрана. Я генерировал случайные K наборов битовых строк. Таким образом, каждая K из этих битовых строк представляет возможный выбор признаков. Чтобы разработать фитнес-функцию, я тренирую нейронную сеть с каждым из этих K наборов функций (моделей), а затем на основе точности отдельного набора валидации я создал эту фитнес-функцию для каждой модели:-
fitness=tradeoffk*Valacc+(1-tradeoffk)*(ones(no_of_models,1)*n-featSel)/maxFeat;
Эта функция пригодности подобна компромиссу между количеством функций, переданных для обучения (featSel), и точностью проверки, сообщенной нейронной сетью. Я устанавливаю различные значения для tradeoffk, такие как 0,5, 0,2 и 0,8.
Я провел 10 итераций ГА. Каждая итерация была сделана для 20 генераций и пыталась проверить, как растет фитнес-функция. Тем не менее, нет никаких существенных изменений в фитнес-функции. В GA, как правило, ожидается, что фитнес-функция будет расти, а затем стабилизироваться, но здесь она будет расти очень незначительно.
Например, это пример вывода одной из следующих итераций:
gen=001 avgFitness=0.808 maxFitness=0.918
gen=002 avgFitness=0.808 maxFitness=0.918
gen=003 avgFitness=0.815 maxFitness=0.918
gen=004 avgFitness=0.815 maxFitness=0.918
gen=005 avgFitness=0.817 maxFitness=0.918
gen=006 avgFitness=0.818 maxFitness=0.918
gen=007 avgFitness=0.818 maxFitness=0.918
gen=008 avgFitness=0.819 maxFitness=0.918
gen=009 avgFitness=0.819 maxFitness=0.918
gen=010 avgFitness=0.819 maxFitness=0.918
gen=011 avgFitness=0.819 maxFitness=0.918
gen=012 avgFitness=0.819 maxFitness=0.918
gen=013 avgFitness=0.819 maxFitness=0.918
gen=014 avgFitness=0.819 maxFitness=0.918
gen=015 avgFitness=0.819 maxFitness=0.918
gen=016 avgFitness=0.819 maxFitness=0.918
gen=017 avgFitness=0.819 maxFitness=0.918
Кроме того, нейронной сети требуется много времени для обучения ( > 2 часа в течение 20 поколений). Может ли кто-нибудь дать дальнейшие предложения, и где это может пойти не так?!
1 ответ
Вы можете использовать линейно-дискриминантный анализ (LDA) для своей модели валидации вместо нейронной сети. Это гораздо быстрее обучать, но, конечно, не может представлять нелинейные отношения. Вы пробовали генетическое программирование? У него есть встроенный выбор объектов, поскольку он пытается построить модель и выбрать объекты одновременно. Вы можете попробовать HeuristicLab, который имеет довольно мощную реализацию генетического программирования, которая также включает в себя классификацию.