在 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 的情况下,它会给出一个结果,而在测试中,它会给出一个不同的结果。
希望对您有所帮助?
我是 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 的情况下,它会给出一个结果,而在测试中,它会给出一个不同的结果。
希望对您有所帮助?