您好,如果我们要使用以下方法评估简历的准确性:
X_train, X_test, y_train, y_test = train_test_split(
X, y, random_state=42)
model=RandomForestClassifier(random_state=0)
k_folds = KFold(n_splits=5)
splits = k_folds.split(X_train, y_train)
cv_acc = cross_val_score(model, X_train, y_train, cv=splits, scoring='accuracy')
然后评估测试集的性能是否常见?
model=RandomForestClassifier(random_state=0)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
predictions = [round(value) for value in y_pred]
accuracy = accuracy_score(y_test, predictions)
从cv_acc
到计算accuracy
之前是否有任何明确的步骤需要涉及。我们会报告哪个结果正确无误?我在cv_acc
中的准确度约为92.5%,在accuracy
中的准确度约为87.5%。
谢谢:)
答案 0 :(得分:2)
交叉验证的目的是检查您计划使用的模型(模型+特定的超参数)是否可以推广。您可以按照建议here的要求将测试集分开进行最终评估,并仅对训练数据使用交叉验证。
仍然应保留测试集以进行最终评估,但是进行CV时不再需要验证集。
下面是流程和我在图表的每个阶段的注释-
scores = cross_val_score(clf, X, y, cv=5)
#THIS IS GOOD! MODEL IS GENERALIZABLE ON k-FOLDS
array([0.96..., 1. ..., 0.96..., 0.96..., 1. ])
#THIS IS BAD! MODEL IS NOT GENERALIZABLE
array([0.68..., 0.42. ..., 0.96..., 0.99..., 1. ])
常见混淆-请不要将最佳参数与k折模型之一的参数混淆。每个k折模型在不同的k折数据上使用相同的模型+参数。最佳参数只是您在网格搜索中选择的范围或手动选择的超参数。
数据集/训练数据/测试数据:现在,像往常一样(80 20左右)将数据集分成测试并训练
RETRAIN模型:利用网格搜索和交叉验证确定的最佳参数,在训练数据集上重新训练模型并在测试数据上评分
最终评估:最终测试准确性(应报告)是在测试数据上对最佳参数模型评分后获得的结果。
将网格搜索视为对模型参数的探索,将交叉验证视为对特定模型参数集如何通过k倍验证对给定数据进行泛化的探索。这两个过程都有助于选择模型,一旦选择了正确的模型,就可以在原始训练数据上对其进行重新训练,并从测试数据中获得验证准确性。
请阅读this link,因为它在解释使用交叉验证的流程方面做得很好。
用sklearn
位作者的话-
在评估估算器的不同设置(“超参数”)(例如必须为SVM手动设置的C设置)时,仍然存在过度拟合测试集的风险,因为可以对参数进行调整,直到估算器执行最佳。这样,有关测试集的知识可以“渗入”模型,并且评估指标不再报告泛化性能。为了解决此问题,可以将数据集的另一部分保留为所谓的“验证集”:对训练集进行训练,然后对验证集进行评估,以及实验何时成功,最终评估可以在测试集上完成。
什么是交叉验证?
在称为k倍CV的基本方法中,将训练集分为k个较小的集(下面介绍了其他方法,但通常遵循相同的原理)。 k个“折叠”中的每一个都遵循以下过程:
使用褶皱作为训练数据训练模型;
生成的模型在数据的其余部分上得到验证(即,它用作测试集以计算性能指标(例如准确性)。
通过k倍交叉验证报告的性能指标就是循环中计算出的值的平均值。
此图像应总结我上面讨论的所有内容。
答案 1 :(得分:0)
最常见的方法是在训练集上运行它。您拥有官方文档here。
您对训练数据进行交叉验证,因此您需要进行多次折叠训练,然后采用该参数进行测试(无需在测试集上运行交叉验证,只需简单地使用交叉验证中的参数即可)您的训练数据)。