在 weka 中使用测试集进行交叉验证和测试之间的准确性差异很大吗?正常吗?

Big accuracy difference between cross-validation and testing with a test set in weka? is it normal?

我是 weka 的新手,我在使用它的分类项目中遇到问题。

我有一个包含 1000 个实例和 200 个实例中的一个用于测试的训练数据集。问题是,当我尝试测试某些算法(如随机森林)的性能时,交叉验证和测试集给出的数字确实不同。

这是一个交叉验证的例子

=== Run information ===

Scheme:weka.classifiers.trees.RandomForest -I 100 -K 0 -S 1
Relation:     testData-weka.filters.unsupervised.attribute.StringToWordVector-R1-W10000000-prune-rate-1.0-T-I-N0-L-stemmerweka.core.stemmers.IteratedLovinsStemmer-M1-O-tokenizerweka.core.tokenizers.WordTokenizer -delimiters " \r\n\t.,;:\"\'()?!--+-í+*&#$\/=<>[]_`@"-weka.filters.supervised.attribute.AttributeSelection-Eweka.attributeSelection.InfoGainAttributeEval-Sweka.attributeSelection.Ranker -T 0.0 -N -1
Instances:    1000
Attributes:   276
[list of attributes omitted]
Test mode:10-fold cross-validation

=== Classifier model (full training set) ===

Random forest of 100 trees, each constructed while considering 9 random features.
Out of bag error: 0.269



Time taken to build model: 4.9 seconds

=== Stratified cross-validation ===
=== Summary ===

Correctly Classified Instances         740               74      %
Incorrectly Classified Instances       260               26      %
Kappa statistic                          0.5674
Mean absolute error                      0.2554
Root mean squared error                  0.3552
Relative absolute error                 60.623  %
Root relative squared error             77.4053 %
Total Number of Instances             1000     

=== Detailed Accuracy By Class ===

               TP Rate   FP Rate   Precision   Recall  F-Measure   ROC Area  Class
                 0.479     0.083      0.723     0.479     0.576      0.795    I
                 0.941     0.352      0.707     0.941     0.808      0.894    E
                 0.673     0.023      0.889     0.673     0.766      0.964    R
Weighted Avg.    0.74      0.198      0.751     0.74      0.727      0.878

=== Confusion Matrix ===

   a   b   c   <-- classified as
 149 148  14 |   a = I
  24 447   4 |   b = E
  33  37 144 |   c = R

72.5% , 有点...

但现在如果我尝试使用我的 200 个实例的测试集...

=== Run information ===

Scheme:weka.classifiers.trees.RandomForest -I 100 -K 0 -S 1
Relation:     testData-weka.filters.unsupervised.attribute.StringToWordVector-R1-W10000000-prune-rate-1.0-T-I-N0-L-stemmerweka.core.stemmers.IteratedLovinsStemmer-M1-O-tokenizerweka.core.tokenizers.WordTokenizer -delimiters " \r\n\t.,;:\"\'()?!--+-í+*&#$\/=<>[]_`@"-weka.filters.supervised.attribute.AttributeSelection-Eweka.attributeSelection.InfoGainAttributeEval-Sweka.attributeSelection.Ranker -T 0.0 -N -1
Instances:    1000
Attributes:   276
[list of attributes omitted]
Test mode:user supplied test set: size unknown (reading incrementally)

=== Classifier model (full training set) ===

Random forest of 100 trees, each constructed while considering 9 random features.
Out of bag error: 0.269



Time taken to build model: 4.72 seconds

=== Evaluation on test set ===
=== Summary ===

Correctly Classified Instances          86               43      %
Incorrectly Classified Instances       114               57      %
Kappa statistic                          0.2061
Mean absolute error                      0.3829
Root mean squared error                  0.4868
Relative absolute error                 84.8628 %
Root relative squared error             99.2642 %
Total Number of Instances              200     

=== Detailed Accuracy By Class ===

               TP Rate   FP Rate   Precision   Recall  F-Measure   ROC Area  Class
                 0.17      0.071      0.652     0.17      0.27       0.596    I
                 0.941     0.711      0.312     0.941     0.468      0.796    E
                 0.377     0          1         0.377     0.548      0.958    R
Weighted Avg.    0.43      0.213      0.671     0.43      0.405      0.758

=== Confusion Matrix ===

  a  b  c   <-- classified as
 15 73  0 |  a = I
  3 48  0 |  b = E
  5 33 23 |  c = R

43% ...显然,确实有问题,我用测试集进行批量过滤

我做错了什么?我使用相同的标准手动对测试集和训练集进行分类,所以我发现这些差异很奇怪。

我想我理解了 CV 背后的概念,但也许我错了。

谢谢

根据您的评论,这是统计数据:

CV误差: 26%

测试误差:57%

训练误差: 1.2%

低训练误差总是可疑的。如果错误率较低,要做的第一件事是检查 CV 错误或测试错误。如果训练和test/CV误差相差很大,那么就有可能过拟合了。这是一个非常好的完整性测试。当然,您还有其他方法(例如学习曲线)来确认您的模型是否过拟合。 过度拟合 意味着您的模型不能很好地泛化——它只知道训练数据或者它只适合 training data, in general 如果你把这个模型应用到未知数据上,它自己是无法拟合的。

所以,回到你的问题——CV 和 Test 可以看作是测试模型泛化能力的两个独立案例。如果你有一个过度拟合的模型,它就不能很好地泛化。因此,在 CV 的情况下,它会给出一个结果,而在测试中,它会给出一个不同的结果。

希望对您有所帮助?