python - 使用随机森林算法、灵敏度和特异性进行预测

标签 python r machine-learning data-science

我是机器学习新手,正在使用随机森林算法开发一个简单的预测模型。我还使用混淆矩阵评估我的模型并计算我构建的模型的灵敏度和特异性分数。

虽然我在概念上理解了这两者,但我现在陷入了这样一个境地:我的模型总是导致灵敏度得分为 1,特异性得分为 0。它的准确度得分为 91%(91/100 个训练样本是预测正确)。

现在我可以从中推断出什么?我的模型是否过于敏感且不具体?我是否必须明白我的模型更有可能发出误报而不是误报? (这在我的场景中可能很好),因为我正在处理的领域是预测欺诈,其中误报效果更好。

顺便说一句,在典型的机器学习工作流程中,灵敏度和特异性分数在实践中经常如何使用?它是否用于在客户端系统上保留某种阈值,以便对预测持保留态度?我可以调整哪些参数来获得不同的值?目前,我只是调整了随机森林模型变量,例如树的数量、节点的数量等。但这些数字始终保持不变。

最佳答案

我认为,从特异性和敏感性数字中可以得出的最佳推论是,您的模型在某种程度上指定错误,存在数据错误,或者导致此问题的数据或代码的其他非参数方面问题。

如您所知:(使用:真阳性、假阴性...)

Sensitivity = TP/(TP + FN) 

Specificity = TN/(FP + TN)

Accuracy = (TP + TN) / (TP + FP + TN + FN) 

要获得灵敏度 = 1,TP = TP + FN。当然,可能发生的方式有很多种,但要寻找的方式是 TP = FN,或 FN = 0(因为 TP 不能为 0)。

此外,特异性 0 意味着 TN = 0,无论 FP 和 TN 是什么。但在这里我也会看看 FP 和 TN 的分布。

如果 TN = 0,那么对于精度 = 0.9,TP = 0.9,这表明即使 TN = 0,FP 和/或 FN > 0,并且实际上 FP + FN = 0.1(因为分母必须等于 1)。

@desertnaut 提到的一种可能性是,您存在严重的类别不平衡问题。也就是说,少数类别(您想要预测的类别)仅占数据中所有观察值总数的非常非常小的一部分。要研究这一点,只需绘制目标的分布即可。如果您发现少数类别少于总数的 10%(一般来说,一个类别以 10:1 的比例主导另一个类别),那么您可能会开始在模型中发现问题。

Here's a good tutorial on dealing with imbalanced data.

And here's a paper if you're more technically minded and want to confront an imbalance in a more academic way.

也就是说,我还会查看您的模型的代码。检查您如何分离训练和测试:

  • 训练集中类别的平衡是否代表了整个集合的平衡?
  • 如果有的话,您是如何进行交叉验证的?改变方法是否会给您带来不同的规范/灵敏度结果?
  • 类别的数据类型是否始终正确(就此而言,其余变量也是如此)?由于 RF 可以处理分类变量,如果您将您期望的 int 编码为 string (仅举一个例子),它可能不会抛出错误,这可能会产生奇怪的结果。

看到任何具有满分 (1/0) 的结果通常表明除模型参数(或超参数)之外的其他内容指定不正确。并不是说它不可能发生。只是很少这样做。

关于python - 使用随机森林算法、灵敏度和特异性进行预测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49096990/

相关文章:

Python Subprocess call() 不执行shell命令

评估 elat 和 apriori 项集时删除具有空值的行

machine-learning - SVM 硬边距 : why imbalanced dataset may cause bad results?

python - 如何获取 Telegram channel (超过 200 个)成员的列表

python - 使用 Python 将日程表转换为综合报告

python - 如何使 Django 与 MySQL 连接器/Python 一起工作?

删除字符串中重复两次以上的字符

html - 为什么 extractHTMLStrip() from tm.plugin.webmining 会截断 61 个字符以下的字符串?

RcppEigen 无法将包含超过 2^31 个元素的矩阵返回给 R

python - 如何在人工神经网络中处理多个分类列?