欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

学点算法做安全之垃圾邮件识别(下)

来源:本站整理 作者:佚名 时间:2017-06-06 TAG: 我要投稿

本文主要以垃圾邮件识别为例,介绍常见的文本处理方法以及常见的文本处理相关的机器学习算法。上半部主要介绍垃圾邮件识别使用的数据集,介绍使用的特征提取方法,包括词袋模型和TF-IDF模型、词汇表模型。本文下半部主要介绍使用的模型以及对应的验证结果,包括朴素贝叶斯、支持向量基和深度学习。
模型训练与验证
方法一:朴素贝叶斯算法
使用朴素贝叶斯算法,特征提取使用词袋模型,将数据集合随机分配成训练集合和测试集合,其中测试集合比例为40%。
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.4, random_state = 0)
gnb = GaussianNB()
gnb.fit(x_train,y_train)
y_pred=gnb.predict(x_test)
评估结果的准确度和TT、FF、TF、FT四个值。
print metrics.accuracy_score(y_test, y_pred)
print metrics.confusion_matrix(y_test, y_pred)
在词袋最大特征数为5000的情况下,整个系统准确度为94.33%,TT、FF、TF、FT矩阵如表所示。
表1-1 基于词袋模型的朴素贝叶斯验证结果
类型名称
T
F
T
5937
632
F
133
6875
完整输出结果为:
CountVectorizer(analyzer=u’word’, binary=False, decode_error=’ignore’,
dtype=, encoding=u’utf-8′, input=u’content’,
lowercase=True, max_df=1.0, max_features=5000, min_df=1,
ngram_range=(1, 1), preprocessor=None, stop_words=’english’,
strip_accents=’ascii’, token_pattern=u’(?u)\\b\\w\\w+\\b’,
tokenizer=None, vocabulary=None)
0.943278712835
[[5937 632]
[ 133 6785]]
从调优的角度,我们试图分析词袋最大特征数max_features对结果的影响,我们分别计算max_features从1000到10000对评估准确度的影响。
global max_features
a=[]
b=[]
for i in range(1000,20000,2000):
max_features=i
print “max_features=%d” % i
x, y = get_features_by_wordbag()
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.4, random_state=0)
gnb = GaussianNB()
gnb.fit(x_train, y_train)
y_pred = gnb.predict(x_test)
score=metrics.accuracy_score(y_test, y_pred)
a.append(max_features)
b.append(score)
plt.plot(a, b, ‘r’)
可视化结果成图标,结果如图所示,可见max_features值越大,模型评估准确度越高,同时整个系统运算时间也增长,当max_features超过约13000以后,系统准确率反而下降,所以max_features设置为13000左右,系统准确度达到最大,接近96.4%,但是通过实验,当max_features超过5000时计算时间明显过长且对准确率提升不明显,所以折中角度max_features取5000也满足实验要求。

词袋最大特征树对朴素贝叶斯算法预测结果的影响
当max_features设置为13000时系统运行结果为:
CountVectorizer(analyzer=u’word’, binary=False, decode_error=’ignore’,
dtype=, encoding=u’utf-8′, input=u’content’,
lowercase=True, max_df=1.0, max_features=13000, min_df=1,
ngram_range=(1, 1), preprocessor=None, stop_words=’english’,
strip_accents=’ascii’, token_pattern=u’(?u)\\b\\w\\w+\\b’,
tokenizer=None, vocabulary=None)
0.963965299918
[[6369 200]
[ 286 6632]]
使用朴素贝叶斯算法,特征提取使用TF-IDF模型,将数据集合随机分配成训练集合和测试集合,其中测试集合比例为40%。
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.4, random_state = 0)
gnb = GaussianNB()
gnb.fit(x_train,y_train)
y_pred=gnb.predict(x_test)
评估结果的准确度和TT、FF、TF、FT四个值。
print metrics.accuracy_score(y_test, y_pred)
print metrics.confusion_matrix(y_test, y_pred)
在词袋最大特征数为5000的情况下,整个系统准确度为95.91%,TT、FF、TF、FT矩阵如表所示,同等条件下准确率比词袋模型提升。
表1-2 基于TF-IDF模型的朴素贝叶斯验证结果
类型名称
T
F
T
6471
98
F
453
6465
完整输出结果为:
CountVectorizer(analyzer=u’word’, binary=True, decode_error=’ignore’,
dtype=, encoding=u’utf-8′, input=u’content’,
lowercase=True, max_df=1.0, max_features=5000, min_df=1,
ngram_range=(1, 1), preprocessor=None, stop_words=’english’,
strip_accents=’ascii’, token_pattern=u’(?u)\\b\\w\\w+\\b’,
tokenizer=None, vocabulary=None)
TfidfTransformer(norm=u’l2′, smooth_idf=False, sublinear_tf=False,
use_idf=True)
NB and wordbag
0.959145844146
[[6471 98]
[ 453 6465]]
方法二:支持向量基算法
使用支持向量基算法,特征提取使用词袋模型,将数据集合随机分配成训练集合和测试集合,其中测试集合比例为40%。
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.4, random_state = 0)
clf = svm.SVC()
clf.fit(x_train, y_train)
y_pred = clf.predict(x_test)
评估结果的准确度和TT、FF、TF、FT四个值。
print metrics.accuracy_score(y_test, y_pred)
print metrics.confusion_matrix(y_test, y_pred)
在词袋最大特征数为5000的情况下,整个系统准确度为90.61%,TT、FF、TF、FT矩阵如表1-3 所示,同等条件下准确率比词袋模型提升。

[1] [2] [3]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载