EE5907-CA1

数据

1. 数据描述

  1. 数据集:SPAM E-mail Database。包含4601封邮件,每个样本有57维特征和一个标签(1=spam,0=!spam)

  2. 具体:

  • Xtrain
    • 3065x57 double
  • ytrain
    • 3065x1 double
  • Xtest
    • 1536x57 double
  • ytest
    • 1536x1 double
  1. 描述:详情
  • 包括:

    • Spam 1813 (39.4%)
    • Non-Spam 2788 (60.6%)
  • 特征:

    • 48 个word_freq_WORD类型的连续实数[0,100]属性 = 电子邮件中匹配WORD的单词的百分比
      • 即100 *(“word”在邮件中出现的次数)/电子邮件的总字数。在本例中,“word”是由非字母数字字符或字符串结束符限定的任何字母数字字符字符串。
    • 6 个char_freq_CHAR类型的连续实数[0,100]属性 = 电子邮件中匹配CHAR的字符百分比
      • 即100 *(“char”出现次数)/电子邮件中的字符总数
    • 1 个连续实数[1,…]属性类型为capital_run_length_average = 连续大写字母序列的平均长度
    • 1 个连续整数[1,…]属性类型为capital_run_length_longest = 最长连续大写字母序列的长度
    • 1 个连续整数[1,…]属性类型为capital_run_length_total = 连续的大写字母序列的长度之和 = 电子邮件中大写字母的总数
  • 缺失:None

2. 数据处理

可以尝试对特征进行不同的预处理:

  1. log-transform:对于每个特征使用ln(xij + 0.1)进行转换
  2. binarization: 对特征进行二值化,如果大于0就设置为1,否则设置为0

Beta-binomial朴素贝叶斯

题目描述:

在数据处理部分的二值化数据上拟合一个beta-二项朴素贝叶斯分类器。

由于存在大量的垃圾邮件和非垃圾邮件,您不需要在类标签上假设任何先验。换句话说,类别标签的先验λ可以用ML估计,在测试时可以用λ ML作为插值估计。

另一方面,需要为特征分布假设Beta(α,α),对于每个α={0,0.5,1,1.5,2,…,100},在训练数据上拟合分类器并计算其错误率(即,电子邮件分类错误的百分比)。

对于特征(比如计算p(x|y)),请使用朴素贝叶斯(如后验预测)训练并测试。

报告至少需要包含以下内容:

  • 绘制关于α的训练和测试的错误率
  • 当α改变时,你观察到的训练和测试的错误率
  • α=1,10,100时,训练和测试的错误率

思路

1: class 1=spam;

0: class2=!spam

  • 特征xn经过二项处理后,只有0,1

  • 数据(x,y)是58二项分布;

  • 在训练集上建模:

    特征xn是二项,使用每一类的训练样本的特征xn,使用“beta-二项后验预测公式”计算估计x的第n维特征的pdf,即我们会得到class1:2,feature1:57这2*57个二项特征对数似然(放到2x57维矩阵中,每个元素(a,b)表示当y=a时,xb的概率密度);

    以及ML估计的类别先验的对数;

  • 训练+测试(分别在训练集和测试集上进行):

    针对每一个训练/测试数据,分别计算给定特征条件下,类别为1或0的概率。

    即,57个特征对应的二项特征对数似然之和+ML估计类别先验对数;

    将y=1的概率和y=0的概率对比,选择大概率的作为估计的标签y。

  • 错误率:

    对于估计的标签计算分错的样本数量/总样本;

    这个操作对测试集和验证集分别搞一遍

    结果

高斯朴素贝叶斯

题目

在数据处理部分的log转换数据上拟合一个高斯朴素贝叶斯分类器。

由于存在大量的垃圾邮件和非垃圾邮件,您不需要在类标签上假设任何先验。换句话说,类别标签的先验λ可以用ML估计,在测试时可以用λ ML作为插值估计。

对于本练习,只需使用ML估计每个特征的类条件均值和方差(eta),并使用ML估计作为测试的插值估计

报告至少需要包含以下内容:

  • 关于log转换数据的训练和测试的错误率

思路

单变量高斯的ML估计可以得到μ_ML和σ^2_ML

因为#class=2,λ的ML估计可以用二项的N1/N;

eta是给定class=j时,特征的pdf=N(μ_ML,σ^2_ML)

和上一题类似,还是要先获得eta矩阵,矩阵中的每个元素(i,j)对应给定j类别时,第i维特征的条件概率。该值由ML估计的正态分布得到。

结果

逻辑回归

##题目
对于log转换数据,拟合一个l2正则的逻辑回归模型(牛顿方法+l2正则+从l2正则中排除偏移项)。

对于每个正则参数值λ={1,2,…,9,10,15,20,…95,100},在训练集上拟合逻辑回归模型,并在测试集上计算它的错误率。

报告至少需要包含以下内容:

  • 绘制关于λ的训练和测试的错误率
  • 当λ改变时,你观察到的训练和测试的错误率
  • λ=1,10,100时,训练和测试的错误率

不要忘记在逻辑回归中包括偏倚项,而在l2正则化中排除偏移项。

思路

  • 变量

    • W:(D+1)x1
    • w:Dx1
    • X:Nx(D+1)
    • Xi:(D+1)X1(每个样本的特征)Xi=[1,xi]
    • μ:里面的Xi和W都是D+1维的,Nx1
    • y:Nx1
  • 函数

    • 求μ(W,Xi)—(特征矩阵,w)
    • 求NLLreg(特征矩阵,W,λ)
    • 求greg(特征矩阵,类别矩阵,w,λ)
    • 求Hreg(特征矩阵,类别矩阵,w,λ)

数据预处理

初始化:给X加一维’1’;步长1;阈值0.01

大循环:λ;

初始化w0—57+1维0向量(这个不是偏移向量)

中循环:while NLL<阈值【目的是get:W】

  1. k+1
  2. greg
  3. hreg
  4. W[k+1]—-要存记录
  5. NLL

end

用W预测:训练集+测试集(k,#样本数)

end

计算错误率

画图

结果

k最近邻居

题目

log转换数据上,实现KNN分类器。用欧式距离来测量邻居之间的距离。

对于每个K={1, 2, …9,10,15,20,…95,100},计算训练和测试的错误率。

报告至少需要包含以下内容:

  • 绘制关于K的训练和测试的错误率
  • 当K改变时,你观察到的训练和测试的错误率
  • K=1,10,100时,训练和测试的错误率

思路

先搞个函数来计算两个特征之间的距离;
再搞个函数来计算新样本和矩阵(训练集)中每个样本的距离

测试和训练时调用算距离函数,生成距离矩阵,每个点(i,j)表示新样本i和训练集样本j之间的距离。

对于每一个新样本,根据不同的K,得到距离该样本最近的K个训练点,对比其中类0和类1的比例,将新样本的标签预测为占比大的那个类。

训练集上的测试或许可以有一些tricky,因为生产的距离矩阵是对称的,且对角线值为0。

训练集:dist—30653065
测试集:dist—1536
3065

结果

  • Copyrights © 2021-2022 阿波罗猫

请我喝杯咖啡吧~

支付宝
微信