gplearn原理解析及参数分析

gplearn简介

基于sklearn的遗传算法框架、

gplearn 基本原理

函数和变量的二叉树组合得到一个复杂的公式

在这里插入图片描述

初始化思路

初始化 population_size 棵树, 每棵树随机生成,受到二元组 init_depth 限制( min_depth ,

max_depth ),

初始化方法由 init_method 参数管理,分为三种子策略

grow

生成树的思路,公式从根节点开始生长,随机选择函数变量,遇到变量停止,成为一个叶子节点。 由于函数和变量的选择概率一致,在变量大于函数的时候,树的深度较浅。

full

完全二叉树思路,除最后一层外,其余节点均为函数。

half grow and half full

各一半

优化目标

SymbolicRegressor

  • mean absolute error: 平均绝对误差
def _mean_absolute_error(y, y_pred, w):
    """Calculate the mean absolute error."""
    return np.average(np.abs(y_pred - y), weights=w)
  • mse: 均方误差
def _mean_square_error(y, y_pred, w):
    """Calculate the mean square error."""
    return np.average(((y_pred - y) ** 2), weights=w)
  • rmse: 根均方误差
def _mean_square_error(y, y_pred, w):
    """Calculate the mean square error."""
    return np.average(((y_pred - y) ** 2), weights=w)
  • pearson: 皮尔森相关系数
def _weighted_pearson(y, y_pred, w):
    """Calculate the weighted Pearson correlation coefficient."""
    with np.errstate(divide='ignore', invalid='ignore'):
        y_pred_demean = y_pred - np.average(y_pred, weights=w)
        y_demean = y - np.average(y, weights=w)
        corr = ((np.sum(w * y_pred_demean * y_demean) / np.sum(w)) /
                np.sqrt((np.sum(w * y_pred_demean ** 2) *
                         np.sum(w * y_demean ** 2)) /
                        (np.sum(w) ** 2)))
    if np.isfinite(corr):
        return np.abs(corr)
    return 0.
  • spearman: spearman相关系数
def _weighted_spearman(y, y_pred, w):
    """Calculate the weighted Spearman correlation coefficient."""
    y_pred_ranked = np.apply_along_axis(rankdata, 0, y_pred)
    y_ranked = np.apply_along_axis(rankdata, 0, y)
    return _weighted_pearson(y_pred_ranked, y_ranked, w)

SymbolicTransformer

新特征与目标变量之间的相关系数的绝对值

  • pearson: 皮尔森相关系数
  • spearman: spearman相关系数

SymbolicClassifier

二分类问题

  • log_loss: 对数损失
def _log_loss(y, y_pred, w):
    """Calculate the log loss."""
    eps = 1e-15
    inv_y_pred = np.clip(1 - y_pred, eps, 1 - eps)
    y_pred = np.clip(y_pred, eps, 1 - eps)
    score = y * np.log(y_pred) + (1 - y) * np.log(inv_y_pred)
    return np.average(-score, weights=w)

公式的进化reproduction

交叉crossover

优胜者内随机选择一个子树,替换为另一棵公式树的随机子树。此处的另一棵公式树通常是剩余公式树中适应度最高的。

在这里插入图片描述

子树变异 Subtree Mutation

优胜者的一棵子树将被另一棵完全随机的全新子树代替。
p_subtree_mutation控制

在这里插入图片描述

hoist变异 Hoist Mutation

从优胜者公式树内随机选择一个子树A,再从A里随机选择一个子树B,然后把B提升到A原来的位置,用

B替代A。

在这里插入图片描述

点变异 Point Mutation

p_point_replace 参数控制。一个随机的节点将会被改变

在这里插入图片描述

对抗公式膨胀(类似于对抗过拟合)

节俭系数

parsimony_coefficient 惩罚过于复杂的公式

hoist 变异

仅选取部分样本

gplearn 源码

SymbolicRegressor

  • population_size: 整数,可选(默认值=1000)种群规模(每一代个体数目即初始树的个数)。

  • generations : 整数,可选(默认值=20)要进化的代数。

  • tournament_size : 整数,可选(默认值=20)进化到下一代的个体数目(从每一代的所有公式中,tournament_size个公式会被随机选中,其中适应度最高的公式将被认定为生存竞争的胜利者,进入下一代。决定算法收敛速度。

  • stopping_criteria: 浮点数,可选(默认值=0.0)停止条件。

  • const_range: 两个浮点数组成的元组,或none,可选(默认值=(-1,1))公式中所要包含的常量取值范围。如果设为none,则无常数。

  • init_depth: 两个整数组成的元组,可选(默认值=(2,6))用来表示原始公式初始总体的树深度范围,树的初始深度将处在(min_depth, max_depth)的区间内(包含端点)。原始公式初始总体的树深度范围,单个树将随机选择此范围内的最大深度。

  • init_method: 字符串, 可选(默认值=‘half and half’)控制每棵公式树的初始化方式,有三种策略, ‘full’ 和 ‘grow’:

  • function_set: 字符串, 用于符号回归的函数,包括gplearn原始提供以及自定义

    • ‘add’ : addition, arity=2.
    • ‘sub’ : subtraction, arity=2.
    • ‘mul’ : multiplication, arity=2.
    • ‘div’ : protected division where a denominator near-zero returns 1., arity=2.
    • ‘sqrt’ : protected square root where the absolute value of the argument is used, arity=1.
    • ‘log’ : protected log where the absolute value of the argument is used and a near-zero argument returns 0., arity=1.
    • ‘abs’ : absolute value, arity=1.
    • ‘neg’ : negative, arity=1.
    • ‘inv’ : protected inverse where a near-zero argument returns 0., arity=1.
    • ‘max’ : maximum, arity=2.
    • ‘min’ : minimum, arity=2.
    • ‘sin’ : sine (radians), arity=1.
    • ‘cos’ : cosine (radians), arity=1.
    • ‘tan’ : tangent (radians), arity=1.
  • metric: 字符串, 目标函数(损失函数) (默认值=‘MAE’(平均绝对误差)),此外还包括gplearn提供的mse等,也可以自定义。

  • parsimony_coefficient: 浮点数或 “auto”, 可选 (默认值=0.001)用于惩罚过于复杂的公式。简约系数往往由实践验证决定。如果过于吝啬(简约系数太大),那么所有的公式树都会缩小到只剩一个变量或常数;如果过于慷慨(简约系数太小),公式树将严重膨胀。不过,gplearn已经提供了’auto’的选项,能自动控制节俭项的大小。

  • p_crossover: 浮点数, 可选 (默认值=0.9)对胜者进行交叉的概率,用于合成新的树

  • p_subtree_mutation: 浮点数, 可选 (默认值=0.01)控制胜者中进行子树变异的比例(优胜者的一棵子树将被另一棵完全随机的全新子树代替)所选值表示进行子树突变的部分。

  • p_hoist_mutation: 浮点数, 可选 (默认值=0.01) 控制进行hoist变异的比例,hoist变异是一种对抗公式树膨胀(bloating,即过于复杂)的方法:从优胜者公式树内随机选择一个子树A,再从A里随机选择一个子树B,然后把B提升到A原来的位置,用B替代A。hoist的含义即「升高、提起」。

  • p_point_mutation: 浮点数, 可选 (默认值=0.01)控制点进行突变的比例

  • p_point_replace: 浮点数, 可选 (默认值=0.05)对于点突变时控制某些点突变的概率。

  • max_samples: 浮点数, 可选 (默认值=1.0)从样本中抽取的用于评估每个树(成员)的百分比

  • feature_names: list(列表), 可选 (默认值=None)因子名(或特征名)若为none则用x0,x1等表示。

  • warm_start : 布尔型, 可选 (默认值=False)用于选择是否使用之前的解决方案

  • low_memory: 布尔型, 可选 (默认值=False)用于选择是否只保留当前一代

  • n_jobs: 整数,可选(默认值=1)用于设置并行计算的操作

  • verbose: 整数,可选(默认值=0)类似TensorFlow,keras中的verbose

    • verbose = 0日志显示
    • verbose = 1为输出进度条记录
    • verbose = 2为每个epoch输出一行记录
  • random_state: 整数, RandomState实例 或者 None, 可选(默认值=None)如果是int,则random_state是随机数生成器使用的种子;如果是random state实例,则random_state是随机数生成器;如果没有,则随机数生成器是使用的RandomState实例按“np.random”。

SymbolicClassifier

新增参数

  • class_weight: 字典, ‘balanced’ or None(default)
    • None : 所有类型权重为 1
    • ‘balanced’:对y输入权重平衡, n_samples/(n_classes*np.bincount(y))

SymbolicTransformer

新增参数

  • hall_of_fame: 整数,可选(默认值=100), 从最终进化一代选择hall_of_fame个数, 用于比较
  • n_components:整数,可选(默认值=10), 从hall_of_fame中输出最优的n_components个结果

参考

gplearn中SymbolicRegressor的参数介绍

【Python机器学习】用遗传算法实现符号回归——浅析gplearn

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
gplearn是一种用于遗传编程的Python库,它可以用来解决横截面数据问题。横截面数据是指在同一个时间点上收集到的多个个体的数据。例如,我们可能有多个城市在同一天的人口数据,或者多个公司在同一年的财务数据。 在使用gplearn进行横截面数据分析时,我们需要将每个个体的数据作为一个个体样本传入模型。然后,我们可以定义不同的变量,如城市的人口数量、公司的营业额、股价等作为输入变量,并将我们要预测的变量,如人口增长率、公司盈利等作为输出变量。 通过遗传编程的方式,gplearn可以自动地生成数学表达式来拟合横截面数据。它会通过随机生成和组合一系列基本数学运算符和函数,如加减乘除、指数函数和对数函数,来创建可能的数学表达式。然后,它使用遗传算法来选择和优化那些与实际数据最匹配的表达式。 用gplearn进行横截面数据分析的好处是,它可以在没有预设假设的情况下,发现数据中可能存在的非线性关系和交互效应。此外,由于gplearn使用遗传算法从大量的可能性中筛选出最佳的数学表达式,因此可以节省我们手动调整模型的时间和努力。 总之,gplearn是一个强大的Python库,可以用于横截面数据分析。它能够通过遗传编程的方式自动生成数学表达式,从而探索横截面数据中存在的非线性关系和交互效应。它的使用可以帮助我们更好地理解和预测横截面数据的特征和趋势。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

量化就是探索生活

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值