基于scikit-learn构建的机器学习模型,如何对新实例进行分类,并选择其中置信度最高的实例?在机器学习中如何定义置信度,以及如何生成它(如果scikit-learn没有自动生成)?如果有超过两个潜在类别,我应该如何改变这种方法?
这是我目前所做的:
# 加载库
from sklearn import neighbors
# 初始化NearestNeighbor分类器
knn = neighbors.KNeighborsClassifier(n_neighbors=3)
# 训练模型
knn.fit([[1],[2],[3],[4],[5],[6]], [0,0,0,1,1,1])
# 预测 ::: 获取类概率
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),您有两种主要方法,有时scikit-learn会直接考虑这些方法。
第一种方法是OneVsOne。它基本上将每个新样本计算为AvsB、AvsC和BvsC模型,并选择最可能的(想象一下,如果A战胜B和C,那么很可能正确的类别是A,烦人的情况通过选择在对决中具有最高置信度的类别来解决,例如,如果A战胜B,B战胜C,C战胜A,如果A战胜B的置信度高于其他,它很可能是A)。
第二种方法是OneVsAll,您计算A vs B和C,B vs A和C,C vs A和B,并通过查看置信度分数来选择最可能的类别。
使用scikit-learn的predict()总是会根据predict_proba给出的置信度分数给出最可能的类别。
我建议您仔细阅读这个http://scikit-learn.org/stable/modules/multiclass.html。
编辑:
啊,我明白您在尝试做什么。predict_proba()有一个很大的缺陷:假设您的新实例中有一个很大的异常值(例如,女性以电子游戏和枪支为爱好,工作是软件开发者等),如果您使用k-NN,并且您的异常值位于另一类别的点云中,predict_proba()可能会给出1作为男性置信度,而该实例实际上是女性。然而,对于不确定的情况(例如,男性或女性,以电子游戏和枪支为爱好,在幼儿园工作),predict_proba()会给出大约0.5的分数。
我不知道是否有更好的方法可以使用。如果您有足够的训练样本进行交叉验证,我建议您可能要查看ROC和PR曲线来优化您的阈值。