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

Python 以安全正确的方式使用RandomForestClassifier的predict_proba()函数,python,machine-learning,scikit-learn,random-forest,Python,Machine Learning,Scikit Learn,Random Forest,我正在使用Scikit学习在我的数据集上应用机器学习算法。有时我需要标签/类的概率,而不是标签/类本身。我不希望将垃圾邮件/非垃圾邮件作为电子邮件的标签,我只希望有例如:0.78概率给定的电子邮件是垃圾邮件 为此,我将使用带有RandomForestClassifier的predict_proba(),如下所示: clf = RandomForestClassifier(n_estimators=10, max_depth=None, min_samples_split=1, rando

我正在使用Scikit学习在我的数据集上应用机器学习算法。有时我需要标签/类的概率,而不是标签/类本身。我不希望将垃圾邮件/非垃圾邮件作为电子邮件的标签,我只希望有例如:0.78概率给定的电子邮件是垃圾邮件

为此,我将使用带有RandomForestClassifier的
predict_proba()
,如下所示:

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]
其中第二列是类:垃圾邮件。然而,我对结果有两个主要问题没有信心。第一个问题是,结果表示标签的概率,而不受数据大小的影响?第二个问题是,结果仅显示一个数字,这在某些情况下不是很具体,其中0.701概率与0.708概率相差很大。例如,有没有办法得到下一个5位数

  • 我的结果中有多个数字,您确定这不是由于您的数据集造成的吗?(例如,使用非常小的数据集将产生简单的决策树,从而产生“简单”概率)。否则,显示器可能只显示一位数字,但请尝试打印
    预测[0,0]

  • 我不确定你所说的“概率不受我数据大小的影响”是什么意思。如果您担心您不想预测(例如)太多垃圾邮件,通常会使用阈值
    t
    ,以便在
    proba(label==1)>t
    时预测1。这样,您可以使用阈值来平衡您的预测,例如限制垃圾邮件的全局概率。如果你想全面分析你的模型,我们通常会计算接收器工作特性(ROC)曲线下的面积(AUC)(见维基百科文章)。基本上,ROC曲线是根据阈值
    t
    对预测的描述


  • 希望有帮助

    A
    RandomForestClassifier
    是决策树分类器的集合。无论您的训练集有多大,决策树都会简单地返回:一个决策。一个类的概率为1,其他类的概率为0


    随机森林只是在结果中投票
    predict_proba()
    返回每个类的投票数(林中的每棵树都做出自己的决定并选择一个类),除以林中的树数。因此,您的精度正好是
    1/n\u估计器
    。想要更“精确”?添加更多的估算值。如果你想看到第五位的变化,你需要
    10**5=100000
    估计量,这是多余的。你通常不需要超过100个估计器,通常也不需要那么多。

    我同意塞巴斯蒂安的观点,在你的预测数组中寻找一个特定的指数,你可能会有更高的精度。我想明确预测数组中的结果是按类别名称的字母顺序排序的。我正在完成这个关于@Andreus的答案。随机森林实际上是决策树的集合。然而,一棵树也可以用来预测属于某个类的概率。引用sklearn对
    DecisionTreeClassifier
    类的方法
    predict_probabila
    预测类概率是叶中相同类样本的分数。
    而对随机林的预测是所有树的平均值:
    计算输入样本的预测类概率作为森林中树木的平均预测类概率。
    亲爱的塞巴斯蒂安,我希望你没事。非常感谢你的回答。他们当然帮了忙。然而,我认为我的英语不是很清楚。所以,我很抱歉。让我用另一种方式解释第二点。如果我提供10个实例(新邮件)给我们生成的模型(随机森林分类器)。如果分类器给我0.6作为电子邮件编号1将成为垃圾邮件的概率,受其他9个实例的其他概率值影响的概率为0.6,或者该概率是独立的,表示实例1成为垃圾邮件的概率为60%,无论其他9个实例的概率是什么。并且,关于第一点和你关于检查一个预测值的建议,实际上我得到了相同的位数。获得更多数字的唯一方法是增加估计数(树)的数量,这种方法肯定是不可接受的。1)关于预测精度:我坚持,但这不是树的数量问题。即使只有一棵决策树,你也应该能够得到多个数字的概率预测。决策树的目标是根据一些规则(决策)对输入进行聚类,这些聚类就是树的叶子。如果您有一个包含2封非垃圾邮件和一封来自培训数据的垃圾邮件的叶子,则属于此叶子/簇的任何电子邮件的概率预测(关于通过拟合模型建立的规则),is:1/3表示垃圾邮件,2/3表示非垃圾邮件。2)关于预测中的依赖关系:Sklearn定义再次给出了答案:概率是根据叶(对应于要测试的电子邮件)的特征计算的:叶中每个类的实例数。这是在安装模型时设置的,因此它仅取决于训练数据。总结:结果是实例1发送垃圾邮件的概率为60%,不管其他9个实例的概率是多少。亲爱的Andreus,我希望你没事。非常感谢你在这个问题上的帮助。如果你不介意的话,请检查一下我在给塞巴斯蒂安的评论中对我的担忧所作的解释。关于你的回答,是的,我试图增加树木的数量,我明白了你的意思。然而,仍然有50或100棵树的大小,我看不到更多的数字。你的答案是什么