机器学习排程组合优化

用网格搜索去实现Q_learning的超参数设置,但是数据没有测试集和训练集的划分

用随机子采样交叉验证评估下你现在模型的性能,超参数组合的性能指标可以用多个个验证集性能的平均值来实现

  • 这篇文章:强化学习 # Q-Learning算法 也许能够解决你的问题,你可以看下
  • 除此之外, 这篇博客: Q-learning算法实战中的 4、设置参数 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 到这里所有qlearning模块就算完成了,下面需要设置一些参数,方便大家“炼丹”,其中默认的是笔者已经调好的~。另外为了定义了一个画图函数,用来描述奖励的变化。

    import datetime
    import argparse
    import matplotlib.pyplot as plt
    import seaborn as sns
    def get_args():
        """ 
        """
        curr_time = datetime.datetime.now().strftime("%Y%m%d-%H%M%S")  # 获取当前时间
        parser = argparse.ArgumentParser(description="hyperparameters")      
        parser.add_argument('--algo_name',default='Q-learning',type=str,help="name of algorithm")
        parser.add_argument('--env_name',default='CliffWalking-v0',type=str,help="name of environment")
        parser.add_argument('--train_eps',default=400,type=int,help="episodes of training") # 训练的回合数
        parser.add_argument('--test_eps',default=20,type=int,help="episodes of testing") # 测试的回合数
        parser.add_argument('--gamma',default=0.90,type=float,help="discounted factor") # 折扣因子
        parser.add_argument('--epsilon_start',default=0.95,type=float,help="initial value of epsilon") #  e-greedy策略中初始epsilon
        parser.add_argument('--epsilon_end',default=0.01,type=float,help="final value of epsilon") # e-greedy策略中的终止epsilon
        parser.add_argument('--epsilon_decay',default=300,type=int,help="decay rate of epsilon") # e-greedy策略中epsilon的衰减率
        parser.add_argument('--lr',default=0.1,type=float,help="learning rate")
        parser.add_argument('--device',default='cpu',type=str,help="cpu or cuda")                
        args = parser.parse_args([])                          
        return args
    curr_time = datetime.datetime.now().strftime("%Y%m%d-%H%M%S") # 获取当前时间
    
    def smooth(data, weight=0.9):  
        '''用于平滑曲线,类似于Tensorboard中的smooth
    
        Args:
            data (List):输入数据
            weight (Float): 平滑权重,处于0-1之间,数值越高说明越平滑,一般取0.9
    
        Returns:
            smoothed (List): 平滑后的数据
        '''
        last = data[0]  # First value in the plot (first timestep)
        smoothed = list()
        for point in data:
            smoothed_val = last * weight + (1 - weight) * point  # 计算平滑值
            smoothed.append(smoothed_val)                    
            last = smoothed_val                                
        return smoothed
    
    def plot_rewards(rewards,cfg, tag='train'):
        sns.set()
        plt.figure()  # 创建一个图形实例,方便同时多画几个图
        plt.title("learning curve on {} of {} for {}".format(
            cfg.device, cfg.algo_name, cfg.env_name))
        plt.xlabel('epsiodes')
        plt.plot(rewards, label='rewards')
        plt.plot(smooth(rewards), label='smoothed')
        plt.legend()
        plt.show()
    
  • 您还可以看一下 刘湘宇老师的机器学习-Q-Learning-沙鼠走迷宫视频教学课程中的 沙鼠走迷宫小节, 巩固相关知识点