2 votes

Comment implémenter sklearns StratifiedKfold avec fastai ?

Je participe à la compétition de kaggle APTOS 2019 et j'essaie d'assembler 5 plis, mais j'ai des problèmes avec l'implémentation correcte de StratifiedKFold.

J'ai essayé de googler sur les discussions fastai mais je ne vois pas de solutions. J'utilise la bibliothèque fastai et j'ai un modèle pré-entraîné.

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'))

Je souhaite utiliser les plis que j'ai obtenus à partir du fichier skf.split pour entraîner mon modèle, mais je ne suis pas sûr de savoir comment procéder.

3voto

Harish Vutukuri Points 1097

Il y a deux façons de procéder.

  1. Utiliser 'split_by_idxs' avec les index

    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)  
       )
  2. Utiliser '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)
    )

0voto

MD FARHAN Points 11

Voici un morceau de code. J'espère que cela vous aidera.

# 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)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X