如何在测试集中测试最终分类器?

时间:2018-03-31 11:33:23

标签: python scikit-learn cross-validation

在调整分类器的参数后,我使用最好的模型构建模型。我决定执行StratifiedKFold作为验证。首先,我将我的数据集拆分为火车和测试,以便我可以在不同的测试集上检查我的模型。问题是,由于我应用了Kfold交叉验证,我得到的精度来自虚拟验证集。现在我得到那些我想要在我们保持在上面但不知道如何正确进行的测试集中测试模型的表演。 我知道另一种方法是使用整个数据集(X,y)执行kfold交叉验证,但我决定保留一个测试集,因为我必须构建更多的分类器。 这是我的分类器代码:

from xgboost.sklearn import XGBClassifier
from sklearn.cross_validation import StratifiedKFold
from sklearn.pipeline import Pipeline 
kfold = StratifiedKFold(y_train,
    n_folds=10,
    random_state=42)
pipe_xgb = Pipeline([('xgb', XGBClassifier(learning_rate =0.01,
    n_estimators=5000,
    max_depth=4,
    min_child_weight=6,
    gamma=0,
    subsample=0.8,
    colsample_bytree=0.8,
    objective= 'binary:logistic',
    nthread=4,
    scale_pos_weight=2.7, #ratio of positive and negative classes
    seed=42))])
pipe_xgb.fit(X_train, y_train)
scores = []
for k, (train, val) in enumerate(kfold):
    pipe_xgb.fit(X_train[train], y_train[train])#fit on train 
    score = pipe_xgb.score(X_train[val], y_train[val])#test on val
    scores.append(score)
    print('Fold: %s, Class dist.: %s, Acc: %.3f' % (k+1,
            np.bincount(y_train[train]), score))
print('CV accuracy: %.3f +/- %.3f' % (np.mean(scores), np.std(scores)))

我正在考虑使用上面列出的模型对测试集进行预测,但是我不确定这是否是在test_set上测试的正确方法: 这就是我在测试集上尝试的内容:

y_pred = pipe_xgb.predict(X_test)
from sklearn.metrics import classification_report
target_names = ['class 0', 'class 1']
print(classification_report(y_test, y_pred, target_names=target_names))
from sklearn.metrics import matthews_corrcoef
print('Matthew coefficient')
print()
print(matthews_corrcoef(y_test, pipe_xgb.predict(X_test)))
print('Confusion matrix')
print(metrics.confusion_matrix(y_test,pipe_xgb.predict(X_test)))

1 个答案:

答案 0 :(得分:0)

通常当人们留出验证集,然后进行交叉验证时,这是因为他们想要在训练集上找到最佳参数。 sklearn为您提供了两个很好的功能,它们位于GridSearch之下。当您使用GridSearchCV时,可以将refit设置为True,这样可以在整个训练数据中使用最佳参数训练模型,然后您可以在集合中使用除了验证集。

此外,如果只有Pipeline,则不必使用GridSearchCV

取自here>>> from sklearn import svm, datasets >>> from sklearn.model_selection import GridSearchCV >>> iris = datasets.load_iris() >>> parameters = {'kernel':('linear', 'rbf'), 'C':[1, 10]} >>> svc = svm.SVC() >>> clf = GridSearchCV(svc, parameters) >>> clf.fit(iris.data, iris.target) ... GridSearchCV(cv=None, error_score=..., estimator=SVC(C=1.0, cache_size=..., class_weight=..., coef0=..., decision_function_shape='ovr', degree=..., gamma=..., kernel='rbf', max_iter=-1, probability=False, random_state=None, shrinking=True, tol=..., verbose=False), fit_params=None, iid=..., n_jobs=1, param_grid=..., pre_dispatch=..., refit=..., return_train_score=..., scoring=..., verbose=...) >>> sorted(clf.cv_results_.keys()) ... ['mean_fit_time', 'mean_score_time', 'mean_test_score',... 'mean_train_score', 'param_C', 'param_kernel', 'params',... 'rank_test_score', 'split0_test_score',... 'split0_train_score', 'split1_test_score', 'split1_train_score',... 'split2_test_score', 'split2_train_score',... 'std_fit_time', 'std_score_time', 'std_test_score', 'std_train_score'...] 示例:

<mat-error>