美文网首页
NNI的学习及简单示例

NNI的学习及简单示例

作者: zcyzcy | 来源:发表于2019-01-25 11:45 被阅读0次

    NNI

    NNI是微软发布的一款AutoML工具,可以辅助算法工程师对现有模型进行自动调参。这篇博客总结下NNI的简单使用,并以Kaggle中的Titanic: Machine Learning from Disaster 竞赛为示例,演示如何使用NNI。

    NNI的核心概念

    • Trial,是对模型上一系列参数的一次尝试。可以理解为,在给定参数下的一次训练。
    • Tunner,实现了Tunner API,用于指定参数搜索算法。
    • Assessor,实现了Assessor API,用于设定提前结束一次Trial的策略。可以减少寻参时间。

    NNI的使用流程

    NNI的使用分三步走:


    NNI流程
    1. 定义参数空间
      我们需要告诉NNI哪些超参数要进行搜索,并且搜索的范围在哪里。定义好空间后,NNI会在给定的参数空间中进行搜索。
    2. 改写模型代码
      在原有的模型代码上进行改写,引入NNI的代码,使得NNI可以执行模型代码获取不同参数值组合下的模型执行结果。
    3. 定义实验
      在配置文件中定义好配置,包括作者名字实验名字训练次数模型代码位置参数空间配置文件位置Tunner算法Assessor算法 等等。
      在完成以上步骤之后,执行
      nni create --config config.yml

    NNI会启动一个restful服务,并将测试的情况可视化展示在网页界面上。

    NNI示例

    结合Kaggle中的Titanic: Machine Learning from Disaster 竞赛来实现我们的NNI自动参数搜索。

    1. 定义参数空间
      这是一个search_space.json文件
    {
        "learning_rate": {"_type":"uniform","_value":[0.01, 0.2]},
        "max_depth": {"_type":"choice","_value":[3,4,5,6]},
        "subsample": {"_type":"uniform","_value":[0.5, 1]},
        "colsample_btree": {"_type":"uniform", "_value":[0.5, 1]}
    }
    

    参数空间以json的形式进行配置。key是参数名,value是参数空间设定。value本身又是一个json对象,其中的_type指定参数的类型,_value指定参数的取值。由上图,我们可以看到对参数learning_rate指定的类型是“_type”:"uniform",即指定该参数的取值是连续的,且取值在[0.01, 0.2]之间。而参数max_depth的取值则是离散的,在3,4,5,6中取值。
    更多的参数空间定义可以参考这里.

    1. 改写模型代码
      在原始的模型代码上加入NNI代码。代码省略数据预处理特征工程堆栈混合部分。参考了Kaggle Kernels中的代码点击查看
      这是一个nni_stack_xgb.json文件
    import pandas as pd
    import nni
    from sklearn.model_selection import cross_val_score
    import xgboost as xgb
    from sklearn.model_selection import KFold
    import pickle
    
    x_train = pickle.load(open("./data/x_train", 'rb'))
    x_test = pickle.load(open("./data/x_test", 'rb'))
    
    test = pd.read_csv("./data/test.csv")
    train = pd.read_csv("./data/train.csv")
    
    passengerId = test['PassengerId']
    y_train = train['Survived'].ravel()
    
    # 获取默认参数
    def get_default_parameters():
         params = {
              'learning_rate': 0.02,
              'n_estimators': 2000,
              'max_depth': 4,
              'min_child_weight':2,
              'gamma':0.9,
              'subsample':0.8,
              'colsample_bytree':0.8,
              'objective':'binary:logistic',
              'nthread':-1,
              'scale_pos_weight':1
         }
         return params
    
    # 获取模型
    def get_model(PARAMS):
         model = xgb.XGBClassifier()
         model.learning_rate = PARAMS.get("learning_rate")
         model.max_depth = PARAMS.get("max_depth")
         model.subsample = PARAMS.get("subsample")
         model.colsample_btree = PARAMS.get("colsample_btree")
         return model
    
    # 运行模型
    kf = KFold(n_splits=5)
    def run(x_train, y_train, model):
         scores = cross_val_score(model, x_train, y_train, cv=kf)
         score = scores.mean()
         nni.report_final_result(score)
    
    if __name__ == '__main__':
         RECEIVED_PARAMS = nni.get_next_parameter()
         PARAMS = get_default_parameters()
         PARAMS.update(RECEIVED_PARAMS)
         model = get_model(PARAMS)
         run(x_train, y_train, model)
    

    在代码中,我们加入了三行

    • 获取不同参数值
    RECEIVED_PARAMS = nni.get_next_parameter() 
    
    • 更新参数
    PARAMS.update(RECEIVED_PARAMS)
    
    • 向NNI报告训练结果
    nni.report_final_result(score)
    

    3.定义实验
    这是一个config.yml文件

    authorName: default
    experimentName: titanic
    trialConcurrency: 1
    maxExecDuration: 1h
    maxTrialNum: 100
    #choice: local, remote
    trainingServicePlatform: local
    searchSpacePath: search_space.json
    #choice: true, false
    useAnnotation: false
    tuner:
      #choice: TPE, Random, Anneal, Evolution
      builtinTunerName: TPE
      classArgs:
        #choice: maximize, minimize
        optimize_mode: maximize
    trial:
      command: python3 nni_stack_xgb.py
      codeDir: .
      gpuNum: 0
    
    1. 运行NNI
      执行下面命令
      nnictl create --config ./config.yml --port 8083
      我们可以在UI界面上清楚看到寻参的结果。
    All Trials

    参考资料

    Introduction to Ensembling/Stacking in Python

    Github Microsoft NNI

    相关文章

      网友评论

          本文标题:NNI的学习及简单示例

          本文链接:https://www.haomeiwen.com/subject/pjapjqtx.html