【超参数寻优】遗传算法(GA) 超参数寻优的python实现

本文介绍了遗传算法(GA)在超参数寻优中的应用,详细阐述了遗传算法的原理,包括染色体、基因、种群和适应度函数的概念。通过选择、交叉和变异操作不断优化种群,直至找到最优解。文章提供了多参数寻优的思路和遗传算法的Python实现,并展示了最优适应度函数值随迭代次数的变化情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


本博文首先简单介绍遗传算法(Genetic Algorithm)的基础知识,然后以为非线性SVM为例给出遗传算法多参数寻优的python实现。

一、遗传算法简介

遗传算法介绍部分主要参考(资料【1】),介绍过程中为方便大家理解相关概念,会有部分本人的理解,如有错误,请在评论区指正。

1、遗传算法由来

本人之前的两篇博文(资料【2,3】)分别介绍了如何用交叉验证方法进行单一参数和多参数寻优,交叉验证其实只是计算模型的评价指标的方法,参数的搜索过程其实是根据提前给出的取值范围进行穷举,如果参数取值范围给定的不合理,最优化参数就无从谈起。有没有一种方法,参数的取值范围可以随机设定,并在优化过程中不断变化,直到找到最优参数?

遗传算法是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。

2、遗传算法名词概念

染色体(个体):在参数寻优问题中一个染色体代表一个参数,染色体的十进制数值,用于获取待寻优参数实际输入到模型中的值。
基因:每一个染色体都对应多个基因,基因是二进制数,基因的取值长度是染色体的长度。遗传算法的交叉、变异操作都是对染色体的基因进行的。
种群:初始化的染色体取值范围。
适应度函数:表征每一组染色体(每一组参数)对应的模型评价指标(本博文的python实例中,采用3-flod 交叉检验的平均值作为适应度函数值)。

假设对于两个参数的寻优,我们设定染色体长度为20,种群数为200,就是说初始化两个染色体,每个染色体初始化200个可能的值,每一个染色体的十进制数值用20位二进制数表示。

3、遗传算法中对染色体的操作

随机产生的初始化染色体取值范围中,不一定包含最优的参数取值,为了找到最优的染色体,需要不断对适应度函数值表现优秀的染色体进行操作,直到找到最优的染色体。具体操作如下:

3.1、选择

染色体选择是为了把适应度函数值表现好的染色体选出来,保持种群数量不变,就是将适应度函数值表现好的染色体按照更高的概率保存到下一代种群中(下一代种群中更多的染色体是上一代适应度函数值表现好的染色体),具体方法可参考【资料1

3.2、交叉

交叉操作是为了产生新的染色体,将不同染色体的部分基因进行交换,具体方法有单点交叉和多点交叉。

3.3、变异

变异操作同样是为了产生新的染色体,通过改变部分染色体的部分基因。

选择、交叉、变异这三种操作,既保证了适应度函数值表现好的染色体尽可能的保留到下一代种群,又能保证下一代种群的变化,可以产生新的染色体。

二、遗传算法多参数寻优思路

多参数寻优和单一参数寻优的基本思路是相同的,不过在种群初始化时,每次需要初始化两个染色体,并且在选择、交叉、变异操作时,两个染色体是分别进行的。

步骤一:种群、染色体、基因初始化。
步骤二:计算种群中每一组染色体对应的适应度函数值。
步骤三:对种群中的染色体进行选择、交叉、变异操作,产生新的种群。
步骤四:判断是否满足终止条件?如果不满足,跳转到步骤二;如果满足,输出最优参数。
步骤五:结束。

三、遗传算法多参数寻优的python实现

完整的python代码及数据样本地址:https://github.com/shiluqiang/GA_python-for-multi-parameters-optimization

## 2. GA优化算法
class GA(object):
###2.1 初始化    
    def __init__(self,population_size,chromosome_num,chromosome_length,max_value,iter_num,pc,pm):
        '''初始化参数
        input:population_size(int):种群数
              chromosome_num(int):染色体数,对应需要寻优的参数个数
              chromosome_length(int):染色体的基因长度
              max_value(float):作用于二进制基因转化为染色体十进制数值
              iter_num(int):迭代次数
              pc(float):交叉概率阈值(0<pc<1)
              pm(float):变异概率阈值(0<pm<1)
        '''
        self.population_size = population_size
        self.choromosome_length = chromosome_length
        self.chromosome_num = chromosome_num
        self.iter_num = iter_num
        self.max_value = max_value
        self.pc = pc   ##一般取值0.4~0.99
        self.pm = pm   ##一般取值0.0001~0.1
        
    def species_origin(self):
        '''初始化种群、染色体、基因
        input:self(object):定义的类参数
        output:population(list):种群
        '''
        population = []
        ## 分别初始化两个染色体        
        for i in range(self.chromosome_num):
            tmp1 = []  ##暂存器1,用于暂存一个染色体的全部可能二进制基因取值
            for j in range(self.population_size):
                tmp2 = [] ##暂存器2,用于暂存一个染色体的基因的每一位二进制取值
                for l in range(self.choromosome_length):
                    tmp2.append(random.randint(0,1))
                tmp1.append(tmp2)
            population.append(tmp1)
        return population
###2.2 计算适应度函数值
    def translation(self,population):
        '''将染色体的二进制基因转换为十进制取值
        input:self(object):定义的类参数
              population(list):种群
        output:population_decimalism(list):种群每个染色体取值的十进制数
        '''
        population_decimalism = []
        for i in range(len(population)):
            tmp = []  ##暂存器,用于暂存一个染色体的全部可能十进制取值
            for j in range(len(population
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值