文章目录
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类,由于我们的目标是挖掘因子,这些传统的拟合度指标无法满足需求,而是需要写一个简单的回测系统,这部分我会在第三部分中展开。
相关文章
利用遗传算法进行高频因子挖掘(一)
利用遗传算法进行高频因子挖掘(二)
利用遗传算法进行高频因子挖掘(三)
利用遗传算法进行高频因子挖掘(四)