以安全正确的方式使用 RandomForestClassifier 的 predict_proba() 函数

Using the predict_proba() function of RandomForestClassifier in the safe and right way

我正在使用 Scikit-learn。有时我需要 labels/classes 的概率而不是 labels/classes 本身。我不想将 Spam/Not 垃圾邮件作为电子邮件的标签,而只是希望:给定电子邮件是垃圾邮件的概率为 0.78。

为此,我将 predict_proba() 与 RandomForestClassifier 一起使用,如下所示:

clf = RandomForestClassifier(n_estimators=10, max_depth=None,
    min_samples_split=1, random_state=0)
scores = cross_val_score(clf, X, y)
print(scores.mean())

classifier = clf.fit(X,y)
predictions = classifier.predict_proba(Xtest)
print(predictions)

我得到了这些结果:

 [ 0.4  0.6]
 [ 0.1  0.9]
 [ 0.2  0.8]
 [ 0.7  0.3]
 [ 0.3  0.7]
 [ 0.3  0.7]
 [ 0.7  0.3]
 [ 0.4  0.6]

第二列用于 class:垃圾邮件。但是,我对结果有两个主要问题,对此我没有信心。第一个问题是结果代表标签的概率而不受我的数据大小的影响?第二个问题是结果只显示一位数字,这在某些情况下不是很具体,其中 0.701 概率与 0.708 有很大差异。例如,有什么方法可以获取下一个 5 位数字吗?

  1. 我的结果多了一位数,你确定这不是你的数据集造成的吗? (例如,使用非常小的数据集会产生简单的决策树,因此会产生 'simple' 概率)。否则可能只是显示一位数字,但尝试打印predictions[0,0].

  2. 我不太清楚"the probabilities aren't affected by the size of my data"是什么意思。如果您担心您不想预测,例如,太多的垃圾邮件,那么通常做的是使用阈值 t,这样如果 proba(label==1) > t,您就可以预测 1。这样您就可以使用阈值来平衡您的预测,例如限制垃圾邮件的全局概率。如果您想全局分析您的模型,我们通常会计算接受者操作特征 (ROC) 曲线的曲线下面积 (AUC)(参见维基百科文章 here)。基本上,ROC 曲线是根据阈值 t.

  3. 对您的预测的描述

希望对您有所帮助!

RandomForestClassifierDecisionTreeClassifier 的集合。无论您的训练集有多大,决策树都只是 returns:一个决策。一个 class 的概率为 1,另一个 class 的概率为 0。

RandomForest 只是对结果进行投票。 predict_proba() returns 每个 class 的票数(森林中的每棵树自己做出决定并恰好选择一棵 class),除以树中的树数森林。因此,您的精度正好是 1/n_estimators。想要更多 "precision"?添加更多估算器。如果你想看到第 5 位的变化,你将需要 10**5 = 100,000 个估计器,这是过多的。您通常不需要超过 100 个估算器,而且通常不会那么多。