案例:垃圾邮件二分类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a786150017/article/details/78645320

参考博客:http://blog.csdn.net/u013508213/article/details/52326420

【邮件预处理】

%regexprep对字符串查找并替换

A、输入:email_contents

  • 将整封邮件单词转换为小写        lower(email_contents)
  • 去除所有的html格式<>      regexprep(email_contents,'<[^<>]+>', ' ')
  • 将数字替换为'number'            regexprep(email_contents, '[0-9]+','number')
  • 将URL替换为'httpaddr'       regexprep(email_contents, '(http|https)://[^\s]*','httpaddr')
  • 将邮件地址替换为'emailaddr'       regexprep(email_contents,'[^\s]+@[^\s]+', 'emailaddr')
  • 将表示money的符号替换为'dollar'           regexprep(email_contents, '[$]+','dollar')
  • 将单词时态进行还原。e.g  ”discount,discounts, discounted” -> “discount”;”include,including, includes” -> “includ”

B、把每个单词map成索引号组成的向量

处理完后,将邮件映射到一个词表vocabList中,这个词表数据集由垃圾邮件中常出现的高频率词汇组成,得到word_indices:把每个单词map成索引号。          

for i =1:length(vocabList)
        if strcmp(str, vocabList{i})
            word_indices = [word_indices i]; 
        end
end

C、特征提取

对输入邮件,利用word_indices判断其单词是否在词表中出现,输出一个特征提取向量x = [ 00 0 0 1 0 0 0 ... 0 0 0 0 1 ... 0 0 0 1 0 ..]

function x = emailFeatures(word_indices)
    n = 1899;
    x = zeros(n, 1);
    x(word_indices) = 1;
end

【法一:朴素贝叶斯模型】

Train

Classify

算法及代码参见http://blog.csdn.net/a786150017/article/details/78618365

 

【法二:支持向量机】

使用matlab自带库函数来训练SVM。

Train

1)使用线性核来训练数据,出现的情况是在训练集上没有误差,可是在测试集上误差非常大。

分别针对训练集和测试集:

model = svmtrain(X, y, C, @linearKernel);
p = svmPredict(model, X);
fprintf('Training Accuracy: %f\n', mean(double(p == y)) * 100);

2)使用rbf核来训练数据,默认σ值为1,结果欠拟合。调试参数之后,得到了比较好的效果。

model = svmtrain(X, y, 'kernel_function', 'rbf', 'rbf_sigma', 70);

【总结】

SVM方法在测试中的准确率为92%,在调试的时候需要尝试变换核与核参数。

NaiveBayes方法在测试中的准确率到达了98%,并且训练的复杂度低于SVM。

因此就目前的认知来看,NaiveBayes分类器原理更简单,实现与使用的效率比SVM更高。


猜你喜欢

转载自blog.csdn.net/a786150017/article/details/78645320