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


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包学习


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类,由于我们的目标是挖掘因子,这些传统的拟合度指标无法满足需求,而是需要写一个简单的回测系统,这部分我会在第三部分中展开。


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

  • 10
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值