我正在使用NSL-KDD数据集处理入侵分类问题。应用递归特征消除技术后,我使用了10个特征(总共42个)进行训练,该技术使用随机森林分类器作为估计参数,并使用Gini索引作为分裂决策树的标准。在训练了分类器之后,我使用相同的分类器来预测测试数据的类别。我使用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分Accuracy 0.99825
Precision 0.99826
Recall 0.99825
F-Score 0.99825
但是,混乱矩阵显示为相反
Predicted 9670 41
Actual 5113 2347
我训练的整个事情是错误的,还是仅仅是由于错误的特征选择导致分类错误?
答案 0 :(得分:2)
您的预测值存储在y_pred中。
accuracy_score(y_test,y_pred)
只需检查是否可行...
答案 1 :(得分:0)
您不比较等效结果!对于混淆矩阵,请在(X_train,Y_train)上进行训练,并在(X_test,Y_test)上进行测试。 但是,crossvalscore使估计量适合(X_test,Y_test)的k-1倍,并在(X_test,Y_test)的其余倍数上对其进行测试,因为crossvalscore在您提供的数据集上进行了自己的交叉验证(此处有10折)。 。查看crossvalscore文档以获取更多说明。
因此,基本上,您不适合在相同数据上测试算法。这可能解释了结果中的某些不一致之处。