1.加载数据集
import pandas as pd
data = pd.read_csv('train.csv')
#使用dropna方法删除含有缺失值的行,默认是行 直接在原DF上进行删除 不返回
data.dropna(inplace=True)
#Evaluation 0表示授予理赔,1表示未通过理赔审核
data.head(3)
#data.info()#没有缺失值
2.分割正负样本
#把数据分为理赔和未通过理赔 未通过为正例
Eva_t = data[data['Evaluation']==1]
Eva_f = data[data['Evaluation']==0]
#print(Eva_t.head(3))
# 所有的正负样本数
totals = {'t':len(Eva_t),'f':len(Eva_f)}
print(totals)
输出结果:
{'t': 31601, 'f': 168399}
3.取出正负样本的属性列
trainY = Eva_t.iloc[:,1:-1] #正列的问题列
trainN = Eva_f.iloc[:,1:-1]
trainY.head(3)
4.理赔和未理赔的情况下每个问题的概率
from numpy import *
import math
p0Num=zeros(36)#36个0
p1Num=zeros(36)#正例
#p0Denom=0.0 为了防止分母为0 调整值
#p1Denom=0.0
p0Denom=2.0
p1Denom=2.0
t_nums = totals['t'] #正列的行数
f_nums = totals['f']
# 所有正列问题值的矩阵 numpy.ndarray
t_Qs=trainY.loc[trainY.index[0:t_nums]].values[0:-1]
f_Qs=trainN.loc[trainN.index[0:f_nums]].values[0:-1]
#遍历所有正例的问题 对问题的向量进行加合 得出在未理赔的情况下 每个问题的和
for line in t_Qs:
p1Num += line #向量加合 还是向量
#对向量中的元素进行求和 也就是未理赔的行中出现的问题总数
p1Denom += sum(p1Num)
#在未理赔的情况下 每个问题的出现概率 log方便计算机的精度计算 采用对数处理不会有任何损失
p1Vec = log(p1Num/p1Denom) #[1,2,....]/100 -> 1/100 2/100
for line in f_Qs:
p0Num += line
#对向量中的元素进行求和 也就是理赔的行中出现的问题总数
p0Denom += sum(p0Num)
#在理赔的情况下 每个问题的出现概率
p0Vec = log(p0Num/p0Denom)
5.利用朴素贝叶斯进行分类并计算错误率
分类
def classNB(vecClass,label,p0Vec,p1Vec,totals):
count=0
err=0
p0=sum(p0Vec*vecClass)+math.log(totals['n']/(totals['y']+totals['n']))
p1=sum(p1Vec*vecClass)+math.log(totals['y']/(totals['y']+totals['n']))
a=0
if p1>p0:
a=1
if label[count]!=a:
err+=1
count+=1
print(float(err/count))
print('p0:',p0,' p1:',p1)
if(p0>p1):
print('我不赔你,气死你')
else:
print('赔你钱,我认输')