Exemplo n.º 1
0
    def pre_train_person(self, dataset_in):

        if len(OptPars.parsPerPers.keys()) <= 1:
            parameterDict = open(str(Path(__file__).absolute()).split('models')[0] + 'models/pars_other.txt', 'r').read()
            OptPars.parsPerPers = eval(parameterDict)

        if self.name in OptPars.parsPerPers.keys() and dataset_in[0]['item'].identifier in OptPars.parsPerPers[self.name].keys():
            commandlist = OptPars.parsPerPers[self.name][dataset_in[0]['item'].identifier]
        else:
            #print('pre_train_person for model', self.name, 'person', str(dataset_in[0]['item'].identifier))
            dataset = []
            for a in dataset_in:
                a['aux']['id'] = a['item'].identifier
                for k in a['aux'].keys():
                    a[k] = a['aux'][k]
                dataset.append(a)
            #Optimpizing paramaters per person 
            trialList = dataset
            if len(self.parameter.keys()) > 0:
                with np.errstate(divide='ignore'):
                    bounds = [(-5,5)*len(self.parameter.keys())]
                    bounded_step = RandomDisplacementBounds(np.array([b[0] for b in bounds]), np.array([b[1] for b in bounds]))
                    personOptimum = basinhopping(self.itemsOnePersonThisModelPeformance, [1/len(self.parameter.keys())] * len(self.parameter.keys()), T=OptPars.T, take_step= bounded_step, niter= OptPars.iterations, minimizer_kwargs ={'args':tuple([trialList]), "method":"L-BFGS-B"})
                optpars = personOptimum.x
            else: 
                optpars = [] 
            commandlist = self.toCommandList(optpars)
            if self.name not in OptPars.parsPerPers.keys():
                OptPars.parsPerPers[self.name] = {}
            OptPars.parsPerPers[self.name][dataset[0]['item'].identifier] = commandlist
        self.executeCommands(commandlist)
Exemplo n.º 2
0
    def fitTreeOnTrials(self, trialList, maxLength=-1, person='global'):


        if self.name in OptPars.parsPerPers.keys() and 'global' in OptPars.parsPerPers[self.name].keys():
            predictionQuality, predictionMargin = OptPars.parsPerPers[self.name]['global']
        else:
            maxLength = -1
            predictionQuality = {}
            predictionMargin = {}
            for a in self.componentKeys:
                print(a, 'start')
                bounds = [(0,5)]
                bounded_step = RandomDisplacementBounds(np.array([b[0] for b in bounds]), np.array([b[1] for b in bounds]))
                marginOptimum = basinhopping(parametrizedPredictiveQualityLT, [0.00], niter=OptPars.iterationsFFT, T=OptPars.Tfft, minimizer_kwargs={"args" : (a,trialList), "tol":0.001}, take_step=bounded_step ,disp=0)
                predictionMargin['>' + a] = marginOptimum.x[0]
                predictionQuality['>' + a] = marginOptimum.fun
                bounded_step = RandomDisplacementBounds(np.array([b[0] for b in bounds]), np.array([b[1] for b in bounds]))
                marginOptimum = basinhopping(parametrizedPredictiveQualityST, [0.00], niter=OptPars.iterationsFFT, T=OptPars.Tfft, minimizer_kwargs={"args" : (a,trialList), "tol":0.001}, take_step=bounded_step ,disp=0)
                predictionMargin['<' + a] = marginOptimum.x[0]
                predictionQuality['<' + a] = marginOptimum.fun
                print(a, 'done')
        #print(predictionQuality, predictionMargin)
        """
        predictionQuality, predictionMargin = {'>Familiarity_All_Combined': -0.8410767696909273, '<Familiarity_All_Combined': -0.5000443807615739, '>Familiarity_Party_Combined': -0.5000443807615739, '<Familiarity_Party_Combined': -0.9664594097556704, '>Partisanship_All_Combined': -0.5000443807615739, '<Partisanship_All_Combined': -0.9999223361292326, '>Partisanship_Party_Combined': -0.9997072599531616, '<Partisanship_Party_Combined': -0.9994490358126722, '>ct': -0.5000443807615739, '<ct': -0.5001166656944526, '>crt': -0.5000443807615739, '<crt': -0.5001090631475624, '>conservatism': -0.5000571820677036, '<conservatism': -0.5001256913021619, '>education': -0.4999429390208336, '<education': -0.5000868340312217, '>reaction_time': -0.5093220338983051, '<reaction_time': -0.5076076400129492}, {'>Familiarity_All_Combined': 0.2662379350081123, '<Familiarity_All_Combined': 0.0, '>Familiarity_Party_Combined': 4.05274531649115, '<Familiarity_Party_Combined': 2.448674318414391, '>Partisanship_All_Combined': 1.4122760569170363, '<Partisanship_All_Combined': 0.5737368357677288, '>Partisanship_Party_Combined': 2.0476830032419393, '<Partisanship_Party_Combined': 4.273745057197547, '>ct': 2.8458550307470336, '<ct': 1.481851582882988, '>crt': 1.8162947794087823, '<crt': 0.7326754642188853, '>conservatism': 3.3754317937159497, '<conservatism': 1.2782228082177964, '>education': 0.0, '<education': 3.525825279351599, '>reaction_time': 1.6138534997640843, '<reaction_time': 3.6593770894646194}
        """

        if self.name not in OptPars.parsPerPers.keys():
            OptPars.parsPerPers[self.name] = {}
        OptPars.parsPerPers[self.name]['global'] = predictionQuality, predictionMargin



        orderedConditionsPos = []
        orderedConditionsNeg = []
        for a in sorted(predictionQuality.items(), key=lambda x: x[1], reverse=False):
            b = a[0][1:]
            s = a[0][0]
            #cond = 'item[\'' + b + '\') ' + s + ' ' + str(predictionMargin[a[0]])
            rep0preds, rep1preds, length0, length1 = predictiveQuality_withoutnode(b, s, predictionMargin[a[0]], trialList)
            if rep1preds/length1 >= rep0preds/length0:
                if a[0][1:] not in [i[1:] for i in orderedConditionsPos + orderedConditionsNeg] and a[0][1:] in self.componentKeys:
                    orderedConditionsPos.append(a[0])
            else:
                if a[0][1:] not in [i[1:] for i in orderedConditionsNeg +orderedConditionsPos] and a[0][1:] in self.componentKeys:
                    orderedConditionsNeg.append(a[0])
        orderedConditions = []
        for i in range(max(len(orderedConditionsNeg), len(orderedConditionsPos))):
            if len(orderedConditionsPos) > i:
                orderedConditions.append(orderedConditionsPos[i])
            if len(orderedConditionsNeg) > i:
                orderedConditions.append(orderedConditionsNeg[i])
        exitLeft = False
        for sa in orderedConditions[:maxLength] if maxLength > 0 else orderedConditions:
            b = sa[1:]
            s = sa[0]
            #print('item[\'', b, '\'] ', s, ' ', str(predictionMargin[sa]), str(predictionQuality[sa]))
            cond = '' if not exitLeft else 'not '
            cond += 'item[\'' + b + '\'] ' + s + ' ' + str(predictionMargin[sa])
            newnode = Node(cond,True,False)
            if self.fft == None:
                self.fft = newnode
                self.lastnode = self.fft
                self.fft.length = 1
            else:
                self.fft.length += 1
                if not exitLeft:
                    self.lastnode.left = newnode
                    self.lastnode = self.lastnode.left
                else:
                    self.lastnode.right = newnode
                    self.lastnode = self.lastnode.right
            exitLeft = not exitLeft
        FFTtool.ZigZag = self.fft
        print(FFTtool.ZigZag.getstring())