Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 精密度回忆曲线或ROC曲线是否可能是一条水平线?_Python_Matplotlib_Scikit Learn_Roc_Precision Recall - Fatal编程技术网

Python 精密度回忆曲线或ROC曲线是否可能是一条水平线?

Python 精密度回忆曲线或ROC曲线是否可能是一条水平线?,python,matplotlib,scikit-learn,roc,precision-recall,Python,Matplotlib,Scikit Learn,Roc,Precision Recall,我正在从事一项关于不平衡数据的二进制分类任务 因为在这种情况下,准确度不是很有意义。 我使用Scikit学习计算精度召回曲线和ROC曲线,以评估模型性能 但我发现,当我使用随机森林和许多估计器时,这两条曲线都是一条水平线,当我使用SGD分类器拟合它时,也会出现这种情况 ROC图如下所示: 和精确回忆表: 由于随机森林的行为是随机的,我不会在每次跑步中都得到一条水平线,有时我也会得到一条规则的ROC和PR曲线。但水平线更为常见 这正常吗?还是我在代码中犯了一些错误 以下是我的代码片段: class

我正在从事一项关于不平衡数据的二进制分类任务

因为在这种情况下,准确度不是很有意义。 我使用Scikit学习计算精度召回曲线和ROC曲线,以评估模型性能

但我发现,当我使用随机森林和许多估计器时,这两条曲线都是一条水平线,当我使用SGD分类器拟合它时,也会出现这种情况

ROC图如下所示:

和精确回忆表:

由于随机森林的行为是随机的,我不会在每次跑步中都得到一条水平线,有时我也会得到一条规则的ROC和PR曲线。但水平线更为常见

这正常吗?还是我在代码中犯了一些错误

以下是我的代码片段:

classifier.fit(X_train, Y_train)
try:
    scores = classifier.decision_function(X_test)
except:
    scores = classifier.predict_proba(X_test)[:,1]

precision, recall, _ = precision_recall_curve(Y_test, scores, pos_label=1)
average_precision = average_precision_score(Y_test, scores)

plt.plot(recall, precision, label='area = %0.2f' % average_precision, color="green")
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('Precision Recall Curve')
plt.legend(loc="lower right")
plt.show()

与其他答案一样,您可能已将标签作为特征复制到数据集中。因此,当在RF中进行采样时,您并不总是能够获得该特征作为预测值,并获得正常的ROC曲线,即其他特征无法准确预测标签;当您在示例中获得重复的标签/特征时,根据定义,您的模型具有100%的准确性


新加坡元也有同样的问题,线性回归也会失败。在线性回归中,你会有一个奇异/近似奇异的矩阵,估计会失败。对于SGD,由于您是基于每个下一个到达点进行估计,因此数学并没有失败,但您的模型仍然会受到怀疑。

与其他答案一起,您可能已将标签作为数据集中的一个特征进行了复制。因此,当在RF中进行采样时,您并不总是能够获得该特征作为预测值,并获得正常的ROC曲线,即其他特征无法准确预测标签;当您在示例中获得重复的标签/特征时,根据定义,您的模型具有100%的准确性


新加坡元也有同样的问题,线性回归也会失败。在线性回归中,你会有一个奇异/近似奇异的矩阵,估计会失败。有了SGD,因为你是根据下一个到达的点进行估算的,所以数学并没有失败,你的模型仍然是可疑的。

是的,你可以。如果你将数据完美地分成两堆,那么你将从0到1的真阳性率垂直移动,没有任何假阳性。当你的阈值通过真阳性堆时,垂直线将从0到1的假阳性率垂直移动,然后当你的阈值通过真阴性堆时,从0到1的假阳性率垂直移动


如果你能从测试集中得到相同的ROC曲线,你就是黄金。如果您可以在5个不同的k倍交叉验证测试集上获得相同的ROC曲线,您就是白金。

是的,您可以。如果你将数据完美地分成两堆,那么你将从0到1的真阳性率垂直移动,没有任何假阳性。当你的阈值通过真阳性堆时,垂直线将从0到1的假阳性率垂直移动,然后当你的阈值通过真阴性堆时,从0到1的假阳性率垂直移动


如果你能从测试集中得到相同的ROC曲线,你就是黄金。如果你能在5个不同的k-fold交叉验证测试集上得到相同的ROC曲线,你就是白金。

其他2个答案只是看到水平线的充分条件,它们是水平线的可能原因,但它们不是唯一的可能性。以下是充分必要条件:

如果您在PR曲线中看到一条水平线,它必须位于顶部,这意味着阈值范围内的示例都是TPs。线路越长,TP越高,因为线路越长,召回率越高

证明:

让我们将TP表示为真正,PP表示为预测正,因此精度=TP/PP

水平线表示召回率增加了一定数量,而准确率不变。让我们分别讨论这两件事:

召回数量有所增加-> 总磷有所增加 假设TP的增加量最小,为1。假设x是PP的增加量。根据定义x>=1。 精度不变-> TP+1/PP+x=TP/PP
对于x,我们得到x=TP/PP。因为精度=TP/PP其他两个答案只是看到水平线的充分条件,它们是水平线的可能原因,但它们不是唯一的可能性。以下是充分必要条件:

如果您在PR曲线中看到一条水平线,它必须位于顶部,这意味着阈值范围内的示例都是TPs。线路越长,TP越高,因为线路越长,召回率越高

证明:

让我们将TP表示为真正,PP表示为预测正,因此精度=TP/PP

水平线表示召回率增加了一定数量,而准确率不变。让我们分别讨论这两件事:

召回数量有所增加-> 总磷增加 多少 假设TP的增加量最小,为1。假设x是PP的增加量。根据定义x>=1。 精度不变-> TP+1/PP+x=TP/PP
对于x,我们得到x=TP/PP。因为精度=TP/PP,它看起来有点太好了,不可能是真的你能通过dropbox sharelink或google driver上传你的样本数据文件吗?花点时间想想这些图到底告诉了你什么。您基本上在测试集上执行了完美的预测。这正常吗?不是。通常用机器学习技术解决的问题要困难得多。完美的预测通常是不可能的。还是我在代码中犯了一些错误?在你的代码里?可能不会。在你的测试中?大概我们不知道。我建议尝试交叉验证。也许你的问题很容易学。也许您的测试集有问题。交叉验证会证明这一点。谢谢你们!这真的很有帮助。我将尝试交叉验证。如果我仍然无法获得规则曲线,我将上传数据。Cel的复制:这确实是测试数据选择的问题。我碰巧选择了一套简单的测试。这就是为什么我有一条水平线。非常感谢。这看起来有点太好了,不可能是真的你能通过dropbox sharelink或google driver上传你的样本数据文件吗?花点时间想想这些图到底告诉了你什么。您基本上在测试集上执行了完美的预测。这正常吗?不是。通常用机器学习技术解决的问题要困难得多。完美的预测通常是不可能的。还是我在代码中犯了一些错误?在你的代码里?可能不会。在你的测试中?大概我们不知道。我建议尝试交叉验证。也许你的问题很容易学。也许您的测试集有问题。交叉验证会证明这一点。谢谢你们!这真的很有帮助。我将尝试交叉验证。如果我仍然无法获得规则曲线,我将上传数据。Cel的复制:这确实是测试数据选择的问题。我碰巧选择了一套简单的测试。这就是为什么我有一条水平线。非常感谢。经过10次交叉验证,我得到了规则曲线。谢谢你的回答!经过10次交叉验证,我得到了规则曲线。谢谢你的回答!在我的功能中,我没有答案功能,但这仍然是一个很好的见解,谢谢分享!在我的功能中,我没有答案功能,但这仍然是一个很好的见解,谢谢分享!