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

Posted

技术标签:

【中文标题】遗传算法:特征选择算法的适应度函数【英文标题】:Genetic algorithms: fitness function for feature selection algorithm 【发布时间】:2011-12-21 00:40:04 【问题描述】:

我有 n x m 的数据集,其中有 n 个观察值,每个观察值由 m 个属性的 m 个值组成。每个观察还观察到分配给它的结果。 m 很大,对我的任务来说太大了。我正在尝试找到仍然很好地代表整个数据集的 m 个属性的最佳和最小子集,以便我可以仅使用这些属性来教授神经网络。

我想为此使用遗传算法。问题是适应度函数。它应该说明生成的模型(属性子集)仍然反映原始数据的程度。而且我不知道如何针对整个集合评估某些属性子集。 当然,我可以使用神经网络(以后无论如何都会使用这个选定的数据)来检查子集的好坏——误差越小,子集就越好。但是,就我而言,这需要花费大量时间,而且我不想使用此解决方案。我正在寻找其他一些最好只对数据集进行操作的方法。

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

还有其他方法可以评估属性子集在多大程度上仍能代表整个数据集吗?

【问题讨论】:

您实施了 GA 吗?我需要一些帮助... 【参考方案1】:

这个成本函数应该做你想做的事:将与构成每个子集的特征相对应的因子负载相加

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

简化为代码很简单:

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

    接下来,对该协方差执行特征值分解 矩阵;这将为您提供总可变性的比例 在响应变量中,由该特征值贡献(每个 特征值对应于特征或列)。 [注意, 此步骤通常使用奇异值分解 (SVD),但 这是不必要的——特征值分解要简单得多,并且 只要您的矩阵是方形的,它就总是可以完成这项工作,这 协方差矩阵总是]。

    您的遗传算法将在每次迭代中返回一组 候选解决方案(在您的情况下为功能子集)。下一个任务 在 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

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

【讨论】:

您的遗传算法将在每次迭代中返回一组候选解决方案(在您的情况下为特征子集)。你如何实现这个? 没错;因此,从那时起,它就像其他组合优化算法一样工作——将每个候选解决方案传递给成本函数(这是特定于问题的,并且独立于解决方案技术,无论是 GA、模拟退火等)。将成本函数返回的结果从最低到最高排序(假设分数越低 = 越好)。接下来,将对应于最佳分数的候选解决方案传递给 GA,GA 将依次生成下一组(更好的)候选解决方案。 前两个是必不可少的吗?跳过直接去GA可以吗?

以上是关于遗传算法:特征选择算法的适应度函数的主要内容,如果未能解决你的问题,请参考以下文章

遗传算法优化

[MATLAB] 利用遗传算法函数求目标函数的最优解

用R语言实现遗传算法

关于遗传算法

智能算法系列之遗传算法

遗传算法理解