Генетические алгоритмы: функция пригодности для алгоритма выбора признаков

У меня есть набор данных n x m, где есть N наблюдений, и каждое наблюдение состоит из M значений для M атрибутов. Каждое наблюдение также имеет свой результат. м большой, слишком большой для моей задачи. Я пытаюсь найти лучшее и наименьшее подмножество атрибутов m, которое все еще представляет весь набор данных достаточно хорошо, чтобы я мог использовать только эти атрибуты для обучения нейронной сети.

Я хочу использовать генетический алгоритм для этого. Проблема в функции приспособленности. Он должен сказать, насколько хорошо сгенерированная модель (подмножество атрибутов) все еще отражает исходные данные. И я не знаю, как оценить определенное подмножество атрибутов по всему набору. Конечно, я мог бы использовать нейронную сеть (которая позже все равно будет использовать эти выбранные данные) для проверки того, насколько хорошо подмножество - чем меньше ошибка, тем лучше подмножество. Но в моем случае это занимает много времени, и я не хочу использовать это решение. Я ищу какой-то другой способ, который был бы предпочтительнее работать только на наборе данных.

о чем я думал: имея подмножество S (найденное генетическим алгоритмом), обрезать набор данных, чтобы он содержал значения только для подмножества S и проверить, сколько наблюдений в этом Ser данных больше не различимы (имеют одинаковые значения для тех же атрибутов), имея разные значения результата. Чем больше число, тем хуже подмножество. Но мне это кажется слишком изнурительным с точки зрения вычислений.

есть ли другие способы оцените, насколько хорошо подмножество атрибутов все еще представляет весь набор данных?

1 ответов


этой функция должны делать то, что вы хотите: суммировать факторные нагрузки, соответствующие характеристикам, содержащим каждое подмножество.

чем выше эта сумма, тем больше доля изменчивости в переменной ответа, которая объясняется только этими функциями. Если я понимаю OP, эта функция стоимости является верным переводом "представляет весь набор довольно хорошо"из OP.

сокращение до кода просто:

  1. вычислить матрица ковариации вашего набора данных (сначала удалите столбец, содержащий переменную response, т. е., вероятно, последнюю один.) Если ваш набор данных m x n (столбцы x строк), затем это ковариационная матрица будет n x n, С "1"по главной диагонали.

  2. далее выполнить разложение собственных значений на этой ковариации матрица; это даст вам доля общей изменчивости в переменной ответа, внесенной этим собственным значением (каждое собственное значение соответствует объекту или столбцу). [Примечание., для этого шага часто используется разложение сингулярных значений (SVD), но это не нужно-разложение на собственные значения намного проще, и всегда делает работу, пока ваша матрица квадратная, что ковариационные матрицы всегда].

  3. ваш генетический алгоритм, на каждой итерации, возвращать набор из решения-кандидаты (в вашем случае подмножества функций). Следующее задание в 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

это третья колонка значений чуть выше (по одному для каждой функции), которые суммируются (выборочно, в зависимости от того, какие функции присутствуют в данном подмножестве, которое вы оцениваете с помощью функции затрат).