文章目录

  • GPlearn包学习
    • 1 gplearn._program
      • 1.1 **class** _Programe
        • params
        • attributes
        • functions
      • 1.2 总结
    • 2 gplearn.genetic
      • 2.1 **function** _parallel_evolve
      • 2.2 **class** BaseSymbolic(BaseEstimator, metaclass=ABCMeta)
        • __init__
        • _verbose_reporter
        • fit
      • 2.3 其他
    • 3 gplearn.funtions
      • 3.1 **class** _Function
      • 3.2 **function** make_funtion
      • 3.3 自定义函数
    • 4 其他
    • 1 gplearn._program
      • 1.1 **class** _Programe
        • params
        • attributes
        • functions
      • 1.2 总结
    • 2 gplearn.genetic
      • 2.1 **function** _parallel_evolve
      • 2.2 **class** BaseSymbolic(BaseEstimator, metaclass=ABCMeta)
        • __init__
        • _verbose_reporter
        • fit
      • 2.3 其他
    • 3 gplearn.funtions
      • 3.1 **class** _Function
      • 3.2 **function** make_funtion
      • 3.3 自定义函数
    • 4 其他

GPlearn包学习

  • GitHub地址(https://github.com/trevorstephens/gplearn)
  • 官方文档(英文)

1 gplearn._program

gplearn._program module contains the underlying representation of a computer program. It is used for creating and evolving programs used in the gplearn.genetic module.

1.1 class _Programe

This is the underlying data-structure used by the public classes in the gplearn.genetic module. It should not be used directly by the user.

params

  • function_set : list

    函数列表

  • arities : dict

    函数对应参数字典

  • init_depth : tuple of two ints

    树最大深度的范围

  • init_method : str

    参数范围:‘grow’, ‘full’, ‘half and half’

    分别代表“允许树的深度小于最大深度”、“树的深度必须等于最大深度”、“每次创建树时随机选择前两种方式”

  • n_features : int

    变量个数

  • const_range : tuple of two floats

    公式中常数的选取范围

  • metric : _Fitness object

    原始拟合度指标

  • p_point_replace : float

    每个点变异的概率

  • parsimony_coefficient : float

    节俭系数。膨胀(bloat)是指,公式变的越复杂,计算速度越缓慢,但它的适应度却毫无提升。此参数用于惩罚过于复杂的公式,参数越大惩罚力度越大。

  • random_state : RandomState instance

    随机数生成器

  • transformer : _Function object, optional (default=None)

    将程序输出转换为概率的函数,只用于SymbolicClassifier

  • feature_names : list, optional (default=None)

    变量名称,只用于打印或输出图片。

  • program : list, optional (default=None)

    扁平化的树,如果为None则随机生成一个。

attributes

  • program : list

    扁平化的树

  • raw_fitness_ : float

    原拟合度

  • fitness_ : float

    带惩罚的拟合度

  • oob_fitness_ : float

    样本外拟合度,只在max_samples < 1.0时用到。

  • parents : dict, or None

    如果为None,则这是一个初始的program。否则,这包含了父代的数据和进化到子代的遗传方式。

  • depth_ : int

    树的最大深度

  • length_ : int

    树的长度

functions

  • self.init(self, function_set, arities, init_depth, init_method, n_features, const_range, metric, p_point_replace, parsimony_coefficient, random_state, transformer=None, feature_names=None, program=None)

    类初始化。若self.program不是None,则调用self.validate_program()方法判断其是否完整;若为None则调用self.build_program(random_state)方法随机生成。

  • build_program(self, random_state):

    随机生成一棵树(program)

  • validate_program(self)

    判断self.program是否完整

  • str(self)

    打印树的表达式

  • export_graphviz(self, fade_nodes=None)

    输出树的dot图

  • _depth(self)

    计算树的最大深度

  • _length(self)

    计算树的长度

  • execute(self, X)

    对于数组X,根据树的表达式计算结果。

  • get_all_indices(self, n_samples=None, max_samples=None, random_state=None)

    一个抽样函数,从n_samples中抽取max_samples个,返回值indices, not_indices分别代表被抽取的样本的序号和未被抽取的样本序号,格式都是数组。

  • _indices(self)

    执行一次get_all_indices()方法,返回该方法返回值的第一个参数,即抽取的样本的序号。

  • raw_fitness(self, X, y, sample_weight)

    以self.metric的方法,根据样本X, y, 计算拟合度(不带惩罚)。

  • fitness(self, parsimony_coefficient=None)

    根据节俭系数parsimony_coefficient计算惩罚度,再根据self.raw_fitness_计算带惩罚的拟合度。

  • get_subtree(self, random_state, program=None)

    从树中随机选择一棵子树,返回所选子树在扁平化树(list)中的位置区间。这里随机选取截断位置的概率是不平等的,根据Koza’s(1992),我们取在结点(函数)上方截断的概率为90%,在叶子点(端点)上方截断的概率为10%。例,若一棵树共有10个点,其中6个结点,4个叶子点,那么在每个结点上方截断的概率为0.9*6/(0.9*6+0.1*4)$\approxKaTeX parse error: Undefined control sequence: \* at position 24: …个叶子点上方截断的概率为0.1\̲*̲4/(0.9\*6+0.1\*…\approx$0.069。

  • reproduce(self)

    返回self.program的复制(copy)

  • crossover(self, donor, random_state)

    交叉。本质上就是将两棵树的子树做一下交换,首先使用get_subtree()方法在self.program中随机选择一棵子树,再从donor中随机选择一棵子树,用donor的子树替换self.program的子树并返回。此外,还返回self.program被移除的子树位置区间以及donor被移除子树后的位置列表。

  • subtree_mutation(self, random_state)

    子树变异。首先生成一棵新的树,把它作为donor使用crossover()方法做交叉变换,返回crossover()方法的返回值。

  • hoist_mutation(self, random_state)

    hoist变异。想法和剪枝有些相似,用一种“抬高”的方法剪掉树中的一段,再把剩下的子树拼回到主干上。具体的方法为,首先使用get_subtree()方法在self.program中随机选择一棵子树并剪掉,再从这棵子树中随机选择一棵子树,把它拼接回被剪掉的子树与主干连接的位置。返回这棵变异后的树,以及被移除的点的位置列表。

  • point_mutation(self, random_state)

    点变异。这个就比较容易理解,树中的若干个结点或叶子点发生变异。如果是结点,那么就从函数库中随机选择一个参数个数相同的函数替换原结点;如果是叶子点,那就随机选择一个变量,或随机选一个常数(如果树中允许包含常数),替换原来的叶子点。此变异受参数p_point_replace控制,首先对树的每个点生成一个U(0,1)均匀分布的随机变量,对小于p_point_replace的点进行变异。

1.2 总结

gplearn._program中只包_Programe这个类,它作为基类,提供了树的随机生成、变异、根据数据计算结果及拟合度等方法,其中变异包含交叉、子树变异、hoist变异、点变异,为接下来在此之上构建遗传算法提供了基础。

未来在做修改时,为了适应更多函数(时间序列函数),需要在树的生成、计算、变异上都进行修改,因为这些函数除了基础的变量外还涉及到rolling窗口的选择,比较方便的思路是在每次选择函数时,先不定义窗口,若选到了时间序列函数,则此时从窗口的可选范围中随机选择一个作为固定参数,将整个函数封装为一个functions._Function,整体传入树中,这样就不会影响到变异、计算。


2 gplearn.genetic

gplearn.genetic module implements Genetic Programming. These are supervised learning methods based on applying evolutionary operations on computer programs.

2.1 function _parallel_evolve

params: n_programs, parents, X, y, sample_weight, seeds, params

Private function used to build a batch of programs within a job.

在对一代公式计算时将所有的树分为n_jobs个部分,利用Parallel分块计算,而这个私有函数主要用来对一个部分的公式进行计算。

首先,定义了一个方法_tournament(),用于从亲代公式中随机抽取tournament_size个并从中选择拟合度最高的公式。接下来进化子代公式,在生成每个子代时,先用_tournament()方法抽取一个公式,利用随机数生成器从U(0,1)均匀分布中生成一个随机数。

接下来,先将此数与交叉变换概率比较,若比较结果为小于,那么就对此公式做交叉变换,用_tournament()方法再抽取一个公式,对这两个公式做变换;否则,再和交叉变换概率与子树变异概率的和比较,同理若比较结果是小于,则对公式做子树变异,这个概率其实就等价于子树变异的概率;否则,同上判断是否进行hoist变异以及点变异。这要求四个概率的和要不超过1,这个校验会在BaseSymbolic中被完成。

进化完成后,就得到了子代program,将进化信息作为parents参数入其中,再抽取部分数据作为样本,分别计算样本内拟合度及样本外拟合度。反复以上操作,生成n_programs个子代并拟合数据,最终返回所有子代program。

2.2 class BaseSymbolic(BaseEstimator, metaclass=ABCMeta)

Base class for symbolic regression / classification estimators.

这个类是下面的分类/回归两个类的基类,是由sklearn中的BaseEstimator作为父类生成的子类,这是sklearn中的一个基础的估计类,GPlearn中主要使用了其中的get_params()和__repr__()方法,后面用到的时候再展开。BaseSymbolic共包含3个方法:init(), _verbose_repoter()以及fit(),接下来分别解释一下这三个方法。

init

params: self, population_size=1000, hall_of_fame=None, n_components=None, generations=20, tournament_size=20, stopping_criteria=0.0, const_range=(-1., 1.), init_depth=(2, 6), init_method=‘half and half’, function_set=(‘add’, ‘sub’, ‘mul’, ‘div’), transformer=None, metric=‘mean absolute error’, parsimony_coefficient=0.001, p_crossover=0.9, p_subtree_mutation=0.01, p_hoist_mutation=0.01, p_point_mutation=0.01, p_point_replace=0.05, max_samples=1.0, class_weight=None, feature_names=None, warm_start=False, low_memory=False, n_jobs=1, verbose=0, random_state=None

类的初始化。使用了@abstractmethod装饰器,也就是说子类实现了该抽象方法才能被实例化。此方法主要是定义了类的一些属性,简单讲一下这些属性的含义。

  • population_size : integer, optional (default=1000)

    每一代树(program)的个数

  • hall_of_fame : integer, or None, optional (default=None)

    选择拟合度最高的树的个数

  • n_components : integer, or None, optional (default=None)

    从拟合度最高的若干树中选择相关性最小的树的个数

  • generations : integer, optional (default=20)

    迭代(进化)次数

  • tournament_size : integer, optional (default=20)

    每次进化子代时保留的亲代中树的个数

  • stopping_criteria : float, optional (default=0.0)

    停止标准(最低拟合度)

  • const_range : tuple of two floats, or None, optional (default=(-1., 1.))

    常数取值范围

  • init_depth : tuple of two ints, optional (default=(2, 6))

    深度范围

  • init_method : str, optional (default=‘half and half’)

    生成树的方式

  • function_set : iterable, optional (default=(‘add’, ‘sub’, ‘mul’, ‘div’))

    基础函数集

  • transformer

    将程序输出转换为概率的函数

  • metric : str, optional (default=‘mean absolute error’)

    拟合度指标

  • parsimony_coefficient : float or “auto”, optional (default=0.001)

    节俭(惩罚)系数

  • p_crossover : float, optional (default=0.9)

    交叉变换的概率

  • p_subtree_mutation : float, optional (default=0.01)

    子树变异的概率

  • p_hoist_mutation hoist : float, optional (default=0.01)

    变异的概率

  • p_point_mutation : float, optional (default=0.01)

    发生点变异的概率

  • p_point_replace : float, optional (default=0.05)

    每个点变异的概率

  • max_samples : float, optional (default=1.0)

  • class_weight

  • feature_names : list, optional (default=None)

    变量名称

  • warm_start : bool, optional (default=False)

  • low_memory : bool, optional (default=False)

    低内存限制

  • n_jobs : integer, optional (default=1)

    并行计算进程数(Parallel参数)

  • verbose : int, optional (default=0)

    并行计算结果输出方式(Parallel参数)

  • random_state : int, RandomState instance or None, optional (default=None)

    随机数生成器

_verbose_reporter

params: self, run_details=None

打印每一代进化的信息。包括迭代次数、平均长度、平均拟合度、最大长度、最高拟合度、样本外拟合度、运行时间。

fit

params: self, X, y, sample_weight=None

拟合样本。此方法为这个类的主要部分,参数包括X,y以及可选的样本权重。此方法的主要部分是检验各参数及数据的类型,以保证可以正常拟合,或根据不同需求(分类/回归)创建、校验所需参数。

校验完成后,首先生成一个空的列表作为_programs属性,存储每代数据,每次迭代生成下代数据时将上一代的样本分给不同的cpu,通过joblib包的Parallel并行调用_parallel_evolve()方法完成进化。

2.3 其他

接下来在类BaseSymbolic的基础上定义了SymbolicRegressor, SymbolicClassifier, SymbolicTransformer,分别用于回归、分类及特征工程(转化原有的特征、输出新的特征)。这里不进行详细展开了,因为这部分和我们的目标不符,是需要重新写的。


3 gplearn.funtions

gplearn.functions module contains all of the functions used by gplearn programs. It also contains helper methods for a user to define their own custom functions.

这个文件用于定义函数类_Function,以及构造(校验)一个函数的方法,并定义了一些内置函数。

3.1 class _Function

这个类很简单,初始化时需要的是函数function、函数名name以及函数的参数个数arities。此外,重写了__call__函数,使实例对象也将成为一个可调用对象,返回self.function(*args)。

可以简单地理解,就是给一个函数加了name和arities两个属性(可以这么理解,但这其实是不对的)。

3.2 function make_funtion

params: function, name, arity, wrap=True

这个方法是用来构造函数的,加入了一些校验。如果你确保你自己定义的函数没问题的话,这方法意义不大,可以不用。

3.3 自定义函数

GPlearn定义了一些内置函数,双参数的有加、减、乘、除、最大、最小,单参数的有开方、对数、相反数、倒数、绝对值、激活函数、以及3个基本三角函数(正弦、余弦、正切)。

其中除了除法、开方、对数、倒数、激活函数,全部直接用的是numpy的内置方法。除法为了避免出现过大的结果,对分母绝对值小于0.001的结果直接设为1;开方为了避免出现负数无法计算统一采用的是绝对值的开方;而计算对数的时候,同时考虑了上两种情况,对绝对值小于0.001的结果直接设为0,其余则计算绝对值的对数;倒数同样,对绝对值小于0.001的结果直接设为0,其余正常计算。

此外,激活函数则定义为 1/(1+np.exp(-x1))。


4 其他

除_program、genetic、functions外,GPlean还包含fitness、utils两个文件。其中utils包含了几个实用的工具,用在前面讲过的类和方法中,不一一讲了;fitness则定义了_Fitness类,由于我们的目标是挖掘因子,这些传统的拟合度指标无法满足需求,而是需要写一个简单的回测系统,这部分我会在第三部分中展开。# GPlearn包学习

  • GitHub地址(https://github.com/trevorstephens/gplearn)
  • 官方文档(英文)

1 gplearn._program

gplearn._program module contains the underlying representation of a computer program. It is used for creating and evolving programs used in the gplearn.genetic module.

1.1 class _Programe

This is the underlying data-structure used by the public classes in the gplearn.genetic module. It should not be used directly by the user.

params

  • function_set : list

    函数列表

  • arities : dict

    函数对应参数字典

  • init_depth : tuple of two ints

    树最大深度的范围

  • init_method : str

    参数范围:‘grow’, ‘full’, ‘half and half’

    分别代表“允许树的深度小于最大深度”、“树的深度必须等于最大深度”、“每次创建树时随机选择前两种方式”

  • n_features : int

    变量个数

  • const_range : tuple of two floats

    公式中常数的选取范围

  • metric : _Fitness object

    原始拟合度指标

  • p_point_replace : float

    每个点变异的概率

  • parsimony_coefficient : float

    节俭系数。膨胀(bloat)是指,公式变的越复杂,计算速度越缓慢,但它的适应度却毫无提升。此参数用于惩罚过于复杂的公式,参数越大惩罚力度越大。

  • random_state : RandomState instance

    随机数生成器

  • transformer : _Function object, optional (default=None)

    将程序输出转换为概率的函数,只用于SymbolicClassifier

  • feature_names : list, optional (default=None)

    变量名称,只用于打印或输出图片。

  • program : list, optional (default=None)

    扁平化的树,如果为None则随机生成一个。

attributes

  • program : list

    扁平化的树

  • raw_fitness_ : float

    原拟合度

  • fitness_ : float

    带惩罚的拟合度

  • oob_fitness_ : float

    样本外拟合度,只在max_samples < 1.0时用到。

  • parents : dict, or None

    如果为None,则这是一个初始的program。否则,这包含了父代的数据和进化到子代的遗传方式。

  • depth_ : int

    树的最大深度

  • length_ : int

    树的长度

functions

  • self.init(self, function_set, arities, init_depth, init_method, n_features, const_range, metric, p_point_replace, parsimony_coefficient, random_state, transformer=None, feature_names=None, program=None)

    类初始化。若self.program不是None,则调用self.validate_program()方法判断其是否完整;若为None则调用self.build_program(random_state)方法随机生成。

  • build_program(self, random_state):

    随机生成一棵树(program)

  • validate_program(self)

    判断self.program是否完整

  • str(self)

    打印树的表达式

  • export_graphviz(self, fade_nodes=None)

    输出树的dot图

  • _depth(self)

    计算树的最大深度

  • _length(self)

    计算树的长度

  • execute(self, X)

    对于数组X,根据树的表达式计算结果。

  • get_all_indices(self, n_samples=None, max_samples=None, random_state=None)

    一个抽样函数,从n_samples中抽取max_samples个,返回值indices, not_indices分别代表被抽取的样本的序号和未被抽取的样本序号,格式都是数组。

  • _indices(self)

    执行一次get_all_indices()方法,返回该方法返回值的第一个参数,即抽取的样本的序号。

  • raw_fitness(self, X, y, sample_weight)

    以self.metric的方法,根据样本X, y, 计算拟合度(不带惩罚)。

  • fitness(self, parsimony_coefficient=None)

    根据节俭系数parsimony_coefficient计算惩罚度,再根据self.raw_fitness_计算带惩罚的拟合度。

  • get_subtree(self, random_state, program=None)

    从树中随机选择一棵子树,返回所选子树在扁平化树(list)中的位置区间。这里随机选取截断位置的概率是不平等的,根据Koza’s(1992),我们取在结点(函数)上方截断的概率为90%,在叶子点(端点)上方截断的概率为10%。例,若一棵树共有10个点,其中6个结点,4个叶子点,那么在每个结点上方截断的概率为0.9*6/(0.9*6+0.1*4)$\approxKaTeX parse error: Undefined control sequence: \* at position 24: …个叶子点上方截断的概率为0.1\̲*̲4/(0.9\*6+0.1\*…\approx$0.069。

  • reproduce(self)

    返回self.program的复制(copy)

  • crossover(self, donor, random_state)

    交叉。本质上就是将两棵树的子树做一下交换,首先使用get_subtree()方法在self.program中随机选择一棵子树,再从donor中随机选择一棵子树,用donor的子树替换self.program的子树并返回。此外,还返回self.program被移除的子树位置区间以及donor被移除子树后的位置列表。

  • subtree_mutation(self, random_state)

    子树变异。首先生成一棵新的树,把它作为donor使用crossover()方法做交叉变换,返回crossover()方法的返回值。

  • hoist_mutation(self, random_state)

    hoist变异。想法和剪枝有些相似,用一种“抬高”的方法剪掉树中的一段,再把剩下的子树拼回到主干上。具体的方法为,首先使用get_subtree()方法在self.program中随机选择一棵子树并剪掉,再从这棵子树中随机选择一棵子树,把它拼接回被剪掉的子树与主干连接的位置。返回这棵变异后的树,以及被移除的点的位置列表。

  • point_mutation(self, random_state)

    点变异。这个就比较容易理解,树中的若干个结点或叶子点发生变异。如果是结点,那么就从函数库中随机选择一个参数个数相同的函数替换原结点;如果是叶子点,那就随机选择一个变量,或随机选一个常数(如果树中允许包含常数),替换原来的叶子点。此变异受参数p_point_replace控制,首先对树的每个点生成一个U(0,1)均匀分布的随机变量,对小于p_point_replace的点进行变异。

1.2 总结

gplearn._program中只包_Programe这个类,它作为基类,提供了树的随机生成、变异、根据数据计算结果及拟合度等方法,其中变异包含交叉、子树变异、hoist变异、点变异,为接下来在此之上构建遗传算法提供了基础。

未来在做修改时,为了适应更多函数(时间序列函数),需要在树的生成、计算、变异上都进行修改,因为这些函数除了基础的变量外还涉及到rolling窗口的选择,比较方便的思路是在每次选择函数时,先不定义窗口,若选到了时间序列函数,则此时从窗口的可选范围中随机选择一个作为固定参数,将整个函数封装为一个functions._Function,整体传入树中,这样就不会影响到变异、计算。


2 gplearn.genetic

gplearn.genetic module implements Genetic Programming. These are supervised learning methods based on applying evolutionary operations on computer programs.

2.1 function _parallel_evolve

params: n_programs, parents, X, y, sample_weight, seeds, params

Private function used to build a batch of programs within a job.

在对一代公式计算时将所有的树分为n_jobs个部分,利用Parallel分块计算,而这个私有函数主要用来对一个部分的公式进行计算。

首先,定义了一个方法_tournament(),用于从亲代公式中随机抽取tournament_size个并从中选择拟合度最高的公式。接下来进化子代公式,在生成每个子代时,先用_tournament()方法抽取一个公式,利用随机数生成器从U(0,1)均匀分布中生成一个随机数。

接下来,先将此数与交叉变换概率比较,若比较结果为小于,那么就对此公式做交叉变换,用_tournament()方法再抽取一个公式,对这两个公式做变换;否则,再和交叉变换概率与子树变异概率的和比较,同理若比较结果是小于,则对公式做子树变异,这个概率其实就等价于子树变异的概率;否则,同上判断是否进行hoist变异以及点变异。这要求四个概率的和要不超过1,这个校验会在BaseSymbolic中被完成。

进化完成后,就得到了子代program,将进化信息作为parents参数入其中,再抽取部分数据作为样本,分别计算样本内拟合度及样本外拟合度。反复以上操作,生成n_programs个子代并拟合数据,最终返回所有子代program。

2.2 class BaseSymbolic(BaseEstimator, metaclass=ABCMeta)

Base class for symbolic regression / classification estimators.

这个类是下面的分类/回归两个类的基类,是由sklearn中的BaseEstimator作为父类生成的子类,这是sklearn中的一个基础的估计类,GPlearn中主要使用了其中的get_params()和__repr__()方法,后面用到的时候再展开。BaseSymbolic共包含3个方法:init(), _verbose_repoter()以及fit(),接下来分别解释一下这三个方法。

init

params: self, population_size=1000, hall_of_fame=None, n_components=None, generations=20, tournament_size=20, stopping_criteria=0.0, const_range=(-1., 1.), init_depth=(2, 6), init_method=‘half and half’, function_set=(‘add’, ‘sub’, ‘mul’, ‘div’), transformer=None, metric=‘mean absolute error’, parsimony_coefficient=0.001, p_crossover=0.9, p_subtree_mutation=0.01, p_hoist_mutation=0.01, p_point_mutation=0.01, p_point_replace=0.05, max_samples=1.0, class_weight=None, feature_names=None, warm_start=False, low_memory=False, n_jobs=1, verbose=0, random_state=None

类的初始化。使用了@abstractmethod装饰器,也就是说子类实现了该抽象方法才能被实例化。此方法主要是定义了类的一些属性,简单讲一下这些属性的含义。

  • population_size : integer, optional (default=1000)

    每一代树(program)的个数

  • hall_of_fame : integer, or None, optional (default=None)

    选择拟合度最高的树的个数

  • n_components : integer, or None, optional (default=None)

    从拟合度最高的若干树中选择相关性最小的树的个数

  • generations : integer, optional (default=20)

    迭代(进化)次数

  • tournament_size : integer, optional (default=20)

    每次进化子代时保留的亲代中树的个数

  • stopping_criteria : float, optional (default=0.0)

    停止标准(最低拟合度)

  • const_range : tuple of two floats, or None, optional (default=(-1., 1.))

    常数取值范围

  • init_depth : tuple of two ints, optional (default=(2, 6))

    深度范围

  • init_method : str, optional (default=‘half and half’)

    生成树的方式

  • function_set : iterable, optional (default=(‘add’, ‘sub’, ‘mul’, ‘div’))

    基础函数集

  • transformer

    将程序输出转换为概率的函数

  • metric : str, optional (default=‘mean absolute error’)

    拟合度指标

  • parsimony_coefficient : float or “auto”, optional (default=0.001)

    节俭(惩罚)系数

  • p_crossover : float, optional (default=0.9)

    交叉变换的概率

  • p_subtree_mutation : float, optional (default=0.01)

    子树变异的概率

  • p_hoist_mutation hoist : float, optional (default=0.01)

    变异的概率

  • p_point_mutation : float, optional (default=0.01)

    发生点变异的概率

  • p_point_replace : float, optional (default=0.05)

    每个点变异的概率

  • max_samples : float, optional (default=1.0)

  • class_weight

  • feature_names : list, optional (default=None)

    变量名称

  • warm_start : bool, optional (default=False)

  • low_memory : bool, optional (default=False)

    低内存限制

  • n_jobs : integer, optional (default=1)

    并行计算进程数(Parallel参数)

  • verbose : int, optional (default=0)

    并行计算结果输出方式(Parallel参数)

  • random_state : int, RandomState instance or None, optional (default=None)

    随机数生成器

_verbose_reporter

params: self, run_details=None

打印每一代进化的信息。包括迭代次数、平均长度、平均拟合度、最大长度、最高拟合度、样本外拟合度、运行时间。

fit

params: self, X, y, sample_weight=None

拟合样本。此方法为这个类的主要部分,参数包括X,y以及可选的样本权重。此方法的主要部分是检验各参数及数据的类型,以保证可以正常拟合,或根据不同需求(分类/回归)创建、校验所需参数。

校验完成后,首先生成一个空的列表作为_programs属性,存储每代数据,每次迭代生成下代数据时将上一代的样本分给不同的cpu,通过joblib包的Parallel并行调用_parallel_evolve()方法完成进化。

2.3 其他

接下来在类BaseSymbolic的基础上定义了SymbolicRegressor, SymbolicClassifier, SymbolicTransformer,分别用于回归、分类及特征工程(转化原有的特征、输出新的特征)。这里不进行详细展开了,因为这部分和我们的目标不符,是需要重新写的。


3 gplearn.funtions

gplearn.functions module contains all of the functions used by gplearn programs. It also contains helper methods for a user to define their own custom functions.

这个文件用于定义函数类_Function,以及构造(校验)一个函数的方法,并定义了一些内置函数。

3.1 class _Function

这个类很简单,初始化时需要的是函数function、函数名name以及函数的参数个数arities。此外,重写了__call__函数,使实例对象也将成为一个可调用对象,返回self.function(*args)。

可以简单地理解,就是给一个函数加了name和arities两个属性(可以这么理解,但这其实是不对的)。

3.2 function make_funtion

params: function, name, arity, wrap=True

这个方法是用来构造函数的,加入了一些校验。如果你确保你自己定义的函数没问题的话,这方法意义不大,可以不用。

3.3 自定义函数

GPlearn定义了一些内置函数,双参数的有加、减、乘、除、最大、最小,单参数的有开方、对数、相反数、倒数、绝对值、激活函数、以及3个基本三角函数(正弦、余弦、正切)。

其中除了除法、开方、对数、倒数、激活函数,全部直接用的是numpy的内置方法。除法为了避免出现过大的结果,对分母绝对值小于0.001的结果直接设为1;开方为了避免出现负数无法计算统一采用的是绝对值的开方;而计算对数的时候,同时考虑了上两种情况,对绝对值小于0.001的结果直接设为0,其余则计算绝对值的对数;倒数同样,对绝对值小于0.001的结果直接设为0,其余正常计算。

此外,激活函数则定义为 1/(1+np.exp(-x1))。


4 其他

除_program、genetic、functions外,GPlean还包含fitness、utils两个文件。其中utils包含了几个实用的工具,用在前面讲过的类和方法中,不一一讲了;fitness则定义了_Fitness类,由于我们的目标是挖掘因子,这些传统的拟合度指标无法满足需求,而是需要写一个简单的回测系统,这部分我会在第三部分中展开。


相关文章
利用遗传算法进行高频因子挖掘(一)
利用遗传算法进行高频因子挖掘(二)
利用遗传算法进行高频因子挖掘(三)
利用遗传算法进行高频因子挖掘(四)

利用遗传算法进行高频因子挖掘(一)相关推荐

  1. 利用遗传算法进行高频因子挖掘(二)

    文章目录 自定义函数 1 修改类_Function 2 自定义时间序列函数 3 TA-Lib函数 3.1 非固定参数函数 3.2 固定参数函数 4 定义函数集 5 总结和展望 自定义函数 参考研报:1 ...

  2. 当深度学习遇上量化交易——因子挖掘篇

    ©PaperWeekly 原创 · 作者|桑运鑫 学校|上海交通大学博士生 研究方向|图神经网络在金融领域的应用 在深度学习的所有应用场景中,股价预测也无疑是其中一个异常诱人的场景.随着传统线性模型的 ...

  3. 如何利用遗传算法进行自变量降维(代码部分)

    如何利用遗传算法进行自变量降维(代码部分) main.m 主函数 输入自变量优化适应度子函数 fitness.m 输入自变量优化编码解码子函数 de_code.m BP网络权值和阈值优化适应度子函数 ...

  4. 如何利用遗传算法进行自变量降维

    如何利用遗传算法进行自变量降维 GAOT工具箱下载地址:http://download.csdn.net/download/lsgo_myp/9721624 乳腺癌数据集下载地址:http://dow ...

  5. 高频因子在股票中的表现

    引  言 随着大数据时代的来临,高频交易在股票市场的应用越来越广泛,日内交易数据也给我们带来了更多可供投资参考的信息.因此本文从收益率分布.成交量分布.价量复合.资金流和日内动量五个方面构造众多高频因 ...

  6. 基于遗传算法的电动汽车有序充电优化调度 利用遗传算法对电动汽车有序充电进行优化;优化目标包括充电费用最低,电动汽车充到足够的电,负荷峰谷差最小

    基于遗传算法的电动汽车有序充电优化调度 软件:Matlab 利用遗传算法对电动汽车有序充电进行优化:优化目标包括充电费用最低,电动汽车充到足够的电,负荷峰谷差最小. 分别利用传统.精英和变异遗传算法进 ...

  7. 利用机器学习拟合复杂函数,并利用遗传算法求最优解

    利用机器学习拟合复杂函数,并利用遗传算法求最优解 编程语言:Python 利用工具:sklearn.keras.geatpy 步骤原理简述: 1.利用机器学习到数据集的多维特征和输出的拟合函数关系(模 ...

  8. 利用Tushare进行股票因子计算

    利用Tushare进行股票因子计算 开发背景 一.获取沪深300成分股 1. 获取全部股票代码 2. 获取沪深300成分股代码 3. 根据沪深300股票代码,提取对应的ts代码 4. 根据ts代码获取 ...

  9. 利用遗传算法求解函数极值

    1.利用遗传算法求解函数极值 例1 利用遗传算法求函数 f(x) = 11sin(6x) + 7cos(5x),x∈[- π,π]的最大值点. 解:在MATLAB中编制绘制函数曲线的代码,运行得到题中 ...

最新文章

  1. mysql经纬度转距离_Mysql 拿指定经纬度与数据库多条经纬度进行距离计算 (转)
  2. LiveVideoStack Meet | 苏州:视频会议研发中心一日游
  3. mysql 唯一约束 多字段_mysql多字段唯一约束
  4. DefaultNetworkCredentials vs DefaultCredentials
  5. 一列对应右侧几行html,css查找表格第几行第几列
  6. 【转】艺术设计、数字媒体、环艺、影视动画、摄影、广编专业…等…视频、教程、资讯、图库、作品汇总大全...
  7. LINUX下载编译nginx
  8. Win10操作系统备份与恢复篇·Windows10操作系统如何使用微PE实现备份与恢复
  9. STM32F103学习笔记(7)——ISP串口下载程序
  10. 定义函数和更多形式(基础篇)
  11. 虾皮有哪些站点?各站点有什么特色
  12. 如何有效防止PHP木马对网站提权
  13. 循环双链表的p所指的结点之前插入q所指结点的操作为()
  14. CSS选择符(选择器)
  15. 智慧厕所厕位引导系统怎么建?中期科技zontree智慧公厕一探究竟
  16. 五位大神级人物带你多角度看懂程序化交易
  17. “希希敬敬对”团队作业-敏捷冲刺1
  18. 在英语句子中,哪些词可以做主语
  19. 104-RTKLIB中PPP设计
  20. 腾讯Web前端JX框架入门教程(一)

热门文章

  1. 基于c#的c/s网吧管理系统开发
  2. 计算机组成原理环境配置,计算机组成原理课程设计
  3. android apk 自动编译器,Android APK编译流程
  4. 用友U8与聚水潭系统对接方案(聚水潭主管库存)
  5. python怎么安装setuptools_如何安装setuptools?
  6. 计算机网络水晶头博客,电脑网络:教你一分钟自制高质量网线(含水晶头分类),不求人...
  7. mac数据库操作(忘记密码)
  8. 【APK反编译】漏了个大洞获取资源文件+APK文件的获取、反编译使用方法、下载链接
  9. 智慧环保解决方案-全套
  10. Hint 使用--leading