1. 条件概率与贝叶斯定理
对于事件A和B,当B发生的情况下,A发生的条件概率为:
P(A|B)=P(AB) / P(B)
如果把 P(AB) 表示为 P(B|A)P(A),那么:
2. 朴素贝叶斯
朴素贝叶斯是一个基于贝叶斯定理的分类算法,其基本假设是所有特征是相互独立的。
**
3. 根据名字判断性别
**
读取训练集和测试集
'''
训练集:120000
预测集:32040
变量说明:
变量名 解释
id 编号
name 名字 无姓氏
gender :0表示女生,1表示男生。
准确度=预测正确数/总数
'''
train = pd.read_csv('train.txt')
test = pd.read_csv('test.txt')
# 把数据分为男女两部分
names_female = train[train['gender'] == 0]
names_male = train[train['gender'] == 1]
# totals用来存放训练集中女生、男生的总数
totals = {'f': len(names_female),
'm': len(names_male)}
分别计算在所有女生(男生)的名字当中,某个字出现的频率。
相当于是计算 P(Xi|女生)和P(Xi|男生)
frequency_list_f = defaultdict(int)
for name in names_female['name']:
for char in name:
frequency_list_f[char] += 1. / totals['f']
frequency_list_m = defaultdict(int)
for name in names_male['name']:
for char in name:
frequency_list_m[char] += 1. / totals['m']
实现预测函数
def ComputeLogProb(name, bases, totals, frequency_list_m, frequency_list_f):
logprob_m = bases['m']
logprob_f = bases['f']
for char in name:
logprob_m += GetLogProb(char, frequency_list_m, totals['m'])
logprob_f += GetLogProb(char, frequency_list_f, totals['f'])
return {'male': logprob_m, 'female': logprob_f}
def GetGender(LogProbs):
return LogProbs['male'] > LogProbs['female']
result = []
for name in test['name']:
LogProbs = ComputeLogProb(name, bases, totals, frequency_list_m, frequency_list_f)
gender = GetGender(LogProbs)
result.append(int(gender))
看看结果:
**
*源码与数据集下载地址:下载RAR 没有积分的也可以免费向我索要哈,评论区留下邮箱地址。我看见的时候就打包发送喽~*
**