为啥我的检测分数很高,尽管在预测过程中有明显的错误分类?

Posted

技术标签:

【中文标题】为啥我的检测分数很高,尽管在预测过程中有明显的错误分类?【英文标题】:Why is my detection score high inspite of obvious misclassifications during prediction?为什么我的检测分数很高,尽管在预测过程中有明显的错误分类? 【发布时间】:2019-10-24 05:00:08 【问题描述】:

我正在使用 NSL-KDD 数据集解决入侵分类问题。在应用递归特征消除技术后,我使用了 10 个特征(共 42 个)进行训练,该技术使用随机森林分类器作为估计参数,基尼指数作为分割决策树的标准。训练分类器后,我使用相同的分类器来预测测试数据的类别。我使用 sklearn 的 cross_val_score 的交叉验证分数(准确率、精度、召回率、f 分数)在所有四个分数中都给出了 99% 以上的分数。但是绘制混淆矩阵显示,在假阳性和假阴性值中看到更高的值。显然,它们与准确性和所有这些分数都不匹配。我哪里做错了?

# Train set contain X_train (dataframe of features) and Y_train (series 
# of target labels)
# Test set contain X_test and Y_test

# Classifier variable
clf = RandomForestClassifier(n_estimators = 10, criterion = 'gini')

#Training
clf.fit(X_train, Y_train)

# Testing
Y_pred = clf.predict(X_test)
pandas.crosstab(Y_test, Y_pred, rownames = ['Actual'], colnames = 
['Predicted'])

# Scoring
accuracy = cross_val_score(clf, X_test, Y_test, cv = 10, scoring = 
'accuracy')
print("Accuracy: %0.5f (+/- %0.5f)" % (accuracy.mean(), accuracy.std() * 
2))
precision = cross_val_score(clf, X_test, Y_test, cv = 10, scoring = 
'precision_weighted')
print("Precision: %0.5f (+/- %0.5f)" % (precision.mean(), precision.std() 
* 2))
recall = cross_val_score(clf, X_test, Y_test, cv = 10, scoring = 
'recall_weighted')
print("Recall: %0.5f (+/- %0.5f)" % (recall.mean(), recall.std() * 2))
f = cross_val_score(clf, X_test, Y_test, cv = 10, scoring = 'f1_weighted')
print("F-Score: %0.5f (+/- %0.5f)" % (f.mean(), f.std() * 2))

我得到了准确度、精确度、召回率和 f-score

Accuracy 0.99825 
Precision 0.99826
Recall 0.99825
F-Score 0.99825

但是,混淆矩阵显示不同

Predicted 9670    41
Actual    5113    2347

我是在整个训练过程中都错了,还是仅仅是由于特征选择不当导致的错误分类问题?

【问题讨论】:

【参考方案1】:

您不是在比较相同的结果!对于混淆矩阵,您在 (X_train,Y_train) 上进行训练并在 (X_test,Y_test) 上进行测试。 但是,crossvalscore 在 (X_test,Y_test) 的 k-1 折上拟合估计器,并在 (X_test,Y_test) 的剩余折上对其进行测试,因为 crossvalscore 在您提供的数据集上进行自己的交叉验证(此处为 10 折) .查看 crossvalscore 文档以获得更多解释。

因此,基本上,您不会在相同的数据上拟合和测试您的算法。这可能解释了结果中的一些不一致。

【讨论】:

谢谢。我可能需要再研究一下。【参考方案2】:

您的预测值存储在 y_pred 中。

accuracy_score(y_test,y_pred)

只需检查这是否有效......

【讨论】:

以上是关于为啥我的检测分数很高,尽管在预测过程中有明显的错误分类?的主要内容,如果未能解决你的问题,请参考以下文章

第一次预测的精度、F 分数和召回率高

模型分数分布

为啥 GridSearchCV 没有给出最好的分数? - Scikit 学习

为啥 TensorFlow 模型报告的预测置信度不正确?

为啥scikit learn的平均精度分数返回nan?

MongoDB:即使查询的所有字段都被索引,为啥我的扫描对象值很高?