我为数据拟合了一个随机森林模型。我将我的数据集按70:30的比例分为训练和测试,并对模型进行了训练。我对测试数据的准确率为80%。然后,我取了一个基准数据集,并用该数据集测试了模型。该数据集仅包含具有真实标签(1)的数据。但是,当我使用该模型获得基准数据集的预测时,所有真正的正面都被归类为真正的负面。准确率为90%。为什么会这样呢?有没有办法解释这一点?
X = dataset.iloc[:, 1:11].values
y=dataset.iloc[:,11].values
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=1,shuffle='true')
XBench_test=benchmarkData.iloc[:, 1:11].values
YBench_test=benchmarkData.iloc[:,11].values
classifier=RandomForestClassifier(n_estimators=35,criterion='entropy',max_depth=30,min_samples_split=2,min_samples_leaf=1,max_features='sqrt',class_weight='balanced',bootstrap='true',random_state=0,oob_score='true')
classifier.fit(X_train,y_train)
y_pred=classifier.predict(X_test)
y_pred_benchmark=classifier.predict(XBench_test)
print("Accuracy on test data: {:.4f}".format(classifier.score(X_test, y_test)))\*This gives 80%*\
print("Accuracy on benchmark data: {:.4f}".format(classifier.score(XBench_test, YBench_test))) \*This gives 90%*\发布于 2020-03-06 22:42:40
我将尝试提供一种更好的方法来解释您的结果。在数据集不平衡的情况下,准确性不是衡量性能的好方法。
下面是一个常见的示例:
想象一下,你有一种只存在于.01%人群中的疾病。如果你预测没有人患有这种疾病,那么你的准确率为99.99%,但你的模型不是一个好的模型。
在此示例中,您的基准数据集(通常称为测试数据集)似乎具有不平衡的类,并且当您调用classifier.score方法时,您将获得90%的准确率。在这种情况下,准确性不是解释模型的好方法。相反,您应该考虑其他指标。
其他常见的度量标准可能是查看precision and recall以确定模型的执行情况。在这种情况下,由于所有真阳性都被预测为负,因此您的精度和召回率将为0,这意味着您的模型不能很好地区分。
更进一步,如果你有不平衡的类别,检查分数的不同阈值并查看ROC_AUC等指标可能会更好。这些指标查看模型输出的概率分数(对于sklearn,为predict_proba),并测试不同的阈值。也许你的模型在一个较低的阈值下工作得很好,并且积极案例的得分始终高于负面案例。
这里有一篇关于ROC_AUC的附加文章。
Sci-kit learn有几个不同的指标得分,您可以使用它们位于here。
这是一个你可以在你的代码中实现ROC AUC的方法。
X = dataset.iloc[:, 1:11].values
y=dataset.iloc[:,11].values
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=1,shuffle='true')
XBench_test=benchmarkData.iloc[:, 1:11].values
YBench_test=benchmarkData.iloc[:,11].values
classifier=RandomForestClassifier(n_estimators=35,criterion='entropy',max_depth=30,min_samples_split=2,min_samples_leaf=1,max_features='sqrt',class_weight='balanced',bootstrap='true',random_state=0,oob_score='true')
classifier.fit(X_train,y_train)
#use predict_proba
y_pred=classifier.predict_proba(X_test)
y_pred_benchmark=classifier.predict_proba(XBench_test)
from sklearn.metrics import roc_auc_score
## instead of measuring accuracy use ROC AUC)
print("Accuracy on test data: {:.4f}".format(roc_auc_score(X_test, y_test)))\*This gives 80%*\
print("Accuracy on benchmark data: {:.4f}".format(roc_auc_score(XBench_test, YBench_test))) \*This gives 90%*\https://stackoverflow.com/questions/60352775
复制相似问题