В настоящее время я работаю с небольшим набором данных 20x300. Поскольку у меня так мало точек данных, мне было интересно, смогу ли я использовать подход, аналогичный перекрестной проверке, оставляемой без проверки, но для тестирования.
Вот что я думал:
- поезд / тест разделяет данные, и только одна точка данных в наборе тестов.
- обучить модель на данных обучения, потенциально с
grid_search / перекрестная проверка
- используйте лучшую модель от шага 2 до
сделать прогноз на одну точку данных и сохранить прогноз в
массив
- повторять предыдущие шаги, пока все точки данных не будут
был в тестовом наборе
- рассчитать предпочитаемую метрику выбора
(точность, 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)
Я был бы очень признателен за некоторые отзывы о том, действительно ли этот подход осуществим или нет, и почему.