оставить один тест - PullRequest
0 голосов
/ 17 мая 2019

В настоящее время я работаю с небольшим набором данных 20x300. Поскольку у меня так мало точек данных, мне было интересно, смогу ли я использовать подход, аналогичный перекрестной проверке, оставляемой без проверки, но для тестирования.

Вот что я думал:

  1. поезд / тест разделяет данные, и только одна точка данных в наборе тестов.
  2. обучить модель на данных обучения, потенциально с grid_search / перекрестная проверка
  3. используйте лучшую модель от шага 2 до сделать прогноз на одну точку данных и сохранить прогноз в массив
  4. повторять предыдущие шаги, пока все точки данных не будут был в тестовом наборе
  5. рассчитать предпочитаемую метрику выбора (точность, f1-оценка, auc и т. д.), используя эти прогнозы

Плюсы этого подхода:

  • Вам не нужно «резервировать / тратить» данные для тестирования, чтобы вы могли тренироваться с большим количеством точек данных.

Минусы будут:

  • Этот подход страдает от потенциальной (?) Утечки данных.
  • Вы рассчитываете метрику точности из группы предсказаний. это может быть связано с разными моделями из-за поиска сетки, поэтому я не уверен, насколько точным он будет.

Я испробовал стандартные подходы к разделению поездов / тестов, но, поскольку мне нужно взять как минимум 5 баллов за тестирование, у меня не хватает баллов для обучения, и ROC AUC становится очень плохим.

Вот код, чтобы вы могли видеть, о чем я говорю.

for train_index, test_index in loo.split(X):

    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]

    param_grid = {'C': [1e2, 5e2, 1e3, 5e3, 1e4, 5e4, 1e5, 5e6, 1e6],
              'gamma': [0.00001, 0.0001, 0.0005, 0.001, 0.005, 0.01, 0.1, 1],
                  'degree': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
                 'kernel': ['rbf', 'linear', 'poly'],
                 'class_weight': ['balanced', None]}

    model = SVC(probability = True)

    skf = StratifiedKFold(n_splits=num_cv_folds)

    grid_search = GridSearchCV(model, param_grid,
            n_jobs=-1,
            cv=skf,
            scoring='roc_auc',
            verbose=0,
            refit=True,
            iid=False)

    grid_search.fit(X_train, y_train)

    best_model = grid_search.best_estimator_
    y_pred_test = best_model.predict_proba(X_test)

    y_preds.append(y_pred_test[0][0])

fpr, tpr, thresholds = roc_curve(y, y_preds_, pos_label=1)
auc_roc1 = auc(fpr, tpr)

Я был бы очень признателен за некоторые отзывы о том, действительно ли этот подход осуществим или нет, и почему.

...