コード例 #1
0
class Experiment():
    def __init__(self, _type, bandits, agent, runs, exp_nums, logdir, k_vec,
                 k_probs):
        self._type = _type
        self.esr_vector = []
        self.esr_probs = []
        self.f1_score = []
        self.f1 = []
        #self.plotter = Plotter()
        self.metrics = Metrics()
        self.k_vec = k_vec
        self.k_probs = k_probs
        self.f1_df = pd.DataFrame()
        self.esrBandit = Agent(0, 10)
        self.logdir = logdir

        for i in range(len(k_vec)):
            self.esrBandit.manual_distribution(k_vec[i], k_probs[i])

        if self._type == "bandit":
            self.bandits = bandits
            self.agent = agent
            self.runs = runs
            self.exp_nums = exp_nums

    def run(self):
        if self._type == "bandit":
            avg_log = self.logdir + 'average' + '/'
            if not os.path.exists(avg_log):
                os.makedirs(avg_log, exist_ok=True)

            for run in range(self.runs):
                self.run_df = pd.DataFrame()
                start = time.perf_counter()
                run_log = self.logdir + 'run_' + str(run + 1) + '/'

                if not os.path.exists(run_log):
                    os.makedirs(run_log, exist_ok=True)

                for i in range(self.exp_nums):
                    self.esr_vector = []
                    self.esr_probs = []
                    if i == 0:
                        for j in range(len(self.bandits)):
                            _return_ = self.bandits[j].pull_arm()
                            self.agent.update(j, _return_)

                    action = self.agent.select_action()
                    _return_ = self.bandits[action].pull_arm()
                    self.agent.update(action, _return_)
                    esr_index = self.agent.esr_dominance()

                    self.esr_agent = deepcopy(self.agent)
                    self.esr_agent.distribution = np.array(
                        self.esr_agent.distribution)[esr_index]

                    for val in esr_index:
                        self.esr_vector.append(
                            self.agent.distribution[val].get_distribution()[0])
                        self.esr_probs.append(
                            self.agent.distribution[val].get_distribution()[1])

                    #self.f1.append(self.metrics.precision_recall(self.esr_vector, self.esr_probs, self.k_vec, self.k_probs))
                    self.f1.append(
                        self.metrics.pr_kl(self.esr_agent, self.esrBandit))

                self.run_df['run' + str(run)] = self.f1
                self.run_df['mean'] = self.run_df.mean(axis=1)
                self.f1_df['run' + str(run)] = self.f1
                end = time.perf_counter()

                #self.run_df['average'] = self.f1_df.mean(axis=1)
                #print(self.f1_df)
                #self.f1_score = self.f1_df['Average']
                #self.run_df['average'] = np.mean(np.array(self.f1_score).reshape(-1, 10), axis=1)
                self.run_df.to_csv(run_log + "/f1_score.csv", index=False)

                ser = SER(self.k_vec, self.k_probs)
                ser_expectations = ser.expectations()
                ser_pareto_front = ser.pareto_front()

                print("")
                print(
                    '**** Run ' + str(run + 1) + ' - Execution Time: ' +
                    str(round((end - start), 2)) + ' seconds ****', )
                print(str(len(esr_index)) + " distributions in the ESR set")
                print("ESR Vector and Probabilities")
                for a in range(len(self.esr_vector)):
                    print(self.esr_vector[a])
                    print(self.esr_probs[a])
                    print(" ")
                print("")
                print("SER - Pareto Front")
                print("Number of policies on the pareto front : " +
                      str(len(ser_pareto_front)))
                print(ser_pareto_front)
                print("")

                self.plotter = Plotter(self.esr_vector, self.esr_probs,
                                       run_log, self.exp_nums, True, True)
                self.plotter.plot_run()

            self.f1_df['mean'] = self.f1_df.mean(axis=1)
            #self.f1_df['average'] = np.mean(np.array(self.f1_df['mean']).reshape(-1, 10), axis=1)
            self.f1_df.to_csv(avg_log + "/f1_score.csv", index=False)
            self.plotter = Plotter(self.esr_vector, self.esr_probs, avg_log,
                                   self.exp_nums, True, True)
            self.plotter.plot_run()

        return