我正在尝试对k-nn分类器进行交叉验证,我不知道下面两种方法中哪一种正确地进行交叉验证。在
training_scores = defaultdict(list)
validation_f1_scores = defaultdict(list)
validation_precision_scores = defaultdict(list)
validation_recall_scores = defaultdict(list)
validation_scores = defaultdict(list)
def model_1(seed, X, Y):
np.random.seed(seed)
scoring = ['accuracy', 'f1_macro', 'precision_macro', 'recall_macro']
model = KNeighborsClassifier(n_neighbors=13)
kfold = StratifiedKFold(n_splits=2, shuffle=True, random_state=seed)
scores = model_selection.cross_validate(model, X, Y, cv=kfold, scoring=scoring, return_train_score=True)
print(scores['train_accuracy'])
training_scores['KNeighbour'].append(scores['train_accuracy'])
print(scores['test_f1_macro'])
validation_f1_scores['KNeighbour'].append(scores['test_f1_macro'])
print(scores['test_precision_macro'])
validation_precision_scores['KNeighbour'].append(scores['test_precision_macro'])
print(scores['test_recall_macro'])
validation_recall_scores['KNeighbour'].append(scores['test_recall_macro'])
print(scores['test_accuracy'])
validation_scores['KNeighbour'].append(scores['test_accuracy'])
print(np.mean(training_scores['KNeighbour']))
print(np.std(training_scores['KNeighbour']))
#rest of print statments
第二个模型中的for循环似乎是多余的。在
^{pr2}$我使用的是StratifiedKFold
,我不确定是否需要像在模型2函数中那样使用循环,还是在我们传递{cross_validate
函数是否已经使用了拆分。在
我没有调用fit
方法,可以吗?cross_validate
是自动调用还是在调用cross_validate
之前需要先调用fit
?在
最后,如何创建混淆矩阵?我是否需要为每个折叠创建它?如果是,如何计算最终/平均混淆矩阵?在
model_1
是正确的。在https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.cross_validate.html
cross_validate(estimator, X, y=None, groups=None, scoring=None, cv=’warn’, n_jobs=None, verbose=0, fit_params=None, pre_dispatch=‘2*n_jobs’, return_train_score=’warn’, return_estimator=False, error_score=’raise-deprecating’)
在哪里
estimator
是实现“fit”的对象。它将被调用以使模型适合火车折叠。在cv
:是一个交叉验证生成器,用于生成训练和测试拆分。在如果你按照sklearn文档中的例子
cv_results = cross_validate(lasso, X, y, cv=3, return_train_score=False) cv_results['test_score'] array([0.33150734, 0.08022311, 0.03531764])
您可以看到,模型
lasso
在列车拆分的每个折叠中被拟合了3次,在测试拆分中也被验证了3次。您可以看到报告了验证数据的测试分数。在Keras模型的交叉验证
Keras提供了使Keras模型与sklearn交叉验证方法兼容的包装器。您必须使用
KerasClassifier
包装keras模型documentation可以说是您在此类问题中最好的朋友;从这个简单的示例中可以明显看出,您既不应该使用
for
循环,也不应该使用对fit
的调用。调整示例以使用KFold
方法:结果:
^{pr2}$没有人能告诉你你是否需要为每一个折叠创建一个混淆矩阵-这是你的选择。如果您选择这样做,最好跳过
cross_validate
并“手动”执行程序-请参阅How to display confusion matrix and report (recall, precision, fmeasure) for each cross validation fold中的答案。在不存在“最终/平均”混淆矩阵;如果您想计算除链接答案中描述的
k
个(每个k折一个)之外的任何内容,则需要有一个单独的验证集。。。在相关问题 更多 >
编程相关推荐