首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么在机器学习模型中,所有真正的积极因素都被归类为真正的消极因素?

为什么在机器学习模型中,所有真正的积极因素都被归类为真正的消极因素?
EN

Stack Overflow用户
提问于 2020-02-22 21:48:38
回答 1查看 32关注 0票数 0

我为数据拟合了一个随机森林模型。我将我的数据集按70:30的比例分为训练和测试,并对模型进行了训练。我对测试数据的准确率为80%。然后,我取了一个基准数据集,并用该数据集测试了模型。该数据集仅包含具有真实标签(1)的数据。但是,当我使用该模型获得基准数据集的预测时,所有真正的正面都被归类为真正的负面。准确率为90%。为什么会这样呢?有没有办法解释这一点?

代码语言:javascript
运行
复制
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%*\
EN

Stack Overflow用户

发布于 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的方法。

代码语言:javascript
运行
复制
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%*\
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60352775

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档