【发布时间】:2018-09-12 03:14:43
【问题描述】:
我目前正在尝试为分类特征推出自己的朴素贝叶斯分类器,以确保我理解它们。现在我想将它们与 sklearns MultinomialNB 进行比较。但由于某种原因,我无法让 searn 版本正确运行。
我认为最容易比较的是 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。最奇怪的是,它显然只是给出了 class prior P(y) 的概率(我用我的自制算法检查;))每个预测。所以它显然不会将它与可能性 P(X|y) 相乘。
有人遇到过这种情况吗?我在这里犯了一些明显的错误吗?
编辑:
我想我现在明白了。如果我将输入数据集转换为列联表,并对输入特征进行 one-hot 编码,它会给出相同的预测概率。我使用了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]...
【问题讨论】:
-
您只训练一项功能。也许该特征与标签高度相关,因此 P(X|y) 接近 1。您可以尝试使用其他特征吗?
-
嘿 Selçuk,我也尝试了其他功能,但它仍然只给了我之前的课程。我还尝试了两个功能。然后发生的有趣的事情是,它没有给我先验类,except 当所有功能都为 0 时。但是,我仍然不相信两个功能的结果。我的算法给了我完全不同的结果(这当然可能是我的算法的错;)。但由于 1 功能案例在 sklearn 中不起作用...)
标签: python machine-learning scikit-learn