斯坦福大学机器学习作业题Problem Set #2 Spam classi cation

来源:互联网 发布:自动刷弹幕软件 编辑:程序博客网 时间:2024/06/17 13:10
本次作业题的内容是利用朴素贝叶斯分类器识别是否为垃圾邮件,关于文本的提取,分词,和标注都是已成形的数据,只需要写个朴素贝叶斯分类器验证正确率就可以。
关于朴素贝叶斯的模型可以参考http://blog.csdn.net/longxinchen_ml/article/details/50597149,讲的很清楚,ng在视频中讲的朴素贝叶斯分类器用的是伯努利模型,即只计算某个词受否存在,而忽略了关于词频,而本道作业题使用的多项式模型。
在本次作业中有几个注意的点:
1.需使用laplace平滑,因为有些词语可能在我们的训练数据中从未出现过,就会导致概率为0的情况,而朴素贝叶斯模型中分子是一些概率连乘积,如果有一项为0,会导致答案为0。
2.朴素贝叶斯模型中分子是一些概率连乘积,而每一项都很小,会导致连乘积很小,出现越界的情况,导致为0,这里对于概率取对数,概率的连乘积也变成对数相加,由于对数和x是正相关的,在最后判断的时候只需比较取对数后的结果大小即可。
3.我们通常是运用这个式子进行计算,但是由于分母一样,所以我们常常会舍去分母,但是这样的话是否为垃圾邮件的概率两者想加不为1,所以要都计算,在比大小,判断是否为垃圾邮件

可以看出朴素贝叶斯模型的误差还是比较小的,有95%左右的正确率。
# -*- coding: utf-8 -*-import numpy as npdef readMatrix(file):    fd = open(file, 'r')    hdr = fd.readline()   #第一行数据    rows, cols = [int(s) for s in fd.readline().strip().split()]   #读取第二行数据,以空格分割转化为列表s储存并让rows等于列表中第一个元素,并让cols为列表中第二个元素    tokens = fd.readline().strip().split() #读取第三行数据,以空格分开储存在列表tokens中    matrix = np.zeros((rows, cols))    Y = []    for i, line in enumerate(fd):          #i代表位置,line代表字母        nums = [int(x) for x in line.strip().split()]   #nums是提取的数字        Y.append(nums[0])                    #Y代表是否为垃圾邮件        kv = np.array(nums[1:])              #kv为后列数据        k = np.cumsum(kv[:-1:2])        v = kv[1::2]        matrix[i, k] = v                     #训练数据中matrix为2144*1448,tokens为1448,y为2144,一共2144个数据,1448个特征xdef nb_train(matrix, list,category):    state0 = [0] * len(list)    state1 = [0] * len(list)    count_state0=0    count_state1=0    for i in range(len(matrix)):        if category[i]== 0:            state0 = state0 + matrix[i]            count_state0=count_state0+1        else:            state1 = state1 + matrix[i]            count_state1=count_state1+1    state0=state0/(len(matrix)*len(matrix[0]))    state1=state1/(len(matrix)*len(matrix[0]))    for i in range(len(state0)):          #laplace平滑        if state0[i]==0:            state0[i]=float(1)/(len(matrix)*len(matrix[0])+len(matrix))    for i in range(len(state1)):          #laplace平滑        if state1[i]==0:            state1[i]=float(1)/(len(matrix)*len(matrix[0])+len(matrix))    proportion_state0=float(count_state0)/(count_state0+count_state1)    proportion_state1=float(count_state1)/(count_state0+count_state1)    return state0,state1,proportion_state0,proportion_state1def nb_test(matrix,state0, state1, proportion_state0, proportion_state1):              #测试数据中matrix为800*1448,tokens为1448,y为800,一共800个数据,1448个特征x    output = np.zeros(matrix.shape[0])                                                 #对于普通概率取对数    output0=[]    output1=[]    for i in range(len(matrix)):        possibility0=0        possibility1=0        for j in range(len(matrix[0])):            while matrix[i][j]>=1:                possibility0 = possibility0+np.log(state0[j])                possibility1 = possibility1+np.log(state1[j])                matrix[i][j] = matrix[i][j]-1        possibility0=possibility0+np.log(proportion_state0)        possibility1=possibility1+np.log(proportion_state1)        output0.append(possibility0)        output1.append(possibility1)    for i in range(len(output1)):        if output0[i]<output1[i]:            output[i]=1        else:            output[i]=0    return output# def nb_test(matrix,state0, state1, proportion_state0, proportion_state1):              #测试数据中matrix为800*1448,tokens为1448,y为800,一共800个数据,1448个特征x#     output1 = np.zeros(matrix.shape[0])                                                #利用普通朴素贝叶斯算法,出现了过多概率为0的位置#     for i in range(len(matrix)):#         possibility=1#         for j in range(len(matrix[0])):#             while matrix[i][j]>=1 :#                 possibility=possibility*state0[j]#                 matrix[i][j] = matrix[i][j]-1#         possibility=possibility*proportion_state0#         output[i]=possibility#     return outputdef evaluate(output, label):    error = (output != label).sum() * 1. / len(output)    print 'Error: %1.4f' % errordef main():    trainMatrix, tokenlist, trainCategory = readMatrix('MATRIX.TRAIN')    testMatrix, tokenlist, testCategory = readMatrix('MATRIX.TEST')    state0, state1, proportion_state0, proportion_state1 = nb_train(trainMatrix,tokenlist,trainCategory)    output = nb_test(testMatrix,state0, state1, proportion_state0, proportion_state1)    evaluate(output, testCategory)    returnif __name__ == '__main__':    main()


阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 wps文字重叠怎么办 mac office激活怎么办 浏览器键盘失效怎么办 华为浏览器出错怎么办 钢化膜不吸附怎么办 小米usb打不开怎么办 小米音箱死机怎么办 手机连不上wlan怎么办 华为连不上wlan怎么办 电脑wifi连不上怎么办 由器连不上网怎么办 wifi连接不了怎么办 华硕连不上wifi怎么办 手机内屏摔坏了怎么办? wifi未联网怎么办 win8网络受限怎么办 华为内存不够怎么办 新疆信号差怎么办? 家里信号不好怎么办 华为计算器旋转怎么办 手机越来越耗电怎么办 华为p20pro发热怎么办 方舟手游卡锁屏怎么办? 被源德盛起诉怎么办 360n6pro进水怎么办 华为安全模式怎么办 手套模式没有怎么办 手机老跳屏怎么办 阅读障碍怎么办 mate10振动弱怎么办 银行卡弯曲怎么办 银行卡吞了怎么办 银行卡折弯了怎么办 oppo手机卡怎么办2 硬塑手机壳脏了怎么办 无法导入vcard怎么办 华为微信打不开怎么办 保密柜打不开怎么办 imei被盗了怎么办 草坪黄了怎么办 华为v9主屏有个圆点怎么办