littletingting 2019-06-19
这是一篇关于在R中使用遗传算法进行特征选择的文章,我们先快速回顾一下:
动画来源:“基于肌肉的双足生物运动” - Thomas Geijtenbeek
背后的秘密
想象一个黑盒子可以帮助我们产生无限多种可能性,其标准是我们可以找到一个可接受的解决方案(时间和质量)来解决我们制定的问题。
什么是遗传算法?
遗传算法(GA)是一个受著名的查尔斯达尔文自然选择思想启发的数学模型。
自然选择仅保留了不同代人中最适合的个体。
想象一下,1900年有100只兔子,我们会比兔子祖先更快、更熟练地找到食物。
机器学习中的GA
在机器学习中,遗传算法的一个用途是获取正确数量的变量以创建预测模型。
选择正确的变量子集是一个组合优化的问题。
这种技术优于其他技术的优势在于,它可以从最好的先前解决方案中获得最佳解决方案。一种进化算法,随着时间的推移可以改进选择。
GA的想法是将一代又一代的不同解决方案结合起来,从每一个解决方案中提取最佳基因(变量)。这样就形成了更新、更适合的个体。
我们可以找到GA的其他用途,例如超调节参数,找到函数的最大值(或最小值)或搜索正确的神经网络结构(Neuroevolution),或者其他......
特征选择中的GA
作为选定变量(单个兔子)的GA的每个可能解决方案都被视为一个整体,它不会针对目标单独对变量进行排序。
这很重要,因为我们已经知道变量在组中是起作用的。
解决方案是什么样的?
举个简单的例子,假设我们总共有6个变量,
一个解决方案可以是获取3个变量,比方说:var2、var4和var5。
另一种解决方案可以是:var1和var5。
这些解决方案是人群中所谓的个体或染色体。它们是解决问题的可能办法。
从图像中可以看出,解3可以表示为单热矢量:c(1,0,1,0,1,1)。每个1表示包含该变量的解决方案。在这种情况下是:var1、var3、var5、var6。
而解决方案4是:c(1,1,0,1,1,0)。
载体中的每个位置都是一个基因。
GA过程及其运算符
遗传算法的基本思想是生成一些随机可能的解决方案(称为人口),它们代表不同的变量,然后在迭代过程中组合最佳解决方案。
这种组合遵循基本的GA操作,即:选择、变异和交叉。
这个想法是针对每一代人,我们会找到更好的个体,就像跑得很快的兔子一样。
我推荐Vijini Mallawaarachchi关于遗传算法如何工作的帖子。
这些基本操作允许算法通过以最大化目标的方式组合它们来改变可能的解决方案。
适应度函数
例如,该目标最大化是为了保持与最大化ROC曲线下面积最大化的解。这是在适应度函数中定义的。
适应度函数采用一个可能的解决方案(或染色体,如果您想要听起来更复杂的话),并以某种方式评估选择的有效性。
通常,适应度函数采用单热矢量c(1,1,0,0,0,0),例如,创建一个具有var1和var2的随机森林模型,并返回适应值(ROC)。
此代码中的适应度值计算为:ROC值/变量数。通过这样做,该算法利用大量变量惩罚解。类似于Akaike信息标准或AIC的想法。
R中的遗传算法!
我的目的是为您提供一个干净的代码,以便您可以了解背后的内容,同时尝试修改适应度函数等新方法。这是至关重要的一点。
要在您自己的数据集上使用,请确保data_x(数据框)和data_y(因子)与custom_fitness函数兼容。
主库是由Luca Scrucca开发的GA。请看这里的示例。
重要提示:以下代码不完整。克隆存储库以运行该示例。
注意:不要期望那么快的结果
现在我们根据最佳选择计算精度!
精度约为95,08%,而ROC值接近0.95(ROC =适应值*变量数,检查适应度函数)。
分析结果
我不喜欢在没有截断点的情况下分析准确度(评分数据),但是与这个Kaggle帖子的结果进行比较是有用的。
他使用基于5个变量的递归特征消除或RFE获得了类似的精度结果,而我们的解决方案保持在4。
亲自尝试一下
尝试新的适应度函数,有些解决方案仍然提供大量变量,可以尝试平方变量的数量。
要尝试的另一件事是获取ROC值的算法,甚至是更改度量标准的算法。
一些配置持续很长时间。在建模之前平衡类并使用p_sampling参数。采样技术可以对模型产生重大影响。有关详细信息,请查看模型性能帖子上的样本大小和类平衡。
如何改变基因突变率或成为精英主义的比率?或尝试其他交叉方法?
增加popSize以同时测试更多可能的解决方案(按时间成本)。
随意分享任何见解或想法,以改善选择。
克隆存储库以运行该示例。
相关的概念
GA和深度学习之间存在一种并行性、迭代和改进的概念随着时间的推移是相似的。
我添加了p_sampling参数以加快速度。它通常会实现其目标,与深度学习中使用的批处理概念类似。另一个相似之处是在GA参数运行和神经网络训练中的早期停止标准之间。
但最大的相似之处在于两种技术都来自于对自然的观察。在这两种情况下,人类都观察神经网络和遗传学如何工作,并创建了一个模仿其行为的简化的数学模型。大自然有数百万年的进化,为什么不尝试模仿它呢?
编译出品