我目前正在使用Naive Bayes对一堆文本进行分类。我有多个类别。现在我只输出后验概率和类别,但我想做的是根据后验概率对类别进行排名,并使用第二,第三位类别作为“备份”类别。
以下是一个例子:
df = pandas.DataFrame({ 'text' : pandas.Categorical(["I have wings","Metal wings","Feathers","Airport"]), 'true_cat' : pandas.Categorical(["bird","plane","bird","plane"])})
text true_cat
-----------------------
I have wings bird
Metal wings plane
Feathers bird
Airport plane
我在做什么:
new_cat = classifier.classify(features(text))
prob_cat = classifier.prob_classify(features(text))
最终输出:
new_cat prob_cat text true_cat
bird 0.67 I have wings bird
bird 0.6 Feathers bird
bird 0.51 Metal wings plane
plane 0.8 Airport plane
我找到了一些使用 classify_many 和 prob_classify_many 的示例,但由于我是Python新手,因此无法将其转换为我的问题。我没有看到它在任何地方都与熊猫一起使用。
我希望它看起来像这样:
df_new = pandas.DataFrame({'text': pandas.Categorical(["I have wings","Metal wings","Feathers","Airport"]),'true_cat': pandas.Categorical(["bird","plane","bird","plane"]), 'new_cat1': pandas.Categorical(["bird","bird","bird","plane"]), 'new_cat2': pandas.Categorical(["plane","plane","plane","bird"]), 'prob_cat1': pandas.Categorical(["0.67","0.51","0.6","0.8"]), 'prob_cat2': pandas.Categorical(["0.33","0.49","0.4","0.2"])})
new_cat1 new_cat2 prob_cat1 prob_cat2 text true_cat
-----------------------------------------------------------------------
bird plane 0.67 0.33 I have wings bird
bird plane 0.51 0.49 Metal wings plane
bird plane 0.6 0.4 Feathers bird
plane bird 0.8 0.2 Airport plane
任何帮助都将不胜感激。
答案 0 :(得分:1)
我将你的自我回答作为你问题的一部分。大概你有这样的分类概率bird
:
prob_cat.prob("bird")
此处,prob_cat
是nltk概率分布(ProbDist
)。您可以使用离散ProbDist
中的所有类别及其概率:
probs = list((x, prob_cat.prob(x)) for x in prob_cat.samples())
由于您已经知道所训练的类别,因此您可以使用预定义列表而不是prob_cat.samples()
。最后,您可以在同一个表达式中从最可能到最不可能的顺序排序:
mycategories = ["bird", "plane"]
probs = sorted(((x, prob_cat.prob(x)) for x in mycategories), key=lambda tup: -tup[1])
答案 1 :(得分:0)
我现在开始到那儿了。
#This gives me the probability it's a bird.
prob_cat.prob(bird)
#This gives me the probability it's a plane.
prob_cat.prob(plane)
既然我有几十个类别,我正在努力让它给我所有这些类别,而不是放入所有的类别名称,但这应该很简单。