以安全正确的方式使用RandomForestClassifier的predict_proba()函数
machine-learning
python
random-forest
scikit-learn
4
0

我正在使用Scikit-learn将机器学习算法应用于我的数据集。有时我需要使标签/类的概率恢复为标签/类的自身。我不希望将垃圾邮件/非垃圾邮件作为电子邮件的标签,而仅希望举例说明:给定电子邮件为垃圾邮件的概率为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位数字?

在此先感谢您花时间阅读这两个问题及其问题。

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

RandomForestClassifierDecisionTreeClassifier的集合。不管您的训练集多大,决策树都会简单地返回:一个决策。一个类别的概率为1,其他类别的概率为0。

RandomForest只是在结果中投票。 predict_proba()返回每个类别的票数(森林中的每棵树都做出自己的决定并选择一个类别),然后除以森林中的树木数。因此,您的精度恰好是1/n_estimators 。想要更多的“精度”吗?添加更多估算器。如果要查看第5位数字的变化,则需要10**5 = 100,000估算器,这是多余的。通常,您不希望有100个以上的估算器,而且通常不会那么多。

收藏
评论
  1. 结果中得到的位数不止一个,您确定不是由于您的数据集引起的吗? (例如,使用非常小的数据集将得出简单的决策树,从而得出“简单”的概率)。否则,可能只能是显示一位数字的显示屏,而是尝试打印predictions[0,0]

  2. 我不确定您的意思是“概率不受数据大小的影响”。如果您担心自己不想预测垃圾邮件,例如太多垃圾邮件,通常要做的是使用阈值t ,以便在proba(label==1) > t预测1。这样,您可以使用阈值来平衡预测,例如限制垃圾邮件的全球概率。如果你想在全球范围内分析模型,我们通常计算面积受试者工作特征(ROC)曲线的曲线(AUC)下(参见维基百科的文章在这里 )。基本上,ROC曲线是根据阈值t对您的预测的描述。

希望能帮助到你!

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号