留下一个测试

时间:2019-05-17 14:00:34

标签: python algorithm machine-learning cross-validation

我目前正在使用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)

对于这种方法是否切实可行以及原因,我将非常感谢。

0 个答案:

没有答案