def setUp(self): self.SymbolTree = SymbolTree self.pset = SymbolSet() from sklearn.datasets import fetch_california_housing data = fetch_california_housing() x = data["data"][:100] y = data["target"][:100] self.x = x self.y = y # self.pset.add_features(x, y, ) self.pset.add_features(x, y, x_group=[[1, 2], [4, 5]]) self.pset.add_constants([6, 3, 4], c_dim=[dless, dless, dless], c_prob=None) self.pset.add_operations(power_categories=(2, 3, 0.5), categories=("Add", "Mul", "Neg", "Abs"), self_categories=None) from sklearn.metrics import r2_score, mean_squared_error self.cp = CalculatePrecisionSet(self.pset, scoring=[r2_score, mean_squared_error], score_pen=[1, -1], dim_type=None, filter_warning=True)
def setUp(self): self.SymbolTree = SymbolTree self.pset = SymbolSet() from sklearn.datasets import load_boston data = load_boston() x = data["data"] y = data["target"] # No = Normalizer() # y=y/max(y) # x = No.fit_transform(x) self.x = x self.y = y # self.pset.add_features(x, y, ) self.pset.add_features(x, y, x_group=[[1, 2], [4, 5]]) self.pset.add_constants([6, 3, 4], c_dim=[dless, dless, dless], c_prob=None) self.pset.add_operations(power_categories=(2, 3, 0.5), categories=("Add", "Mul", "Self", "Abs"), self_categories=None) from sklearn.metrics import r2_score, mean_squared_error self.cp = CalculatePrecisionSet(self.pset, scoring=[r2_score, mean_squared_error], score_pen=[1, -1], filter_warning=True)
# # plt.show() X = q1[:, :-1] y = q1[:, -1] X = np.concatenate((X, (X[:, 1] / X[:, 0]**2).reshape(-1, 1)), axis=1) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=0) store = Store() # symbolset pset0 = SymbolSet() pset0.add_features(X_train, y_train) pset0.add_constants(c=[ 1, ]) pset0.add_operations( power_categories=(2, ), categories=("Add", "exp", "Neg"), ) h_bgp = 3 # stop = None # This random_state is under Linux system. For others system ,the random_state maybe different。 # try with different random_state. stop = lambda ind: ind.fitness.values[0] >= 0.99
import numpy as np import sympy from bgp.base import SymbolSet, SymbolTree from bgp.calculation.translate import general_expr_dict, compile_context if __name__ == "__main__": x = np.full((10, 4), fill_value=0.1) y = np.ones((10, )) height = 2 hbgp = 1 # bgp group = 2 pset = SymbolSet() pset.add_features( x, y, x_group=group, ) pset.add_accumulative_operation(categories=("MAdd", "MMul", "MSub", "MDiv", "Conv", "Self"), special_prob={ "MAdd": 0.16, "MMul": 0.16, "MSub": 0.16, "MDiv": 0.16, "Conv": 0.16, "Self": 0.16 })
def fit(self, X=None, y=None, c=None, x_group=None, x_dim=1, y_dim=1, c_dim=1, x_prob=None, c_prob=None, pset=None, power_categories=(2, 3, 0.5), categories=("Add", "Mul", "Sub", "Div"), warm_start=False, new_gen=None): """ Method 1. fit with x, y. Examples:: sl = SymbolLearning() sl..fit(x,y,...) Method 2. fit with customized pset. If need more self-definition, use one defined SymbolSet object to ``pset``. Examples:: pset = SymbolSet() pset.add_features_and_constants(...) pset.add_operations(...) ... sl = SymbolLearning() sl..fit(pset=pset) Parameters ---------- X:np.ndarray data. y:np.ndarray y. c:list of float, None constants. x_dim: 1 or list of Dim the same size wih x.shape[1], default 1 is dless for all x. y_dim: 1,Dim dim of y. c_dim: 1,list of Dim the same size wih c.shape, default 1 is dless for all c. x_prob: None,list of float the same size wih x.shape[1]. c_prob: None,list of float the same size wih c. x_group:list of list Group of x. Examples: x_group=[[1,2],] or x_group=2 See Also :py:func:`bgp.base.SymbolSet.add_features` power_categories: Sized,tuple, None Examples:(0.5,2,3) categories: tuple of str map table: {"Add": sympy.Add, 'Sub': Sub, 'Mul': sympy.Mul, 'Div': Div} {"sin": sympy.sin, 'cos': sympy.cos, 'exp': sympy.exp, 'ln': sympy.ln, {'Abs': sympy.Abs, "Neg": functools.partial(sympy.Mul, -1.0), "Rec": functools.partial(sympy.Pow, e=-1.0)} Others: \n "Rem": f(x)=1-x,if x true \n "Self": f(x)=x,if x true \n pset:SymbolSet See Also SymbolSet. warm_start: bool warm start or not. Note: If you offer pset in advance by user, please check carefully the feature numbers,especially when use ``re_Tree``. because the new features are add. Reference: CalculatePrecisionSet.update_with_X_y. new_gen: None,int warm_start generation. """ # try to find pest form args,kwargs psets = [i for i in self.args if isinstance(i, SymbolSet)] if len(psets) > 0: self.args.remove(psets[0]) if "pset" in self.kwargs: psets.append(self.kwargs["pset"]) del self.kwargs["pset"] if pset is None: if len(psets) > 0: pset = psets[0] if pset is None: # one simple pset are generate with no dimension calculation, But just with x_group.\n if X is not None and y is not None: pset = SymbolSet() pset.add_features_and_constants(X, y, c, x_dim=x_dim, y_dim=y_dim, c_dim=c_dim, x_prob=x_prob, c_prob=c_prob, x_group=x_group, feature_name=None) pset.add_operations(power_categories=power_categories, categories=categories) elif hasattr(self.loop, "gen"): pass else: raise ValueError( "The pset should be defined or the X and Y should be offered." ) #################################### if warm_start: assert hasattr( self.loop, "gen"), "Before the warm_start, Need fit at least one time" if X is not None and y is not None: self.loop.cpset.update_with_X_y(X, y) elif pset: # the warm_start are not compacting with "re_Tree" self.loop.cpset.update(pset) else: raise ValueError( "The pset should be defined or the X and Y should be offered." ) self.loop.re_fresh_by_name() hall = self.loop.run(warm_start=True, new_gen=new_gen) else: if hasattr(self.loop, "gen"): loops = self.loop.__class__ self.loop = loops(pset, *self.args, **self.kwargs) else: self.loop = self.loop(pset, *self.args, **self.kwargs) hall = self.loop.run() self.best_one = hall.items[0] try: expr = general_expr(self.best_one.coef_expr, self.loop.cpset) self.expr_type = "single" except (RecursionError, RuntimeWarning): expr = self.best_one.coef_expr self.expr_type = "group" self.expr = expr self.y_dim = self.best_one.y_dim self.fitness = self.best_one.fitness.values[0]