Cli*_*cal 19 python machine-learning random-forest scikit-learn
我正在使用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)
Run Code Online (Sandbox Code Playgroud)
我得到了这些结果:
[ 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]
Run Code Online (Sandbox Code Playgroud)
第二列用于课程:垃圾邮件.但是,我对结果有两个主要问题,我对此并不自信.第一个问题是结果表示标签的概率而不受数据大小的影响?第二个问题是结果只显示一个数字,在0.701概率与0.708非常不同的某些情况下不是非常具体.有没有办法获得下一个5位数的例子?
非常感谢您花时间阅读这两个问题及其问题.
And*_*eus 15
A RandomForestClassifier是DecisionTreeClassifier's 的集合.无论您的训练集多大,决策树都会简单地返回:决策.一个类的概率为1,其他类的概率为0.
RandomForest只是在结果中投票.predict_proba()返回每个类的投票数(森林中的每个树做出自己的决定,并选择一个类),除以森林中的树数.因此,你的精确度是准确的1/n_estimators.想要更"精确"吗?添加更多估算工具.如果你想看到第5位数的变化,你需要10**5 = 100,000估算器,这是过多的.您通常不需要超过100个估算器,通常不会那么多.
小智 5
结果中得到的位数不止一个,您确定不是由于您的数据集引起的吗?(例如,使用非常小的数据集将得出简单的决策树,从而得出“简单”的概率)。否则,它可能只是显示一位数字的显示屏,而是尝试打印predictions[0,0]。
我不确定您的意思是“概率不受数据大小的影响”。如果您担心自己不想预测垃圾邮件,例如太多垃圾邮件,通常要做的是使用一个阈值t,使您预测1 if proba(label==1) > t。这样,您可以使用阈值来平衡预测,例如限制垃圾邮件的全球概率。如果你想在全球范围内分析模型,我们通常计算面积受试者工作特征(ROC)曲线的曲线(AUC)下(参见维基百科的文章在这里)。基本上,ROC曲线是根据阈值对您的预测的描述t。
希望能帮助到你!
恐怕投票最高的答案不正确(至少对于最新的 sklearn 实现而言)。
根据docs,预测概率计算为森林中树木的平均预测类别概率。单棵树的类概率是叶子中同一类样本的分数。
换句话说,由于随机森林是决策树的集合,因此它通过对其树进行平均来预测新样本的概率。单棵树通过查看叶子内不同类别的分布来计算概率。查看单个决策树的图像,了解叶子中具有不同类的含义。第二个子分裂中的右叶有 75% 黄色,因此黄色类的预测概率将为 75%。

仅当所有树的每一片叶子都具有仅属于其中一个类的数据点时,才会出现投票最高的答案中提到的场景。
参考: