machine-learning - 返回置信度的分类算法?

标签 machine-learning scikit-learn confidence-interval

鉴于建立在 scikit-learn 之上的机器学习模型,如何对新实例进行分类,然后仅选择置信度最高的实例?我们如何定义机器学习的置信度以及如何生成它(如果不是由 scikit-learn 自动生成)?如果我有超过 2 个潜在类别,我应该对此方法进行哪些更改?

这是我到目前为止所做的:

# load libraries
from sklearn import neighbors
# initialize NearestNeighbor classifier
knn = neighbors.KNeighborsClassifier(n_neighbors=3)
# train model
knn.fit([[1],[2],[3],[4],[5],[6]], [0,0,0,1,1,1])
# predict ::: get class probabilities
print(knn.predict_proba(1.5))
print(knn.predict_proba(37))
print(knn.predict_proba(3.5))

示例:

假设我们已经使用 XYZ 机器学习算法创建了一个模型。我们还假设我们尝试使用位置、爱好和收入等信息根据性别对用户进行分类。然后,我们有 10 个要分类的新实例。正常情况下,应用模型后,我们会得到 10 个输出,M(男性)或 F(女性)。到目前为止,一切都很好。但是,我想以某种方式测量这些结果的精度,然后通过使用硬编码阈值,忽略那些精度较低的结果。我的问题是如何测量进动。概率(由 Predict_proba() 函数给出)是一个好的度量吗?例如,我可以说如果可能介于 0.9 和 1 之间,则“保留”(否则“省略”)?或者我应该使用更复杂的方法来做到这一点?正如您所看到的,我缺乏理论背景,因此我们将不胜感激任何帮助。

最佳答案

虽然这更多是一个统计问题,但我可以给出与 scikit-learn 相关的答案。

对机器学习的信心取决于模型所使用的方法。例如,对于 3-NN(您使用的),predict_proba(x) 将为您提供 n/3,其中 x 是距离 x 最近的 3 个邻居中“1 类”的数量。您可以轻松地说,如果 n/3 小于 0.5,则意味着最近邻居中“1 类”数量少于 2 个,“0 类”数量多于 2 个。这意味着您的 x 更有可能来自“0 类”。 (我想你已经知道了)

对于像 SVM 这样的另一种方法,置信度可以是从考虑的点到超计划的距离,或者对于集成模型,它可以是针对某个类别的聚合投票数。 Scikit-learn 的 Predict_proba() 使用模型中可用的内容。

对于多类问题(假设 Y 可以等于 A、B 或 C),ypu 有两种主要方法,有时在 scikit learn 中直接考虑这些方法。

第一种方法是 OneVsOne。它基本上将每个新样本计算为 AvsB AvsC 和 BvsC 模型,并采用最可能的(想象一下,如果 A 战胜 B 和 C,则很可能正确的类别是 A,通过采用具有以下特征的类别来解决烦人的情况)比赛中最高的置信度,例如,如果 A 战胜 B,B 战胜 C,C 战胜 C,如果 A 战胜 B 的置信度高于其他人,则很可能是 A)。

第二种方法是 OneVsAll,您可以计算 A 与 B 和 C、B 与 A 和 C、C 与 A 和 B 的比较,并通过查看置信度分数选择最有可能的类别。

使用scikit-learn的predict()将始终根据predict_proba给出的置信度分数给出最可能的类别。

我建议你阅读这篇文章http://scikit-learn.org/stable/modules/multiclass.html很小心。

编辑:

啊,我明白你想做什么。 Predict_proba() 有一个很大的缺陷:假设您在新实例中有一个很大的异常值(例如,以电子游戏和枪支为爱好的女性,以软件开发人员为工作等),如果您使用 k-NN,那么您的异常值将位于其他类的点云中的群体中的预测概率 () 可以给出 1 作为男性的置信度得分,而实例是女性。然而,对于犹豫不决的情况(例如男性或女性,以电子游戏和枪支为爱好,并在托儿所工作)来说,它会很好,因为 Predict_proba() 会给出大约 0.5 的值。

我不知道是否可以使用更好的东西。如果您有足够的训练样本进行交叉验证,我建议您可以查看 ROC 和 PR 曲线来优化您的阈值。

关于machine-learning - 返回置信度的分类算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25567118/

相关文章:

matlab - 贝叶斯网络推理算法是否假设特定的数据分布?

python - Sklearn 管道转换特定列 - ValueError : too many values to unpack (expected 2)

mysql - 按 mysql 中的置信度下限排序

matlab - 使用 MATLAB 进行简单的二元逻辑回归

tensorflow - tensorflow 中的reduce命令有什么用?

algorithm - 机器学习算法是否复制它从中学习的数据?

python - 如何计算Sklearn中点到质心的平均距离的平均值?

r - 如果可能,在 R - 基 R 中着色置信区间

machine-learning - 我应该如何使用类别比例失调大的数据来教授机器学习算法? (支持向量机)

python - 余弦相似度和余弦距离的区别