一文读懂遗传算法工作原理!
简介
前些日子,我开始处理一个具体难题——大型商场的销售情况。运用了几个基础方法进行了数据加工,我在竞赛中取得了第 219 位的成绩。

取得的成绩还算理想,不过我仍渴望有更出色的表现。为此,我着手探寻能够提升评分的改进措施。幸运的是,我确实发现了一种有效途径,这种方法被称作遗传算法。当运用到零售商的销售额分析上时,我的表现分数立刻在相关榜单中大幅攀升,位列顶尖行列。

确实,仅运用遗传算法,我就从 219 人中直接跃升至 15 人行列,这很惊人吧!相信在读完这篇文章之后,你也能熟练运用遗传算法,而且会发觉,当将它运用到你正在处理的事项上时,成效会有显著改善。
目录
1、遗传算法理论的由来
2、生物学的启发
3、遗传算法定义
4、遗传算法具体步骤
5、遗传算法的应用
6、实际应用
7、结语
1、遗传算法理论的由来
我们先从查尔斯·达尔文的一句名言开始:
能够存活下来的,常常不是力量最强的生物,也不是头脑最灵光的生物,而是最能融入环境的生物。
你或许在思索:此言与遗传算法存在何种联系?事实上,遗传算法的全部构思正是由此而来。
让我们用一个基本例子来解释 :
我们设想一个场景,此刻你是一位君主,为了让你的疆域远离祸患,你推行了一项政策:
这个情形虽然可能性不大,但我举它是为了让你明白原理。换句话说,我们调整初始条件(比如:人口数量),就能得到更理想的成果(比如:更优越的国家)。现在,我料想你已对原理有个基本认识,觉得遗传算法的内涵应当与生物学相关。那么我们简要探讨几个要点,以便串联起整体认知。
2、生物学的启发
你一定还记得那句名言:生命体都以细胞为基本单位。由此可见,任何生物体里的每一个细胞,都包含着一套一模一样的遗传物质。这种遗传物质,其实是一种由 DNA 构成的复杂结构。

这些染色体通常能够用包含零与一的序列来描述,这种序列由数字零和数字一构成。
一条染色体包含基因,基因是 DNA 的基础构造,DNA 上的每个基因负责决定一个特定特征,例如头发或眼睛的色泽,请你阅读下文前,先回顾一下刚才提及的生物学知识,这部分内容到此结束,现在我们探讨一下遗传算法究竟是什么。
3、遗传算法定义
首先我们回到前面讨论的那个例子,并总结一下我们做过的事情。
起初,我们确定了全体人民的起始数量。接着,我们创建了一个方法,用来分辨正直之人与奸恶之徒。随后,我们挑选出正直之人,并让他们繁衍子孙后代。最终,这些子孙从原有的国民中替换掉部分奸恶之徒,并且持续进行这一步骤。
遗传算法运作方式确实如此,它主要是在一定层面上模仿生物进化的流程。
所以,要明确遗传算法的规范表述,可以视其为一种改进途径,这种途径旨在探寻特定参数,借助这些参数便能获取最优的输出数值或成效。遗传算法的运作机制借鉴了生物学的原理,详细步骤参见图示。
那么现在我们来逐步理解一下整个流程。
4、遗传算法具体步骤
为了使说明更加清晰,我们先来认识一下称作经典组合数学难题的「背包问题」。倘若对这问题尚存疑惑,此处提供一种个人阐述的方式。
譬如,你打算外出旅行一个月,然而你所能携带的背包最大承重仅三十公斤。目前你拥有若干必备物品,每件物品都对应着特定的「存活指数」(详细数据见附表)。所以,你的任务是在背包重量限制范围内,尽可能提升整体的「存活指数」。
4.1 初始化
在此,我们借助遗传算法来处理背包难题。首要步骤是确立我们的种群。种群由多个个体构成,每个个体都携带一套独特的基因序列。
我们清楚,染色体能够转化成由二进制数字构成的序列,在此情形下,数值一表示后续位置上的基因是存在的,数值零则说明该位置上的基因已经缺失。作者在此处运用染色体与基因的概念来处理先前的背包难题,特定位置上的基因对应背包问题表格中的物件,例如首个位置代表睡袋,那么在染色体的相应位置上,该染色体的首个基因便体现这一物件。
现在,我们将图中的 4 条染色体看作我们的总体初始值。
4.2 适应度函数
类似地,对于 A2 染色体
001110
来说,有:
这个问题上,我们觉得,染色体如果拥有更高的生存指数,就表明它的生存能力更优越。
因此,由图可知,染色体 1 适应性强于染色体 2。
4.3 选择
此刻,能够从整体里挑选出合适的基因链,让它们彼此『结合』,繁衍出子孙后代了。这是实施挑选过程的基本思路,然而这般做法会使基因链在几代之后彼此相似度增加,丧失了差异性。所以,我们通常采用「轮盘赌选择法」(Roulette Wheel Selection method)。

设想一个圆盘,现在我们把它分成 m 段,这里的 m 指的是全部染色体的数量。每条染色体在圆盘上占据的范围大小,会依据其适应度值按比例确定。
基于上图中的值,我们建立如下「轮盘」。

此刻,这个轮盘开始转动,我们将依据图中不变的指示点(fixed point)所对准的那块地方,挑选出首个亲本。接下来,对第二个亲本,我们执行相同的步骤。偶尔,我们也会在过程中标示出两个固定的指示点,如图所示

运用这种手段,我们能在单次过程中挑选出两个亲本个体,并将此方法命名为「随机普遍选择法」。
4.4 交叉
先前环节已筛选出具备繁殖能力的亲本基因链,所谓基因重组,从生物角度解读即为繁衍过程。接下来,我们针对步骤中确定的染色体1与染色体4实施重组,具体情形参见图示。
这是最基础的杂交方式,我们称之为「单点杂交」。在此过程中,我们随机确定一个杂交位点开元ky888棋牌官网版,接着,将此位点两侧的基因片段,在不同的染色体之间进行互换,从而创造出新的后代。
如果确定两个相交位置,这种做法称作「多点相交」,参考附图。
4.5 变异
从生命科学的角度审视此事,试问:经由前述机制繁衍的后代,其体态特征会与双亲完全一致吗?答案是否定的。在子代发育期间,其内部遗传物质会经历若干调整,因而形成与亲代相异的形态。这种现象称作「变异」,它指的是染色体系列发生的随机性更迭,正因存在变异现象,生物群落才会呈现丰富的差异性。
下图为变异的一个简单示例:
变化实现之后,便形成了全新生物,发展也就终止了,整体流程如图所示
经过「遗传变异」环节,我们借助适应度函数来检测新生成的后代,一旦函数确认它们的适应程度达标,便会用这些个体替换掉那些适应能力偏低的基因序列,存在一个疑问开yun体育app入口登录,我们究竟该依据何种准则来判定后代已经达到最优适应程度呢?
一般来说,有如下几个终止条件:
迭代 X 次之后,整体情况变化不大。 事先已经为算法设定了进化次数。 适应度函数值抵达了预设标准。
现在,我们假定你已大致掌握了遗传算法的核心思想,接下来,就让我们借助这一方法,在数据科学领域进行实践操作。
5、遗传算法的应用
5.1 特征选取
设想一下在数据科学竞赛中,你将如何挑选出对目标变量预测有显著作用的特征呢?你通常会评估模型里各个特征的重要性,然后人为确定一个标准,把重要性超过这个标准的特征挑选出来。
那么,有没有什么途径能够更妥善应对这个状况呢?事实上,针对特征挑选工作而言,遗传算法算是最前沿的方法之一。
我们先前解决背包问题的思路完全可以借鉴过来。首先,需要构建一套「染色体」的基本框架,这里的染色体本质上还是由二进制数字构成,其中「1」代表模型采纳了某个特征,而「0」则意味着模型舍弃了该特征。
但是有一点需要调整,就是我们的评价标准必须更新。这个评价标准要依据这次竞赛的准确度来设定。具体来说,当染色体的预测结果越准确,那么它的评价就会越好。
现在我想你大概明白了这个方法的意思。接下来我不会立刻说明如何处理这个问题,而是先让我们尝试用 TPOT 库来完成它。
5.2 用 TPOT 库来实现
这部分就是你最初阅读本文时内心最终期望达成的那个目的。就是:达成。那么我们首先简要了解一下 TPOT 库,也就是 Tree-based Pipeline Optimisation Technique,即树形传递优化技术,这个库是建立在 scikit-learn 库之上的。接下来展示的是一种基础的流程构造图。

图中那个深色部分是借助 TPOT 库自动完成的。完成这一部分的自动化操作必须应用遗传学方法。
我们只做直接运用,不作详细阐释。若要运用 TPOT 库,必须先配置 TPOT 所依赖的若干 python 库。接下来立刻进行安装。
安装深度进化算法工具包,升级检查模块,以及进度条库
安装deap软件包,同时更新检查器组件,以及下载进度条工具
# installling TPOT
pip install tpot
这里,我选用了 Big Mart Sales(数据集地址:https://datahack.analyticsvidhya.com/contest/practice-problem-big-mart-sales-iii/)数据集,为后续工作做筹备,我们需先迅速获取训练和测试文件,具体实现方法如下,这是相关的 python 代码:
# import basic libraries
importnumpy asnp
importpandas aspd
importmatplotlib.pyplot asplt
%matplotlib inline
从scikit-learn库中导入预处理模块
从sklearn.metrics库中导入mean_squared_error函数
## preprocessing
### mean imputations
train
'Item_Weight'
.fillna((train
'Item_Weight'
.mean), inplace= True)
test
'Item_Weight'
.fillna((test
'Item_Weight'
.mean), inplace= True)
脂肪含量仅分为两种类型
train
'Item_Fat_Content'
= train
'Item_Fat_Content'
.replace(
'low fat', 'LF'
'Low Fat', 'Low Fat'
train
'Item_Fat_Content'
= train
'Item_Fat_Content'
.replace(
'reg'
'Regular'
test
'Item_Fat_Content'
= test
'Item_Fat_Content'
.replace(
'low fat', 'LF'
'Low Fat', 'Low Fat'
test
'Item_Fat_Content'
= test
'Item_Fat_Content'
.replace(
'reg'
'Regular'
train
'Outlet_Establishment_Year'
= 2013- train
'Outlet_Establishment_Year'
test
'Outlet_Establishment_Year'
= 2013- test
'Outlet_Establishment_Year'
train
'Outlet_Size'
用空值替换为Small,并且立即生效
test
'Outlet_Size'
.fillna( 'Small',inplace= True)
train
'Item_Visibility'
= np.sqrt(train
'Item_Visibility'
test
'Item_Visibility'
= np.sqrt(test
'Item_Visibility'
col =
商品出口规模,销售网点地理位置,店铺经营类别,商品脂肪含量情况
test
'Item_Outlet_Sales'
将测试集添加到训练集中,针对每一列执行以下操作:
combi
= number.fit_transform(combi
.astype( 'str'))
combi
= combi
.astype( 'object')
train = combi
:train.shape
test = combi
train.shape
test删除了名为商品销售额的列,操作范围是横向,并且更改了原始数据集
## removing id variables
tpot_train = train.drop(
编号标识, 商品种类, 物品编号
,axis= 1)
tpot_test = test.drop(
'Outlet_Identifier', 'Item_Type', 'Item_Identifier'
,axis= 1)
target = tpot_train
'Item_Outlet_Sales'
tpot_train删除了名为Item_Outlet_Sales的列,操作影响原数据集,此列不再保留。
最终借助tpot库来构建模型
fromtpot importTPOTRegressor
X_train, X_test, y_train, y_test分别通过train_test_split函数从tpot_train和目标值中分割得到,
划分比例为百分之七十五用于训练,百分之二十五用于测试
tpot是一个对象, 它基于TPOTRegressor创建, 参数设置为代数为5, 种群大小为50, 信息输出级别为2
tpot.fit(X_train, y_train)
输出tpot在测试数据集上的评分结果, 使用X_test和y_test作为输入参数
tpot将处理流程导出为名为tpot_boston_pipeline.py的文件

这些代码执行过后,tpot_exported_pipeline.py 文件中便会包含执行路径优化的相关代码片段。经过观察,ExtraTreeRegressor 模型最为适合处理该问题。
进行预测,借助经过tpot优化的流程
tpot预测测试集的结果赋值给tpot_pred变量
sub1等于一个数据框,里面装着tpot_pred的数据
将sub1.index设置为从0到test长度再加1的连续整数序列
sub1将列名'0'更改为'Item_Outlet_Sales',这一操作在sub1对象中进行,目的是为了提升数据列的命名清晰度
sub1
'Item_Identifier'
= test
'Item_Identifier'
sub1
'Outlet_Identifier'
= test
'Outlet_Identifier'
sub1.columns =
销售额明细, 商品唯一码, 店铺唯一码
sub1 = sub1
物品唯一编号,店铺唯一编号,商品销售额
将数据保存为CSV文件,文件名为tpot,不包含行索引
若你递交了这份表格,便会察觉先前承诺的诸多功能尚未完全兑现。这是否意味着我在误导大家?绝非如此。事实上,TPOT 库遵循一条基本准则。倘若未对 TPOT 运行足够长时间,它便无法为你的课题寻得最优解决方案。
因此,你需要提升算法的迭代次数,端着咖啡到户外活动一番,其他方面就由 TPOT 来完成。不仅如此,这个工具同样适用于解决分类类任务。想要了解更多详情,可以查阅这个网址:http://rhiever.github.io/tpot/。除了参与竞赛,日常工作和生活中也存在许多能够运用遗传算法的场合。
6、 实际应用
遗传算法在现实生活里用途广泛。在此列举了若干引人入胜的实例,不过受限于篇幅,无法对每一个都进行详尽说明。
6.1 工程设计
工程设计极需借助计算机建模与模拟,以便让设计流程既迅速又节省成本。遗传算法在此能够实现优化,并产生一个相当理想的效果。
相关资源:
第六部分涉及出行与水路通道的选择,这属于经典路径优化课题,具体是指寻找最优旅行方案,要求从出发地出发,经过所有指定地点,最终返回原点,并且全程总距离最短,该领域在运筹学中被称为遍历销售者难题
此乃一个广为人知的事务,众多商业机构借助其优化物流,实现时间与成本的双重节省,应对该议题同样需借助基因方法。


6.3 机器人
遗传算法在机器人技术中运用十分普遍,当前正借助该算法研发具备自主学习和人类行为能力的机器人,这些机器人能够完成诸如烹饪、清洁衣物等任务。
相关资源:
7、结语
通过这篇文章的讲解,你应当已经充分掌握了遗传算法开元ky888棋牌官方版,并且能够借助 TPOT 库来应用它了。然而,如果缺乏实际操作,这些理论知识仍然十分有限。
因此,各位读者朋友们务必在数据科学竞赛或者日常生活中,自己动手去完成它