我一直在sklearn中使用随机森林来预测一组数据,下面的代码显示了输出:
print(np.mean(cross_val_score(rf, X_train_resampled,
y_train_resampled, cv=5, scoring='accuracy')))
print(balanced_accuracy_score(y_valid, predictions))
然而,cross_val_score 方法给出了 0.93 的准确率(这显然比实际测试要高很多),而 balanced_accuracy_score 给出了 0.40 的准确率。
我一直在询问 newbing 并检查 stackoverflow,但没有得到足够好的答案。是模型不够好出现问题,还是我做错了什么?
这是由于数据不平衡造成的。例如,我创建了一个数据集,其中 95% class1,5% class0。如果你在这个数据集上测试一个虚拟模型(总是返回 1),你会得到:
import sklearn
from sklearn.metrics import accuracy_score, balanced_accuracy_score
import numpy as np
data = np.random.randn(100, 10)
labels = np.array(95*[1] + 5 * [0])
class model:
def __init__(self):
pass
def predict(self, x):
return np.ones(x.shape[0])
dummy_model = model()
print(accuracy_score(labels, dummy_model.predict(data)))
print(balanced_accuracy_score(labels, dummy_model.predict(data)))