【问题标题】:how to pass additional parameters to lgbm custom loss function?如何将附加参数传递给 lgbm 自定义损失函数?
【发布时间】:2020-12-03 13:50:18
【问题描述】:

我已经通过以下方式编写了 rmsse 自定义损失函数

def wrmsse(preds, y_true,store_name):
    '''
    preds - Predictions: pd.DataFrame of size (30490 rows, N day columns)
    y_true - True values: pd.DataFrame of size (30490 rows, N day columns)
    sequence_length - np.array of size (42840,)
    sales_weight - sales weights based on last 28 days: np.array (42840,)
    '''
    preds = preds[-(30490 * 28):]
    y_true = y_true.get_label()[-(30490 * 30490):]
    preds = preds.reshape(28, 30490).T
    y_true = y_true.reshape(28, 30490).T    
    sw = list(SW_store.keys())[key]
    return 'wrmsse', np.sum(np.sqrt(np.mean(np.square(rollup(preds-y_true)),axis=1)) * sw)/12,False #<-used 

我正在像下面这样训练模态

model = 

store_name = 'CA_1    lgbm.train(params,train_set=train_set,num_boost_round=2500,early_stopping_rounds=50,valid_sets=val_set,verbose_eval = 100, feval= wrmsse)

我想将商店名称作为参数传递,我该怎么做?

【问题讨论】:

    标签: python-3.x machine-learning decision-tree lightgbm ensemble-learning


    【解决方案1】:

    您可以通过将您的自定义 ndarray 附加到数据集来做到这一点,

    例如,在您声明数据集后设置自定义类属性,

    dtrain = lgb.Dataset(X_train, y_train, feature_name =feature_names, categorical_feature=categorical_feature, free_raw_data=False)
    dval = lgb.Dataset(X_val, y_val, reference=dtrain, feature_name =feature_names, categorical_feature=categorical_feature, free_raw_data=False)
    
    dtrain.indexes = np.arange(0, X_train.shape[0])
    dval.indexes =  np.arange(0, X_val.shape[0])
    

    这里的索引是我想在度量中使用的自定义数组,

    然后,在您的度量函数中将您的自定义数组作为闭包传递并使用索引访问它们,

    def utility_score(weight, resp, date_):   
        def func(preds, train_data):
            score = 0.
            labels = train_data.get_label()
            indexes = train_data.indexes
            y_pred = preds.reshape(-1, 1)
    
            weight_ = weight[indexes, :]
            resp_ = resp[indexes, :]
            date__ = date_[indexes, :]
           
            # do whatever with ur custom vars and calculate score....
            
            return 'utility', score, True
        return func
    

    这样使用,

    feval=utility_score(weight, resp, date_)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-22
      • 2021-06-09
      • 2013-11-06
      • 2013-06-03
      • 1970-01-01
      • 2016-04-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多