【问题标题】:Scikit-Learn Decision Tree: Probability of prediction being a or b?Scikit-Learn 决策树:预测是 a 还是 b 的概率?
【发布时间】:2018-04-25 09:12:17
【问题描述】:

我有一个带有 Scikit-Learn 的基本决策树分类器:

#Used to determine men from women based on height and shoe size

from sklearn import tree

#height and shoe size
X = [[65,9],[67,7],[70,11],[62,6],[60,7],[72,13],[66,10],[67,7.5]]

Y=["male","female","male","female","female","male","male","female"]

#creating a decision tree
clf = tree.DecisionTreeClassifier()

#fitting the data to the tree
clf.fit(X, Y)

#predicting the gender based on a prediction
prediction = clf.predict([68,9])

#print the predicted gender
print(prediction)

当我运行程序时,它总是输出“男性”或“女性”,但我如何才能看到预测为男性或女性的概率?例如,上面的预测返回“男性”,但我如何让它打印预测为男性的概率?

谢谢!

【问题讨论】:

  • 如答案所述,您可以使用predict_proba,但请注意概率不是很好:rpmcruz.github.io/machine%20learning/2018/02/09/…
  • “不是很好”是轻描淡写的。因为您使用的是决策树,所以每个样本都在“男性”分支或“女性”分支中。所以概率永远是 1。

标签: python machine-learning scikit-learn classification decision-tree


【解决方案1】:

听起来你需要阅读sklearn documentation for DecisionTreeClassifier 并查看:

predict_proba(X[, check_input])

【讨论】:

  • 我看了一点文档。我尝试调用 print(clf.predict_proba(X)) 并得到以下结果: [[ 0. 1.] [ 1. 0.] [ 0. 1.] [ 1. 0.] [ 1. 0.] [0.1.][0.1.][1.0.]]这是什么意思?
  • 您提供了数据 X、Y,并要求算法预测 X。这就是概率显示为 [0. 1.]
  • 为了进一步澄清,输入 predict_proba(what you are trying to predict),而不是 X。这样有意义吗?
  • 哦,好的。所以我会做 predict_proba([68,9])?
【解决方案2】:

您可以执行以下操作:

from sklearn import tree

#load data
X = [[65,9],[67,7],[70,11],[62,6],[60,7],[72,13],[66,10],[67,7.5]]
Y=["male","female","male","female","female","male","male","female"]

#build model
clf = tree.DecisionTreeClassifier()

#fit
clf.fit(X, Y)

#predict
prediction = clf.predict([[68,9],[66,9]])

#probabilities
probs = clf.predict_proba([[68,9],[66,9]])

#print the predicted gender
print(prediction)
print(probs)

理论

clf.predict_proba(X)的结果是:预测的类概率,即叶子中同一类样本的分数。

结果解读:

第一个print 返回['male' 'male'],因此数据[[68,9],[66,9]] 被预测为males

第二个print返回:

[[ 0. 1.] [ 0. 1.]]

这意味着数据被预测为男性,这是由第二列中的数据报告的。

要查看类的顺序,请使用:clf.classes_

返回:['female', 'male']

【讨论】:

  • 谢谢你!我决定对这个问题使用 SVM 而不是决策树,因为它有一个概率参数。但这是一个很好的答案!
  • 我认为您没有提供 OP 正在寻找的概率。这只是返回一个类似的二进制答案。我假设 OP 正在寻求提供一些信心,就像在逻辑回归中一样,因此大多数值将介于 0 和 1 之间,但不等于 0 或 1。我什至不确定这是否可能。
  • 我相信这正是 OP 所要求的。他也接受了我的回答。
  • 恰好在这种情况下,树预测了 0% 和 100% 的概率。其他数据会产生不同的概率。如果有人碰巧知道DecisionTreeRegressors 是否可以做类似的事情,我问stackoverflow.com/questions/53586860/…
【解决方案3】:

我上面的答案是正确的, 你得到二进制输出是因为你的树是完整的并且没有截断以使你的树更弱,你可以使用 max_depth 到较低的深度,这样概率就不会像 [0. 1.] 它看起来像 [0.25 0.85] 这里的另一个问题是数据集非常小且易于解决,因此最好使用更复杂的数据集 一些链接可能会让你的伴侣更清楚 https://rpmcruz.github.io/machine%20learning/2018/02/09/probabilities-trees.html https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html#sklearn.tree.DecisionTreeClassifier.predict_proba

【讨论】:

    猜你喜欢
    • 2017-02-23
    • 2020-04-05
    • 2017-09-11
    • 2019-02-08
    • 2019-05-24
    • 2015-01-10
    • 2017-03-26
    • 2023-04-07
    相关资源
    最近更新 更多