Генетические алгоритмы: функция пригодности для алгоритма выбора признаков
У меня есть набор данных n x m, где есть N наблюдений, и каждое наблюдение состоит из M значений для M атрибутов. Каждое наблюдение также имеет свой результат. м большой, слишком большой для моей задачи. Я пытаюсь найти лучшее и наименьшее подмножество атрибутов m, которое все еще представляет весь набор данных достаточно хорошо, чтобы я мог использовать только эти атрибуты для обучения нейронной сети.
Я хочу использовать генетический алгоритм для этого. Проблема в функции приспособленности. Он должен сказать, насколько хорошо сгенерированная модель (подмножество атрибутов) все еще отражает исходные данные. И я не знаю, как оценить определенное подмножество атрибутов по всему набору. Конечно, я мог бы использовать нейронную сеть (которая позже все равно будет использовать эти выбранные данные) для проверки того, насколько хорошо подмножество - чем меньше ошибка, тем лучше подмножество. Но в моем случае это занимает много времени, и я не хочу использовать это решение. Я ищу какой-то другой способ, который был бы предпочтительнее работать только на наборе данных.
о чем я думал: имея подмножество S (найденное генетическим алгоритмом), обрезать набор данных, чтобы он содержал значения только для подмножества S и проверить, сколько наблюдений в этом Ser данных больше не различимы (имеют одинаковые значения для тех же атрибутов), имея разные значения результата. Чем больше число, тем хуже подмножество. Но мне это кажется слишком изнурительным с точки зрения вычислений.
есть ли другие способы оцените, насколько хорошо подмножество атрибутов все еще представляет весь набор данных?
1 ответов
этой функция должны делать то, что вы хотите: суммировать факторные нагрузки, соответствующие характеристикам, содержащим каждое подмножество.
чем выше эта сумма, тем больше доля изменчивости в переменной ответа, которая объясняется только этими функциями. Если я понимаю OP, эта функция стоимости является верным переводом "представляет весь набор довольно хорошо"из OP.
сокращение до кода просто:
вычислить матрица ковариации вашего набора данных (сначала удалите столбец, содержащий переменную response, т. е., вероятно, последнюю один.) Если ваш набор данных m x n (столбцы x строк), затем это ковариационная матрица будет n x n, С "1"по главной диагонали.
далее выполнить разложение собственных значений на этой ковариации матрица; это даст вам доля общей изменчивости в переменной ответа, внесенной этим собственным значением (каждое собственное значение соответствует объекту или столбцу). [Примечание., для этого шага часто используется разложение сингулярных значений (SVD), но это не нужно-разложение на собственные значения намного проще, и всегда делает работу, пока ваша матрица квадратная, что ковариационные матрицы всегда].
ваш генетический алгоритм, на каждой итерации, возвращать набор из решения-кандидаты (в вашем случае подмножества функций). Следующее задание в GA или любой комбинаторной оптимизации необходимо ранжировать эти candiate решения по их стоимости оценка функции. В вашем случае, стоимость функция представляет собой простое суммирование пропорции собственных значений для каждого функция в этом подмножестве. (Я думаю, вы хотели бы масштабировать / нормализовать это вычисление, чтобы более высокие числа были наименее подходящими хотя.)
пример расчета (с использованием python + NumPy):
>>> # there are many ways to do an eigenvalue decomp, this is just one way
>>> import numpy as NP
>>> import numpy.linalg as LA
>>> # calculate covariance matrix of the data set (leaving out response variable column)
>>> C = NP.corrcoef(d3, rowvar=0)
>>> C.shape
(4, 4)
>>> C
array([[ 1. , -0.11, 0.87, 0.82],
[-0.11, 1. , -0.42, -0.36],
[ 0.87, -0.42, 1. , 0.96],
[ 0.82, -0.36, 0.96, 1. ]])
>>> # now calculate eigenvalues & eivenvectors of the covariance matrix:
>>> eva, evc = LA.eig(C)
>>> # now just get value proprtions of each eigenvalue:
>>> # first, sort the eigenvalues, highest to lowest:
>>> eva1 = NP.sort(eva)[::-1]
>>> # get value proportion of each eigenvalue:
>>> eva2 = NP.cumsum(eva1/NP.sum(eva1)) # "cumsum" is just cumulative sum
>>> title1 = "ev value proportion"
>>> print( "{0}".format("-"*len(title1)) )
-------------------
>>> for row in q :
print("{0:1d} {1:3f} {2:3f}".format(int(row[0]), row[1], row[2]))
ev value proportion
1 2.91 0.727
2 0.92 0.953
3 0.14 0.995
4 0.02 1.000
это третья колонка значений чуть выше (по одному для каждой функции), которые суммируются (выборочно, в зависимости от того, какие функции присутствуют в данном подмножестве, которое вы оцениваете с помощью функции затрат).