遗传算法:特征选择算法的适应度函数

时间:2011-11-03 09:48:40

标签: machine-learning genetic-algorithm feature-selection

我有数据集n x m,其中有n个观测值,每个观测值由m个属性的m个值组成。每次观察也观察到分配给它的结果。我很大,对我的任务来说太大了。我试图找到m个属性的最佳和最小子集,它仍然很好地代表整个数据集,因此我只能使用这些属性来教授神经网络。

我想用遗传算法。问题是fittness功能。它应该告诉生成的模型(属性子集)如何仍然反映原始数据。而且我不知道如何针对整个集合评估某些属性的子集。 当然,我可以使用神经网络(以后将使用这个选定的数据)来检查子集的好坏 - 误差越小,子集越好。但是,在我的情况下,这需要一点时间,我不想使用这个解决方案。我正在寻找一些其他方式,最好只对数据集进行操作。

我想到的是:使用子集S(通过遗传算法找到),修剪数据集以使其仅包含子集S的值并检查该数据序列中的多少观察值不再可区分(具有相同的值)属性)同时具有不同的结果值。数字越大,它的子集就越差。但在我看来,这似乎有点太费力了。

还有其他方法可以评估属性子集仍然代表整个数据集的程度吗?

1 个答案:

答案 0 :(得分:6)

成本函数应该可以达到您想要的效果: 将与每个子集构成的功能相对应的因子加载

总和越高,响应变量的可变性份额就越大,仅用这些特征来解释。如果我理解OP,这个成本函数是一个忠实的翻译,从OP表示“代表整个集合。”

简化代码非常简单:

  1. 计算数据集的协方差矩阵(首先删除 保存响应变量的列,即可能是最后一个 一)。如果您的数据集是 m x n (列x行),那么这个 协方差矩阵将 n x n ,主对角线下方为“1”。

  2. 接下来,对此协方差执行特征值分解 矩阵;这将给出总变异的比例 在响应变量中,由特征值(每个特征值)贡献 特征值对应于特征或列)。 [注意, 奇异值分解(SVD)通常用于此步骤,但是 这是不必要的 - 特征值分解更简单,并且 只要您的矩阵是正方形,那么它总能完成工作 协方差矩阵总是]。

  3. 您的遗传算法将在每次迭代时返回一组 候选解决方案(特征子集,在您的情况下)。下一个任务 在GA中,或任何组合优化,是对那些候选人进行排名 成本函数得分的解决方案。在你的情况下,成本 函数是每个函数的特征值比例的简单求和 该子集中的功能。 (我想你会想要缩放/标准化 该计算使得较高的数字最不合适 虽然。)

  4. 示例计算(使用 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
    

    所以它是上面的值的 第三列 (每个特征一个)被求和(有选择地,取决于您在给定子集中存在哪些特征)用成本函数进行评估。)