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

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

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

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

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

1 Ответ

6 голосов
/ 03 ноября 2011

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

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

Сокращение до кода является простым:

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

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

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

Пример расчета (с использованием 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

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

...