【问题标题】:How to implement sklearns StratifiedKfold with fastai?如何使用 fastai 实现 sklearns StratifiedKfold?
【发布时间】:2019-09-04 03:12:30
【问题描述】:

我参加了 APTOS 2019 kaggle 比赛,我正在尝试 5 折合奏,但我在正确实施 StratifiedKFold 时遇到问题。

我曾尝试用谷歌搜索 fastai 讨论,但没有看到任何解决方案。 我正在使用 fastai 库并且有一个预训练的模型。

def get_df():
    base_image_dir = os.path.join('..', 'input/aptos2019-blindness- 
    detection/')
    train_dir = os.path.join(base_image_dir,'train_images/')
    df = pd.read_csv(os.path.join(base_image_dir, 'train.csv'))
    df['path'] = df['id_code'].map(lambda x: 
    os.path.join(train_dir,'{}.png'.format(x)))
    df = df.drop(columns=['id_code'])
    df = df.sample(frac=1).reset_index(drop=True) #shuffle dataframe
    test_df = pd.read_csv('../input/aptos2019-blindness- 
    detection/sample_submission.csv')
    return df, test_df

df, test_df = get_df()

random_state = np.random.seed(2019)
skf = StratifiedKFold(n_splits=5, random_state=random_state, shuffle=True)

X = df['path']
y = df['diagnosis']

#getting the splits
for train_index, test_index in skf.split(X, y):
   print('##')
   X_train, X_test = X[train_index], X[test_index]
   y_train, y_test = y[train_index], y[test_index]
   train = X_train, y_train
   test = X_test, y_test
   train_list = [list(x) for x in train]
   test_list  = [list(x) for x in test]


data = (ImageList.from_df(df=df,path='./',cols='path') 
    .split_by_rand_pct(0.2) 
    .label_from_df(cols='diagnosis',label_cls=FloatList) 
    .transform(tfms,size=sz,resize_method=ResizeMethod.SQUISH,padding_mode='zeros') 
    .databunch(bs=bs,num_workers=4) 
    .normalize(imagenet_stats)  
   )

learn = Learner(data, 
            md_ef, 
            metrics = [qk], 
            model_dir="models").to_fp16()
learn.data.add_test(ImageList.from_df(test_df,
                             '../input/aptos2019-blindness-detection',
                                  folder='test_images',
                                  suffix='.png'))

我想使用从 skf.split 获得的折叠来训练我的模型,但我不知道该怎么做。

【问题讨论】:

    标签: python machine-learning cross-validation fast-ai


    【解决方案1】:

    有两种方法可以做到这一点。

    1. 对索引使用“split_by_idxs”
        data = (ImageList.from_df(df=df,path='./',cols='path')
            .split_by_idxs(train_idx=train_index, valid_idx=test_index) 
            .label_from_df(cols='diagnosis',label_cls=FloatList) 
            .transform(tfms,size=sz,resize_method=ResizeMethod.SQUISH,padding_mode='zeros') 
            .databunch(bs=bs,num_workers=4) 
            .normalize(imagenet_stats)  
           )
    
    1. 使用“split_by_list”
       il = ImageList.from_df(df=df,path='./',cols='path')
    
       data = (il.split_by_list(train=il[train_index], valid=il[test_index]) 
           .label_from_df(cols='diagnosis',label_cls=FloatList) 
           .transform(tfms,size=sz,resize_method=ResizeMethod.SQUISH,padding_mode='zeros') 
           .databunch(bs=bs,num_workers=4) 
           .normalize(imagenet_stats)  
          )
    

    【讨论】:

      【解决方案2】:

      这是一段代码。希望这会有所帮助。

      # creating a KFold object with 5 splits 
      folds = KFold(n_splits = 5, shuffle = True, random_state = 10)
      
      # specify range of hyperparameters
      # Set the parameters by cross-validation
      hyper_params = [ {'gamma': [1e-2, 1e-3, 1e-4],
                           'C': [5,10]}]
      
      
      # specify model
      model = SVC(kernel="rbf")
      
      # set up GridSearchCV()
      model_cv = GridSearchCV(estimator = model, 
                              param_grid = hyper_params, 
                              scoring= 'accuracy', 
                              cv = folds, 
                              verbose = 1,
                              return_train_score=True)      
      
      # fit the model
      model_cv.fit(X_train, y_train)
      

      【讨论】:

      • 感谢您的建议,但我使用的是 EfficientNet-B5,我想保持与 "data" 一致。另一个用户告诉我使用 split_by_index 但我不确定如何使用。
      猜你喜欢
      • 2019-01-27
      • 2016-10-04
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 2021-04-06
      • 2019-10-01
      • 2020-05-13
      • 2020-11-10
      相关资源
      最近更新 更多