朴素贝叶斯 java_朴素贝叶斯概率总是1

我开始使用 sklearn.naive_bayes.GaussianNB 进行文本分类,并且获得了很好的初始结果 . 我想使用分类器返回的概率作为置信度的度量,但是 predict_proba() 方法总是返回所选类的"1.0",并且所有其余类都返回"0.0" .

我知道(来自here)"...the probability outputs from predict_proba are not to be taken too seriously",但到了那个程度?!分类器可能会误认为金融投资或和弦,但 predict_proba() 输出显示没有犹豫的迹象......

关于上下文:

我一直在使用 sklearn.feature_extraction.text.TfidfVectorizer 进行特征提取,开始时没有用 stop_words 或 min/max_df 来限制词汇量 - >我已经得到了非常大的向量 .

我一直在分层类别树上训练分类器(浅层:深度不超过3层),每个类别有7个文本(手动分类) . 现在,这是 flat 训练:我没有考虑到等级 .

产生的 GaussianNB 对象非常大(~300MB),预测相当慢:一个文本大约1秒 .

这有关系吗?这些巨大的载体是这一切的根源吗?

我如何获得有意义的预测?我需要使用不同的分类器吗?

这是我正在使用的代码:

from sklearn.feature_extraction.text import TfidfVectorizer

from sklearn.naive_bayes import GaussianNB

import numpy as np

from sklearn.externals import joblib

Vectorizer = TfidfVectorizer(input = 'content')

vecs = Vectorizer.fit_transform(TextsList) # ~2000 strings

joblib.dump(Vectorizer, 'Vectorizer.pkl')

gnb = GaussianNB()

Y = np.array(TargetList) # ~2000 categories

gnb.fit(vecs.toarray(), Y)

joblib.dump(gnb, 'Classifier.pkl')

...

#In a different function:

Vectorizer = joblib.load('Vectorizer.pkl')

Classifier = joblib.load('Classifier.pkl')

InputList = [Text] # One string

Vec = Vectorizer.transform(InputList)

Probs = Classifier.predict_proba([Vec.toarray()[0]])[0]

MaxProb = max(Probs)

MaxProbIndex = np.where(Probs==MaxProb)[0][0]

Category = Classifier.classes_[MaxProbIndex]

result = (Category, MaxProb)

Update:

按照下面的建议,我尝试了 MultinomialNB & LogisticRegression . 它们都返回了不同的概率,并且在任何方面对我的任务都更好:分类更准确,内存中的对象更小,速度更快( MultinomialNB 闪电般快!) .

我现在有一个新问题:返回的概率非常小 - 通常在0.004-0.012范围内 . 这是针对预测/获胜类别(并且分类是准确的) .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值