【问题标题】:Fastai Regression model with observation weight具有观察权重的 Fastai 回归模型
【发布时间】:2022-08-17 14:48:14
【问题描述】:

每次观察是否有可能有一个带有样本权重的服装均方误差函数?

我能够利用标准的fastai 训练循环,并且能够在PyTorch 中实现这种服装损失。

如何将其放在表格数据上的fastai 学习者对象中?

我知道keras 已经在.fit 方法中实现了这一点,其中sample_weight 参数存在。

def weighted_mse_loss(input, target, weight):
    return torch.sum(weight * (input - target) ** 2)

from fastai.tabular.all import *
import seaborn as sns

df = sns.load_dataset(\'tips\')
df = df.assign(sample_weight = np.random.normal(size = df.shape[0], loc = 10, scale = 2))

y = [\'total_bill\']
cont = [\'tip\']
cat = [\'sex\', \'smoker\', \'day\', \'time\', \'size\']

procs = [Normalize, Categorify]

df[\"Y\"] = np.log(df[y] + 1)

MIN = df[\"Y\"].min()
MAX = df[\"Y\"].max()

splits =  RandomSplitter(valid_pct=0.2)(range_of(df))

to = TabularPandas(
    df,
    procs=procs,
    cat_names=cat,
    cont_names=cont,
    y_names=\"Y\",
    splits=splits,
    y_block=RegressionBlock(n_out = 1),
)

dls = to.dataloaders(
    bs=64, shuffle_train=True
)

config = tabular_config(
        embed_p=0.05, 
        y_range=[0, MAX * 1.1],
        bn_final=False,
        ps=[0.05, 0.05, 0.05],
    )

learner = tabular_learner(
        dls,
        layers=[1000, 500, 250],
        config=config,
        wd=0.2,
        metrics=[rmse,],
    )

learner.fit_one_cycle(40, lr_max = 0.01,
                          wd = 0.1)

    标签: keras pytorch regression fast-ai


    【解决方案1】:

    我正在使用这个解决方法:

    1. 在 TabularPandas 的 y_names 中,您可以将 (weight, y) 的元组返回为 y_names=["sample_weight","Y"]

    2. 在您的损失函数中,将您的目标拆分为(权重,目标)并将权重应用于损失,例如:

       class SampleWeightedCE(torch.nn.modules.loss._Loss):
           def __init__(self):
               super(SampleWeightedCE, self).__init__()
               self.ce_loss = torch.nn.BCEWithLogitsLoss(reduction='none')
      
       def forward(self, output, tgt):       
           weights = tgt[:,0].unsqueeze(1)
           target = tgt[:,1].unsqueeze(1)            
      
           losses = self.ce_loss(output, target) * weights
           return torch.sum(losses) / torch.sum(weights)
      
    3. 如果要衡量指标,可以使用相同的解决方法,例如:

      def accuracy_W(inp, tgt, thresh=0.5, sigmoid=True):
       weights = tgt[:,0].unsqueeze(1)
       target = tgt[:,1].unsqueeze(1)
      
       if sigmoid: inp = inp.sigmoid()    
       classes = (inp >= thresh)
       m_target = (target >= 0.5)
       correct = (m_target == classes) 
       return torch.sum(weights * correct) / torch.sum(weights)  
      
    4. 在get_preds()或predict()中,需要拆分目标

       y_prob, y_out = learn.get_preds(ds_idx=1, with_input=False, with_loss=False, reorder=False)  
       weights = y_out[:,0]
       target = y_out[:,1]
      

    【讨论】:

      猜你喜欢
      • 2016-09-29
      • 1970-01-01
      • 2019-06-04
      • 2012-07-09
      • 1970-01-01
      • 2013-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多