【发布时间】:2020-11-05 23:46:24
【问题描述】:
我为我的玩具数据集写了一个简单的朴素贝叶斯分类器
msg spam
0 free home service 1
1 get free data 1
2 we live in a home 0
3 i drive the car 0
完整代码
import pandas as pd
from collections import Counter
data = {'msg':['free home service','get free data','we live in a home','i drive the car'],'spam':[1,1,0,0]}
df = pd.DataFrame(data=data)
print(df)
def word_counter(word_list):
words = []
for x in word_list:
for i in x:
words.append(i)
word_count = Counter(words)
return word_count
spam = [x.split() for x in set(df['msg'][df['spam']==1])]
spam = word_counter(spam)
ham = [x.split() for x in set(df['msg'][df['spam']==0])]
ham = word_counter(ham)
total = len(spam.keys())+len(ham.keys())
# Prior
spam_prior = len(df['spam'][df['spam']==1])/len(df)
ham_prior = len(df['spam'][df['spam']==0])/len(df)
new_data = ["get free home service","i live in car"]
print("\n\tSpamminess")
for msg in new_data:
data = msg.split()
# Likelihood
spam_likelihood = 0.001 # low value to prevent divisional error
ham_likelihood = 0.001
for i in data:
if i in spam:
if spam_likelihood==0.001:
spam_likelihood = spam[i]/total
continue
spam_likelihood = spam[i]/total * spam_likelihood
if i in ham:
if ham_likelihood==0.001:
ham_likelihood = ham[i]/total
continue
ham_likelihood = ham[i]/total * ham_likelihood
# marginal likelihood
marginal = (spam_likelihood*spam_prior) + (ham_likelihood*ham_prior)
spam_posterior = (spam_likelihood*spam_prior)/marginal
print(msg,round(spam_posterior*100,2))
问题是它在我的Spamminess 分类中完全失败了,因为看不见的数据。
get free home service 0.07
i live in car 97.46
我预计 get free home service 的价值较高,而 i live in car 的价值较低。
我的问题是这个错误是由于缺少额外的数据还是因为我的编码错误?
【问题讨论】:
标签: python machine-learning classification naivebayes