高准确率和召回率,但交叉验证准确率低

数据挖掘 scikit-学习 随机森林 交叉验证
2022-03-06 10:18:51

我正在使用随机森林分类器(scikit learn)。当我进行 5 折交叉验证时,平均准确度得分约为 70%。但是,当我查看precision_score 和recall_score 时,它​​们都是1。这可能吗?如果错了,可能是什么问题?这是代码:

clf = RandomForestClassifier(n_estimators=100) 
clf.fit(X, Y.values.ravel())
scores = cross_val_score(clf, X, Y.values.ravel(), cv=5, scoring="accuracy")
Y_pred = clf.predict(X)
precision = precision_score(Y, Y_pred)
recall = recall_score(Y, Y_pred)
1个回答

首先,您应该使用cross_val_predict来获取预测向量,以便您遵循大致相同的验证方案来获取它们:

Y_pred = cross_val_predict(clf, Y, cv=5)

然后,考虑到这些是 scikit 被认为是正类的分数,召回率或精度完全可能为 1。事实上,scikit 默认将你的一个类分配为“正”类,并根据它计算类固有的指标。

但是,正如您所说,您不能同时拥有 1 和 70% 的准确度。

事实是您的 clf.predict 为您提供了 100% 的准确度,而在交叉验证期间并非如此,因为在您的第二个方案中:

clf.fit(X, Y.values.ravel())Y_pred = clf.predict(X)

你训练和预测相同的数据!因此,在交叉验证期间,您可以获得 100% 的准确率,这很常见:

scores = cross_val_score(clf, X, Y.values.ravel(), cv=5, scoring="accuracy")

您在不同的折叠上进行了训练和测试,这在逻辑上会导致更差的结果(但更接近真实条件实验)。

此外,尝试使用cross_val_predictthenprecision_recall_fscore_support(Y, Y_pred)以获得每个类的详细指标报告。