输入到precision_recall_curve - predict 或 predict_proba 输出?

Posted

技术标签:

【中文标题】输入到precision_recall_curve - predict 或 predict_proba 输出?【英文标题】:Input to precision_recall_curve - predict or predict_proba output? 【发布时间】:2013-08-23 06:15:55 【问题描述】:

我正在使用高斯朴素贝叶斯从 Pandas 数据框训练模型,但在使用precision_recall_curve 时出现错误。文档说precision_recall_curve将预测概率作为输入(至少在我阅读时)所以我希望下面的工作(xtrain和xtest分别是具有736和184行的Pandas数据帧;ytrain / ytest是具有736和184的系列行):

nb = GaussianNB()
nb.fit(xtrain, ytrain)
predicted = nb.predict_proba(xtest)
precision, recall, threshold = precision_recall_curve(ytest, predicted)

我希望上述方法能够正常工作,但是我收到“IndexError:索引 230 超出大小 184 的范围”。如果我改为这样做:

predicted = nb.predict(xtest)
precision, recall, threshold = precision_recall_curve(ytest, predicted)

然后它会正确执行。 184 是 xtest 和 ytest 中的行数,但 230 不是任何这些结构的维度。有人可以解释其中的区别或我应该如何为此目的使用precision_recall_curve?

【问题讨论】:

我不知道 230 来自哪里,但你真的不应该在 Pandas 数据结构上使用 scikit-learn 估计器。 scikit-learn 需要 NumPy 约定,而 Pandas 违反了其中的一些约定(例如,将一维数组转换为列向量而不是行向量)。另外,这是一个二元分类任务吗? 【参考方案1】:

如果这是二元分类,请尝试使用以下方法,

predicted = nb.predict_proba(xtest)
precision, recall, threshold = precision_recall_curve(ytest, predicted[:,1])

【讨论】:

以上是关于输入到precision_recall_curve - predict 或 predict_proba 输出?的主要内容,如果未能解决你的问题,请参考以下文章

使用precision_recall_curve 计算最大f1 分数?

在scikit的precision_recall_curve中,为啥threshold与recall和precision的维度不同?

使用具有不同分类器的 sklearn precision_recall_curve 函数

如何为scikit学习随机森林模型设置阈值

sklearn如何在精确召回曲线中选择阈值步骤?

微信小程序-输入框输入文字后,将光标移到文字中间,接着输入文字后光标又自动跳到最后