鉴于建立在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之间,那么“保持”(否则“省略”)?或者我应该使用更复杂的方法来做到这一点?如你所见,我缺乏理论背景,所以任何帮助都会受到高度赞赏。
答案 0 :(得分:2)
虽然这更像是一个统计数据问题,但我可以给出相对于scikit-learn的答案。
对机器学习的信心取决于模型使用的方法。例如3-NN(你使用过的),predict_proba(x)将给你n / 3,其中x是x中3个最近邻居中“class 1”的数量。你可以很容易地说,如果n / 3小于0.5,这意味着最近的邻居中有少于2个“1级”,并且有超过2个“0级”。这意味着你的x更可能来自“0级”。 (我猜你已经知道了)
对于像SVM这样的另一种方法,置信度可以是从考虑点到超规划的距离,或者对于集合模型,它可以是朝向某个类的聚合投票的数量。 Scikit-learn的predict_proba()使用模型中提供的内容。
对于多类问题(假设Y可以等于A,B或C),ypu有两种主要方法,有时在scikit学习中直接考虑。
第一种方法是OneVsOne。它基本上将每个新样本计算为AvsB AvsC和BvsC模型,并且最有可能(想象一下如果A胜过B而对C则很可能是正确的类是A,烦人的情况通过采用具有的类来解决比赛中最高的信心,例如如果A胜出B,B胜C和C胜C,如果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而你的异常值将会在其他classe的云点中,predict_proba()可以给1作为男性的置信分数,而实例是女性。然而,对于犹豫不决的案件(例如男性或女性,视频游戏和枪支作为爱好,并在幼儿园工作),因为predict_proba()将提供约0.5左右的东西。
我不知道是否可以使用更好的东西。如果您有足够的训练样本进行交叉验证,我建议您可以查看ROC和PR曲线以优化阈值。