2015-09-04 18 views
0

我對我的一個研究項目使用DEAP的implementation of genetic programming在DEAP中實現對大熊貓數據框起作用的GP

我想創建一個工作在大熊貓DataFrame上的GP:每個原語都是一個自定義函數,它將DataFrame作爲輸入並返回一個DataFrame作爲輸出。同樣,終端可以是全1或全0的DataFrame。

的原語中的一個的一個簡單的例子可以是(注意,這是僞-ISH):

def add_5(input_df): 
    return input_df + 5 

pset.addPrimitive(add_5) 

和示例終端可以是:

pset.addTerminal(pd.DataFrame(np.ones(500)) 

這可能與DEAP ?代碼是什麼樣的?我不斷收到NoneType來自終端的錯誤。

回答

0

我能夠與幫助從DEAP開發商來解決這一問題。對於那些發現自己處於我的位置的人,下面是DEAP GP算法的一些工作代碼,它將DataFrame的兩列中的值優化爲0.示例問題顯然微不足道,毫無用處;它意味着一個在DataFrame上工作的DEAP的直接例子。

import operator 
import math 
import random 

import numpy as np 
import pandas as pd 

from deap import algorithms 
from deap import base 
from deap import creator 
from deap import tools 
from deap import gp 

def add_5(input_df): 
    return input_df + 5. 

def subtract_5(input_df): 
    return input_df - 5. 

def multiply_5(input_df): 
    return input_df * 5. 

def divide_5(input_df): 
    return input_df/5. 


pset = gp.PrimitiveSet('MAIN', 1) 
pset.addPrimitive(add_5, 1) 
pset.addPrimitive(subtract_5, 1) 
pset.addPrimitive(multiply_5, 1) 
pset.addPrimitive(divide_5, 1) 

creator.create('FitnessMin', base.Fitness, weights=(-1.0,)) 
creator.create('Individual', gp.PrimitiveTree, fitness=creator.FitnessMin) 

toolbox = base.Toolbox() 
toolbox.register('expr', gp.genHalfAndHalf, pset=pset, min_=1, max_=2) 
toolbox.register('individual', tools.initIterate, creator.Individual, toolbox.expr) 
toolbox.register('population', tools.initRepeat, list, toolbox.individual) 
toolbox.register('compile', gp.compile, pset=pset) 

def evalSymbReg(individual, points): 
    # Transform the tree expression in a callable function 
    func = toolbox.compile(expr=individual) 
    result = func(points) 
    return abs(result.column1.sum() + result.column2.sum()), 

toolbox.register('evaluate', evalSymbReg, points=pd.DataFrame({'column1': [125] * 500, 'column2': [125] * 500})) 
toolbox.register('select', tools.selTournament, tournsize=3) 
toolbox.register('mate', gp.cxOnePoint) 
toolbox.register('expr_mut', gp.genFull, min_=0, max_=2) 
toolbox.register('mutate', gp.mutUniform, expr=toolbox.expr_mut, pset=pset) 


if __name__ == '__main__': 
    pop = toolbox.population(n=100) 
    hof = tools.HallOfFame(1) 
    stats = tools.Statistics(lambda ind: ind.fitness.values) 
    stats.register('avg', np.mean) 
    stats.register('min', np.min) 
    stats.register('max', np.max) 
    pop, log = algorithms.eaSimple(pop, toolbox, 0.5, 0.1, 20, stats=stats, halloffame=hof) 
0

你是否使用強類型的gp in deap?定義primatives

的類型這裏有一個很好的示例代碼

http://deap.readthedocs.org/en/latest/tutorials/advanced/gp.html#strongly-typed-gp

+0

我在DEAP中有一個早期的強類型GP的實現,但這似乎沒有幫助這種情況。 –

+0

只看你的原始示例應該不是' pset.addPrimitive(add_5,1)' – user656541

+0

是的,它真的只是僞代碼。我想我正在尋找一個熊貓DataFrames的工作示例 - 它不必遵循我的示例。 –