【机器学习】- 作业3: 基于贝叶斯的垃圾邮件识别

课程链接: 清华大学驭风计划

代码仓库:Victor94-king/MachineLearning: MachineLearning basic introduction (github.com)


驭风计划是由清华大学老师教授的,其分为四门课,包括: 机器学习(张敏教授) , 深度学习(胡晓林教授), 计算机语言(刘知远教授) 以及数据结构与算法(邓俊辉教授)。本人是综合成绩第一名,除了数据结构与算法其他单科均为第一名。代码和报告均为本人自己实现,由于篇幅限制,只展示任务布置以及关键代码,如果需要报告或者代码可以私聊博主



机器学习部分授课老师为张敏教授,主要主要通过介绍决策树,线性回归,贝叶斯模型,SVM算法,K近邻算法,Kmeans算法以及集成学习算法等入门机器学习。


有任何疑问或者问题,也欢迎私信博主,大家可以相互讨论交流哟~~



本次作业以垃圾邮件分类任务为基础,要求提取文本特征并使用朴素贝叶斯算法进行垃圾邮件识别(调用已有工具包或自行实现)。

任务介绍

电子邮件是互联网的一项重要服务,在大家的学习、工作和生活中会广泛使用。但是大家的邮箱常常被各种各样的垃圾邮件填充了。有统计显示,每天互联网上产生的垃圾邮件有几百亿近千亿的量级。因此,对电子邮件服务提供商来说,垃圾邮件过滤是一项重要功能。而朴素贝叶斯算法在垃圾邮件识别任务上一直表现非常好,至今仍然有很多系统在使用朴素贝叶斯算法作为基本的垃圾邮件识别算法。

本次实验数据集来自Trec06的中文垃圾邮件数据集,目录解压后包含三个文件夹,其中data目录下是所有的邮件(未分词),已分词好的邮件在data_cut目录下。邮件分为邮件头部分和正文部分,两部分之间一般有空行隔开。标签数据在label文件夹下,文件中每行是标签和对应的邮件路径。‘spam’表示垃圾邮件,‘ham’表示正常邮件。

本次实验

基本要求:

  1. 提取正文部分的文本特征;
  2. 划分训练集和测试集(可以借助工具包。一般笔记本就足够运行所有数据,认为实现困难或算力不够的同学可以采样一部分数据进行实验。);
  3. 使用朴素贝叶斯算法完成垃圾邮件的分类与预测,要求测试集准确率Accuracy、精准率Precision、召回率Recall均高于0.9(本次实验可以使用已有的一些工具包完成如sklearn);
  4. 对比特征数目(词表大小)对模型效果的影响;
  5. 提交代码和实验报告。

扩展要求:

  1. 邮件头信息有时也可以协助判断垃圾邮件,欢迎学有余力的同学们尝试;
  2. 尝试自行实现朴素贝叶斯算法细节;
  3. 尝试对比不同的概率计算方法。

报告

核心代码

自实现的高斯贝叶斯模型

class MyGaussianNB():
    def __init__(self, smoothing = 1e-9):
        '''
        smoothing: 平滑系数
        '''
        self.smoothing = smoothing
    
    def fit(self, x, y):
        '''
        输入xy
        '''
        self.y_range = np.unique(y) # 标签的可能取值
        self.x_range = x.columns #保存x的列名
        self.nb = dict() #用于存储不同标签下的均值和方差
        
        ##还可以利用groupby函数实现,返回的是dataframe
        # x['lable'] = y
        # mean_value = x.groupby('lable').mean()
        # var_value = x.groupby('lable').vars()

        y = np.array(y)
        for i in self.y_range:
            x_ = x[y == i]
            mean_value =  np.mean(x_ , axis = 0)
            var_value  = np.var(x_,axis = 0 ,ddof = 1)
            pos  = np.log(len(y[y==i])/(len(y)))  ##直接计算对应的标签的lg可能性值
            self.nb[i] = (pos,mean_value,var_value)
        print(self.nb)
        return self.nb #self.nb['ham'][0/1/2:概率/均值/方差][第n个词]

    def predict(self,x):
        """输入所有x预测的x特征,返回预测的y值"""
        result = []
        for i in range(len(x)):
            y_output = self.get_result(x.iloc[i,:])
            result.append(y_output)
        
        return pd.Series(result)


结果

不同特征数下,不同贝叶斯模型的正确率对比
【机器学习】- 作业3: 基于贝叶斯的垃圾邮件识别_第1张图片

你可能感兴趣的:(学堂在线,机器学习,人工智能,算法)