代码之家  ›  专栏  ›  技术社区  ›  Giorgio Spedicato

将补充参数传递给hyperopt目标函数

  •  0
  • Giorgio Spedicato  · 技术社区  · 6 年前

    我正在使用python的hyperopt库来执行ml hyperparameters的优化。特别是,我正试图使用此函数找到lightgbm最优超参数,以最小化:

    def lgb_objective_map(params):
    """
    objective function for lightgbm using MAP as success metric.
    """
    
    # hyperopt casts as float
    params['num_boost_round'] = int(params['num_boost_round'])
    params['num_leaves'] = int(params['num_leaves'])
    params['min_data_in_leaf'] = int(params['min_data_in_leaf'])
    
    # need to be passed as parameter
    params['verbose'] = -1
    params['seed'] = 1
    
    # Cross validation
    cv_result = lgb.cv(
    params,
    lgtrain,
    nfold=3,
    metrics='binary_logloss',
    num_boost_round=params['num_boost_round'],
    early_stopping_rounds=20,
    stratified=False,
    )
    
    # Update the number of trees based on the early stopping results
    early_stop_dict[lgb_objective_map.i] = len(cv_result['binary_logloss-mean'])
    params['num_boost_round'] = len(cv_result['binary_logloss-mean'])
    
    # fit and predict
    #model = lgb.LGBMRegressor(**params)
    #model.fit(train,y_train,feature_name=all_cols,categorical_feature=cat_cols)
    model= lgb.train(params=params,train_set=lgtrain)
    preds = model.predict(X_test)
    
    # add a column with predictions and rank
    
    
    result = log_loss(y_test,preds)
    #    actual_predicted 
    actual_predicted = np.sum(y_test)/np.sum(preds)
    
    print("INFO: iteration {} logloss {:.3f} actual on predicted ratio {:.3f}".format(lgb_objective_map.i, 
          result,actual_predicted))
    
    lgb_objective_map.i+=1
    
    return result
    

    hyperopt调用是:

    best = fmin(fn=lgb_objective_map,
            space=lgb_parameter_space,
            algo=tpe.suggest,
            max_evals=200,
            trials=trials)
    

    可以修改 best 调用以便将补充参数传递给 lgb_objective_map 就像 lgbtrain, X_test, y_test ?这将允许泛化对hyperopt的调用。

    0 回复  |  直到 5 年前
        1
  •  0
  •   Moocember    5 年前

    这个 partial 功能来自 functools 提供了一个雄辩的解决方案。

    只需包装函数并添加所需的参数:

    partial(yourFunction,arg_1,arg_2,...,arg_n)
    

    然后把这个传给惠普 fmin 功能。

    下面是一个玩具示例:

    from functools import partial
    from hyperopt import hp,fmin, STATUS_OK
    
    def objective(params, data):
        output = f(**params, data)
        return {'loss': output ,  'status': STATUS_OK}
    
    fmin_objective = partial(objective, data=data)
    
    bestParams = fmin(fn = fmin_objective ,space = params)