- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在尝试为分类特征推出我自己的朴素贝叶斯分类器,以确保我理解它们。现在我想将它们与 sklearns MultinomialNB
进行比较。但由于某种原因,我无法让 skearn 版本正确运行。我认为最容易比较的是 kaggle Titanic 数据集。所以它这样做了(这相当简单,对吧?):
import numpy as np
import pandas as pd
from sklearn.naive_bayes import MultinomialNB
train = pd.read_csv('data/in/train.csv')
X = np.asarray(train[['Pclass']])
y = np.asarray(train['Survived'])
clf = MultinomialNB()
clf.fit(X, y)
clf.predict_proba(X)
但它实际上预测(或没有,在这种情况下......)是泰坦尼克号上的每个人都会死亡。或者换句话说,当要预测的类标签为 [0, 1]
时,它预测 0。最奇怪的是,它显然只是给出了每个预测的类先验 P(y) 的概率(我用我的自制算法进行了检查;))。所以它显然不会将其与可能性 P(X|y) 相乘。
有人遇到过这种情况吗?我在这里犯了一些明显的错误吗?
编辑:
我想我现在明白了。如果我将输入数据集转换为列联表,并对输入特征进行单热编码,它会给出相同的预测概率。我使用了 alpha=0
的平滑与我自己的算法进行比较:
import numpy as np
import pandas as pd
from sklearn.naive_bayes import MultinomialNB
train = pd.read_csv('data/in/train.csv')
X_test = np.asarray(pd.get_dummies(train['Pclass']))
X = np.array(pd.crosstab(train[y_column], train['Pclass']))
y = np.array([0,1])
clf = MultinomialNB(alpha=0.0000000001, class_prior=np.array(class_prior))
clf.fit(X, y)
clf.predict_proba(X_test)
不过,我想知道的一件事是,为什么我现在必须手动指定类。如果我不这样做,sklearn 现在使用不知情的先验,[0.5, 0.5]
...
最佳答案
多项式朴素贝叶斯模型的工作原理与给定单个特征的预期工作原理完全一样。如果你看一下formula for P(X|y) ,当特征数量n=1时,它等于1。这就是原因。
朴素贝叶斯模型因对条件分布 P(X | y) 所做的假设而彼此不同。多项式朴素贝叶斯假设这是一个多项式分布。多项分布对滚动(可能有偏差的)k 面骰子 n 次的计数概率进行建模。
例如,假设给您一组由两家公司生产的骰子:FairDice 和 Crooks&Co。 FairDice 以生产公平的骰子而闻名,而 Crooks&Co 生产的加载骰子绝大多数都是 6 在上面。您需要学习通过多次 throw 骰子并查看结果来预测骰子的生产者。您将每个骰子 throw 数次,并将结果记录在具有 6 个特征的数据集中。每个特征代表 throw 骰子时相应值出现的次数。
count_1 count_2 count_3 count_4 count_5 count_6 fair_dice
5 6 4 7 6 5 1
3 2 1 2 1 13 0
现在这是用于训练多项式朴素贝叶斯分类器的合适数据集。
在单个特征上训练多项式朴素贝叶斯分类器相当于尝试对顶部具有相同数字的单面骰子进行分类。
例如如果你的特征值为[3,2,1],这意味着你扔了第一个骰子三次,每次都得到1,扔第二个骰子两次,每次都得到1,扔第三个骰子一次,得到1。没有为您提供有关骰子生产者的信息,因此您可以预测的最好结果是先验类别,这正是算法的作用。
关于python - sklearn MultinomialNB 仅预测类先验,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49619152/
给定一个包含 100 行的数据表,例如: Place | Text | Value | Text_Two europe | some random text | 3.
好的,我正在学习 Andrew Ng 的机器学习类(class)。我正在阅读 this chapter并想使用 SKLearn 和 Python 为自己尝试多项式朴素贝叶斯(第 12 页底部)。所以
我已经能够制作一个 MultinomialNB 分类器并将其保存到 pickle 文件中以备后用(感谢 youtube 视频:https://www.youtube.com/watch?v=0kPRa
我有一个形状为 (100000, 56000) 的 BoW 向量,并且我想使用 scikit-learn 中的 MultinomialNB 来执行分类任务。 MultinomialNB 是否采用稀疏矩
我目前正在尝试为分类特征推出我自己的朴素贝叶斯分类器,以确保我理解它们。现在我想将它们与 sklearns MultinomialNB 进行比较。但由于某种原因,我无法让 skearn 版本正确运行。
这是一个关于功能集的非常基本的问题。 假设我有一群具有各种特征的人,我想向他们提出建议。他们还写了一段自由格式的文本,这对于我需要向他们推荐的内容非常重要。 我可以理解如何矢量化他们的示例文本,但我不
我需要创建一个模型,根据变量对记录进行准确分类。例如,如果记录具有预测变量 A 或 B,我希望将其分类为具有预测值 X。实际数据是这样的形式: Predicted Predictor
在我提出这个问题之前,我不得不说我已经彻底阅读了这个论坛上超过 15 个类似的主题,每个主题都有不同的建议,但所有这些都无法让我正确理解。 好的,所以我将我的“垃圾邮件”文本数据(最初为 csv 格式
我正在使用 sklearn 多项朴素贝叶斯分类器对 20NewsGroup 数据进行分类。代码如下: import numpy as np import operator from sklearn i
我正在创建一个简单的推荐器,它会根据推文的相似性推荐其他用户。我使用 tfidf 对所有文本进行矢量化,并且能够将数据放入 MultinomialNB 中,但在尝试预测时不断出现错误 我尝试将数据重新
我正在尝试使用 sci kit learn 在 python 中的一系列示例上运行多项式朴素贝叶斯。我一直将所有例子都归类为负面。训练集有点偏向负数 P(负数) ~.75。我翻阅了documentat
如何计算多类文本分类的 FPR、TPR、AUC、roc_curve。 我使用了以下代码: from sklearn.model_selection import train_test_split X_
在 sklearn 中运行 MultinomialNB 之前,我正在标准化我的文本输入: vectorizer = TfidfVectorizer(max_df=0.5, stop_words='en
我正在尝试让我的 MultinomialNB 工作。我在训练和测试集上使用 CountVectorizer,当然两个集中都有不同的单词。所以我明白了,为什么会出现错误 ValueError: dime
我目前正在尝试使用 Python 和 Scikit-learn 构建一些文本分类工具。 我的文本不是英文的,因此不受词干分解或其他基于英文的降维的通常处理。 结果,TfIdf矩阵变得非常大(150,0
# Note: The runnable code example is at the end of this question #### # Assume X_train contains clea
问题:将用户产品分类为禁止或批准。 如果商品包含“濒临灭绝的物种”、“虎皮”等 输入:产品标题+描述 相应标签:已批准/禁止 我使用监督学习算法MultinomialNB对产品进行分类,它的二元组准确
我正在尝试比较多项式、二项式和伯努利分类器的性能,但出现错误: TypeError: float() argument must be a string or a number, not 'set'
我是一名优秀的程序员,十分优秀!