文章目录

  • 1.读取文件
  • 2.数据预处理
  • 3.模型训练预测
    • 3.1 KNN
    • 3.2 SVM
    • 3.3 Decision Tree
    • 3.4 Random forest
    • 3.5 GBDT
    • 3.6 Bayes
  • 4.算法模型对比
  • 5.总结

1.读取文件

#-*-coding:utf-8 -*-
import os#读取文件索引,把spam ../data/000/000 改为 000/000  1
def read_index_file(file_path):type_dict = {"spam": "1", "ham": "0"}index_file = open(file_path) #../date/full/indexindex_dict = {}try:for line in index_file:arr = line.split(" ")#spam ../data/000/000if len(arr) == 2:key, value = arr# 添加到字段中value = value.replace("../data", "").replace("\n", "")index_dict[value] = type_dict[key.lower()]  #000/000  1, 000/001  0finally:index_file.close()return index_dict# 邮件的文件内容数据读取,return content_dict,From:xxxxxxTo:xxxxxxxDate:xxxxxxxContent:xxxxxxx
def read_file(file_path):file = open(file_path, "r", encoding="gb2312", errors='ignore')content_dict = {}try:is_content = False#初始化为False后,在循环之外for line in file:line = line.strip()if line.startswith("From:"):content_dict['from'] = line[5:]  # From: "pan" <pan@jdl.ac.cn>elif line.startswith("To:"):content_dict['to'] = line[3:]  #To: shi@ccert.edu.cnelif line.startswith("Date:"):content_dict['date'] = line[5:]  #Date: Sun, 14 Aug 2005 10:16:47 +0800elif not line:is_content = True# 处理邮件内容if is_content:if 'content' in content_dict:content_dict['content'] += lineelse:content_dict['content'] = linefinally:file.close()return content_dict# 邮件数据处理,return result_str,"yan"<(8月27-28上海)培训课程>,lu@ccert.edu.cn,Tue 30 Aug 2005 10:08:15 +0800,非财务。。。
def process_file(file_path):content_dict = read_file(file_path)# 进行处理result_str = content_dict.get('from', 'unkown').replace(',', '').strip() + ","result_str += content_dict.get('to', 'unknown').replace(',', '').strip() + ","result_str += content_dict.get('date', 'unknown').replace(',', '').strip() + ","result_str += content_dict.get('content', 'unknown').replace(',', ' ').strip()return result_str#使用函数开始数据处理
index_dict = read_index_file('./data/trec06c/full/index')
# print(index_dict)
list0-215 = os.listdir('./data/trec06c/data-0-215')#list[000,001,002....215]文件夹 D:\hjz-py\Project\垃圾邮件过滤课件及数据\Spam-sorting\data\trec06c\data-0-215# 第一步,首先把每个文件夹中的邮件内容写入一个csv文件,得到 215个文件
#开始把N个文件夹中的file写入N*n个wiriter,'./data/process01_XXX'
for l1 in list0-215: #开始把N个文件夹中的file写入N*n个wiriterl1_path = './data/trec06c/data-0-215'+"/" + l1  #000单个文件夹print('开始处理文件夹' + l1_path)list1 = os.listdir(l1_path)# write_file_path = './data/process01_' + l1write_file_path = './data/process01_' + l1with open(write_file_path, "w", encoding= 'utf-8') as writer:for l2 in list1:l2_path = l1_path + "/" + l2#得到要处理文件的具体路径index_key = "/" + l1 + "/" + l2if index_key in index_dict:content_str = process_file(l2_path)#遍历调用process_file(),得到1) From:xxxxxxTo:xxxxxxxDate:xxxxxxxContent: xxxxxxxcontent_str += "," + index_dict[index_key] + "\n"#加上目标标签特征, From:xxxxxxTo:xxxxxxxDate:xxxxxxxContent: xxxxxxx  1/0writer.writelines(content_str)#第二步:把215个文件再合并写入1个csv文件
with open('./data/result_process01', "w", encoding='utf-8') as writer:for l1 in list0-215:  #000-215file_path= './data/process01_' + l1print("开始合并文件:" + file_path)with open(file_path, encoding = 'utf-8') as file:for line in file:writer.writelines(line)           print(writer)
C:\Anaconda3\python.exe D:/hjz-py/Project/垃圾邮件过滤课件及数据/Spam-sorting/dataProcess.py
开始处理文件夹./data/trec06c/data-0-215/000
开始处理文件夹./data/trec06c/data-0-215/001
开始处理文件夹./data/trec06c/data-0-215/002
开始处理文件夹./data/trec06c/data-0-215/003
开始处理文件夹./data/trec06c/data-0-215/004
开始处理文件夹./data/trec06c/data-0-215/005
开始处理文件夹./data/trec06c/data-0-215/006
开始处理文件夹./data/trec06c/data-0-215/007
开始处理文件夹./data/trec06c/data-0-215/008
开始处理文件夹./data/trec06c/data-0-215/009
开始处理文件夹./data/trec06c/data-0-215/010
开始处理文件夹./data/trec06c/data-0-215/011
开始处理文件夹./data/trec06c/data-0-215/012
开始处理文件夹./data/trec06c/data-0-215/013
开始处理文件夹./data/trec06c/data-0-215/014
开始处理文件夹./data/trec06c/data-0-215/015
开始处理文件夹./data/trec06c/data-0-215/016
开始处理文件夹./data/trec06c/data-0-215/017
开始处理文件夹./data/trec06c/data-0-215/018
开始处理文件夹./data/trec06c/data-0-215/019
开始处理文件夹./data/trec06c/data-0-215/020
开始处理文件夹./data/trec06c/data-0-215/021
开始处理文件夹./data/trec06c/data-0-215/022
开始处理文件夹./data/trec06c/data-0-215/023
开始处理文件夹./data/trec06c/data-0-215/024
开始处理文件夹./data/trec06c/data-0-215/025
开始处理文件夹./data/trec06c/data-0-215/026
开始处理文件夹./data/trec06c/data-0-215/027
开始处理文件夹./data/trec06c/data-0-215/028
开始处理文件夹./data/trec06c/data-0-215/029
开始处理文件夹./data/trec06c/data-0-215/030
开始处理文件夹./data/trec06c/data-0-215/031
开始处理文件夹./data/trec06c/data-0-215/032
开始处理文件夹./data/trec06c/data-0-215/033
开始处理文件夹./data/trec06c/data-0-215/034
开始处理文件夹./data/trec06c/data-0-215/035
开始处理文件夹./data/trec06c/data-0-215/036
开始处理文件夹./data/trec06c/data-0-215/037
开始处理文件夹./data/trec06c/data-0-215/038
开始处理文件夹./data/trec06c/data-0-215/039
开始处理文件夹./data/trec06c/data-0-215/040
开始处理文件夹./data/trec06c/data-0-215/041
开始处理文件夹./data/trec06c/data-0-215/042
开始处理文件夹./data/trec06c/data-0-215/043
开始处理文件夹./data/trec06c/data-0-215/044
开始处理文件夹./data/trec06c/data-0-215/045
开始处理文件夹./data/trec06c/data-0-215/046
开始处理文件夹./data/trec06c/data-0-215/047
开始处理文件夹./data/trec06c/data-0-215/048
开始处理文件夹./data/trec06c/data-0-215/049
开始处理文件夹./data/trec06c/data-0-215/050
开始处理文件夹./data/trec06c/data-0-215/051
开始处理文件夹./data/trec06c/data-0-215/052
开始处理文件夹./data/trec06c/data-0-215/053
开始处理文件夹./data/trec06c/data-0-215/054
开始处理文件夹./data/trec06c/data-0-215/055
开始处理文件夹./data/trec06c/data-0-215/056
开始处理文件夹./data/trec06c/data-0-215/057
开始处理文件夹./data/trec06c/data-0-215/058
开始处理文件夹./data/trec06c/data-0-215/059
开始处理文件夹./data/trec06c/data-0-215/060
开始处理文件夹./data/trec06c/data-0-215/061
开始处理文件夹./data/trec06c/data-0-215/062
开始处理文件夹./data/trec06c/data-0-215/063
开始处理文件夹./data/trec06c/data-0-215/064
开始处理文件夹./data/trec06c/data-0-215/065
开始处理文件夹./data/trec06c/data-0-215/066
开始处理文件夹./data/trec06c/data-0-215/067
开始处理文件夹./data/trec06c/data-0-215/068
开始处理文件夹./data/trec06c/data-0-215/069
开始处理文件夹./data/trec06c/data-0-215/070
开始处理文件夹./data/trec06c/data-0-215/071
开始处理文件夹./data/trec06c/data-0-215/072
开始处理文件夹./data/trec06c/data-0-215/073
开始处理文件夹./data/trec06c/data-0-215/074
开始处理文件夹./data/trec06c/data-0-215/075
开始处理文件夹./data/trec06c/data-0-215/076
开始处理文件夹./data/trec06c/data-0-215/077
开始处理文件夹./data/trec06c/data-0-215/078
开始处理文件夹./data/trec06c/data-0-215/079
开始处理文件夹./data/trec06c/data-0-215/080
开始处理文件夹./data/trec06c/data-0-215/081
开始处理文件夹./data/trec06c/data-0-215/082
开始处理文件夹./data/trec06c/data-0-215/083
开始处理文件夹./data/trec06c/data-0-215/084
开始处理文件夹./data/trec06c/data-0-215/085
开始处理文件夹./data/trec06c/data-0-215/086
开始处理文件夹./data/trec06c/data-0-215/087
开始处理文件夹./data/trec06c/data-0-215/088
开始处理文件夹./data/trec06c/data-0-215/089
开始处理文件夹./data/trec06c/data-0-215/090
开始处理文件夹./data/trec06c/data-0-215/091
开始处理文件夹./data/trec06c/data-0-215/092
开始处理文件夹./data/trec06c/data-0-215/093
开始处理文件夹./data/trec06c/data-0-215/094
开始处理文件夹./data/trec06c/data-0-215/095
开始处理文件夹./data/trec06c/data-0-215/096
开始处理文件夹./data/trec06c/data-0-215/097
开始处理文件夹./data/trec06c/data-0-215/098
开始处理文件夹./data/trec06c/data-0-215/099
开始处理文件夹./data/trec06c/data-0-215/100
开始处理文件夹./data/trec06c/data-0-215/101
开始处理文件夹./data/trec06c/data-0-215/102
开始处理文件夹./data/trec06c/data-0-215/103
开始处理文件夹./data/trec06c/data-0-215/104
开始处理文件夹./data/trec06c/data-0-215/105
开始处理文件夹./data/trec06c/data-0-215/106
开始处理文件夹./data/trec06c/data-0-215/107
开始处理文件夹./data/trec06c/data-0-215/108
开始处理文件夹./data/trec06c/data-0-215/109
开始处理文件夹./data/trec06c/data-0-215/110
开始处理文件夹./data/trec06c/data-0-215/111
开始处理文件夹./data/trec06c/data-0-215/112
开始处理文件夹./data/trec06c/data-0-215/113
开始处理文件夹./data/trec06c/data-0-215/114
开始处理文件夹./data/trec06c/data-0-215/115
开始处理文件夹./data/trec06c/data-0-215/116
开始处理文件夹./data/trec06c/data-0-215/117
开始处理文件夹./data/trec06c/data-0-215/118
开始处理文件夹./data/trec06c/data-0-215/119
开始处理文件夹./data/trec06c/data-0-215/120
开始处理文件夹./data/trec06c/data-0-215/121
开始处理文件夹./data/trec06c/data-0-215/122
开始处理文件夹./data/trec06c/data-0-215/123
开始处理文件夹./data/trec06c/data-0-215/124
开始处理文件夹./data/trec06c/data-0-215/125
开始处理文件夹./data/trec06c/data-0-215/126
开始处理文件夹./data/trec06c/data-0-215/127
开始处理文件夹./data/trec06c/data-0-215/128
开始处理文件夹./data/trec06c/data-0-215/129
开始处理文件夹./data/trec06c/data-0-215/130
开始处理文件夹./data/trec06c/data-0-215/131
开始处理文件夹./data/trec06c/data-0-215/132
开始处理文件夹./data/trec06c/data-0-215/133
开始处理文件夹./data/trec06c/data-0-215/134
开始处理文件夹./data/trec06c/data-0-215/135
开始处理文件夹./data/trec06c/data-0-215/136
开始处理文件夹./data/trec06c/data-0-215/137
开始处理文件夹./data/trec06c/data-0-215/138
开始处理文件夹./data/trec06c/data-0-215/139
开始处理文件夹./data/trec06c/data-0-215/140
开始处理文件夹./data/trec06c/data-0-215/141
开始处理文件夹./data/trec06c/data-0-215/142
开始处理文件夹./data/trec06c/data-0-215/143
开始处理文件夹./data/trec06c/data-0-215/144
开始处理文件夹./data/trec06c/data-0-215/145
开始处理文件夹./data/trec06c/data-0-215/146
开始处理文件夹./data/trec06c/data-0-215/147
开始处理文件夹./data/trec06c/data-0-215/148
开始处理文件夹./data/trec06c/data-0-215/149
开始处理文件夹./data/trec06c/data-0-215/150
开始处理文件夹./data/trec06c/data-0-215/151
开始处理文件夹./data/trec06c/data-0-215/152
开始处理文件夹./data/trec06c/data-0-215/153
开始处理文件夹./data/trec06c/data-0-215/154
开始处理文件夹./data/trec06c/data-0-215/155
开始处理文件夹./data/trec06c/data-0-215/156
开始处理文件夹./data/trec06c/data-0-215/157
开始处理文件夹./data/trec06c/data-0-215/158
开始处理文件夹./data/trec06c/data-0-215/159
开始处理文件夹./data/trec06c/data-0-215/160
开始处理文件夹./data/trec06c/data-0-215/161
开始处理文件夹./data/trec06c/data-0-215/162
开始处理文件夹./data/trec06c/data-0-215/163
开始处理文件夹./data/trec06c/data-0-215/164
开始处理文件夹./data/trec06c/data-0-215/165
开始处理文件夹./data/trec06c/data-0-215/166
开始处理文件夹./data/trec06c/data-0-215/167
开始处理文件夹./data/trec06c/data-0-215/168
开始处理文件夹./data/trec06c/data-0-215/169
开始处理文件夹./data/trec06c/data-0-215/170
开始处理文件夹./data/trec06c/data-0-215/171
开始处理文件夹./data/trec06c/data-0-215/172
开始处理文件夹./data/trec06c/data-0-215/173
开始处理文件夹./data/trec06c/data-0-215/174
开始处理文件夹./data/trec06c/data-0-215/175
开始处理文件夹./data/trec06c/data-0-215/176
开始处理文件夹./data/trec06c/data-0-215/177
开始处理文件夹./data/trec06c/data-0-215/178
开始处理文件夹./data/trec06c/data-0-215/179
开始处理文件夹./data/trec06c/data-0-215/180
开始处理文件夹./data/trec06c/data-0-215/181
开始处理文件夹./data/trec06c/data-0-215/182
开始处理文件夹./data/trec06c/data-0-215/183
开始处理文件夹./data/trec06c/data-0-215/184
开始处理文件夹./data/trec06c/data-0-215/185
开始处理文件夹./data/trec06c/data-0-215/186
开始处理文件夹./data/trec06c/data-0-215/187
开始处理文件夹./data/trec06c/data-0-215/188
开始处理文件夹./data/trec06c/data-0-215/189
开始处理文件夹./data/trec06c/data-0-215/190
开始处理文件夹./data/trec06c/data-0-215/191
开始处理文件夹./data/trec06c/data-0-215/192
开始处理文件夹./data/trec06c/data-0-215/193
开始处理文件夹./data/trec06c/data-0-215/194
开始处理文件夹./data/trec06c/data-0-215/195
开始处理文件夹./data/trec06c/data-0-215/196
开始处理文件夹./data/trec06c/data-0-215/197
开始处理文件夹./data/trec06c/data-0-215/198
开始处理文件夹./data/trec06c/data-0-215/199
开始处理文件夹./data/trec06c/data-0-215/200
开始处理文件夹./data/trec06c/data-0-215/201
开始处理文件夹./data/trec06c/data-0-215/202
开始处理文件夹./data/trec06c/data-0-215/203
开始处理文件夹./data/trec06c/data-0-215/204
开始处理文件夹./data/trec06c/data-0-215/205
开始处理文件夹./data/trec06c/data-0-215/206
开始处理文件夹./data/trec06c/data-0-215/207
开始处理文件夹./data/trec06c/data-0-215/208
开始处理文件夹./data/trec06c/data-0-215/209
开始处理文件夹./data/trec06c/data-0-215/210
开始处理文件夹./data/trec06c/data-0-215/211
开始处理文件夹./data/trec06c/data-0-215/212
开始处理文件夹./data/trec06c/data-0-215/213
开始处理文件夹./data/trec06c/data-0-215/214
开始处理文件夹./data/trec06c/data-0-215/215
开始合并文件:./data/process01_000
开始合并文件:./data/process01_001
开始合并文件:./data/process01_002
开始合并文件:./data/process01_003
开始合并文件:./data/process01_004
开始合并文件:./data/process01_005
开始合并文件:./data/process01_006
开始合并文件:./data/process01_007
开始合并文件:./data/process01_008
开始合并文件:./data/process01_009
开始合并文件:./data/process01_010
开始合并文件:./data/process01_011
开始合并文件:./data/process01_012
开始合并文件:./data/process01_013
开始合并文件:./data/process01_014
开始合并文件:./data/process01_015
开始合并文件:./data/process01_016
开始合并文件:./data/process01_017
开始合并文件:./data/process01_018
开始合并文件:./data/process01_019
开始合并文件:./data/process01_020
开始合并文件:./data/process01_021
开始合并文件:./data/process01_022
开始合并文件:./data/process01_023
开始合并文件:./data/process01_024
开始合并文件:./data/process01_025
开始合并文件:./data/process01_026
开始合并文件:./data/process01_027
开始合并文件:./data/process01_028
开始合并文件:./data/process01_029
开始合并文件:./data/process01_030
开始合并文件:./data/process01_031
开始合并文件:./data/process01_032
开始合并文件:./data/process01_033
开始合并文件:./data/process01_034
开始合并文件:./data/process01_035
开始合并文件:./data/process01_036
开始合并文件:./data/process01_037
开始合并文件:./data/process01_038
开始合并文件:./data/process01_039
开始合并文件:./data/process01_040
开始合并文件:./data/process01_041
开始合并文件:./data/process01_042
开始合并文件:./data/process01_043
开始合并文件:./data/process01_044
开始合并文件:./data/process01_045
开始合并文件:./data/process01_046
开始合并文件:./data/process01_047
开始合并文件:./data/process01_048
开始合并文件:./data/process01_049
开始合并文件:./data/process01_050
开始合并文件:./data/process01_051
开始合并文件:./data/process01_052
开始合并文件:./data/process01_053
开始合并文件:./data/process01_054
开始合并文件:./data/process01_055
开始合并文件:./data/process01_056
开始合并文件:./data/process01_057
开始合并文件:./data/process01_058
开始合并文件:./data/process01_059
开始合并文件:./data/process01_060
开始合并文件:./data/process01_061
开始合并文件:./data/process01_062
开始合并文件:./data/process01_063
开始合并文件:./data/process01_064
开始合并文件:./data/process01_065
开始合并文件:./data/process01_066
开始合并文件:./data/process01_067
开始合并文件:./data/process01_068
开始合并文件:./data/process01_069
开始合并文件:./data/process01_070
开始合并文件:./data/process01_071
开始合并文件:./data/process01_072
开始合并文件:./data/process01_073
开始合并文件:./data/process01_074
开始合并文件:./data/process01_075
开始合并文件:./data/process01_076
开始合并文件:./data/process01_077
开始合并文件:./data/process01_078
开始合并文件:./data/process01_079
开始合并文件:./data/process01_080
开始合并文件:./data/process01_081
开始合并文件:./data/process01_082
开始合并文件:./data/process01_083
开始合并文件:./data/process01_084
开始合并文件:./data/process01_085
开始合并文件:./data/process01_086
开始合并文件:./data/process01_087
开始合并文件:./data/process01_088
开始合并文件:./data/process01_089
开始合并文件:./data/process01_090
开始合并文件:./data/process01_091
开始合并文件:./data/process01_092
开始合并文件:./data/process01_093
开始合并文件:./data/process01_094
开始合并文件:./data/process01_095
开始合并文件:./data/process01_096
开始合并文件:./data/process01_097
开始合并文件:./data/process01_098
开始合并文件:./data/process01_099
开始合并文件:./data/process01_100
开始合并文件:./data/process01_101
开始合并文件:./data/process01_102
开始合并文件:./data/process01_103
开始合并文件:./data/process01_104
开始合并文件:./data/process01_105
开始合并文件:./data/process01_106
开始合并文件:./data/process01_107
开始合并文件:./data/process01_108
开始合并文件:./data/process01_109
开始合并文件:./data/process01_110
开始合并文件:./data/process01_111
开始合并文件:./data/process01_112
开始合并文件:./data/process01_113
开始合并文件:./data/process01_114
开始合并文件:./data/process01_115
开始合并文件:./data/process01_116
开始合并文件:./data/process01_117
开始合并文件:./data/process01_118
开始合并文件:./data/process01_119
开始合并文件:./data/process01_120
开始合并文件:./data/process01_121
开始合并文件:./data/process01_122
开始合并文件:./data/process01_123
开始合并文件:./data/process01_124
开始合并文件:./data/process01_125
开始合并文件:./data/process01_126
开始合并文件:./data/process01_127
开始合并文件:./data/process01_128
开始合并文件:./data/process01_129
开始合并文件:./data/process01_130
开始合并文件:./data/process01_131
开始合并文件:./data/process01_132
开始合并文件:./data/process01_133
开始合并文件:./data/process01_134
开始合并文件:./data/process01_135
开始合并文件:./data/process01_136
开始合并文件:./data/process01_137
开始合并文件:./data/process01_138
开始合并文件:./data/process01_139
开始合并文件:./data/process01_140
开始合并文件:./data/process01_141
开始合并文件:./data/process01_142
开始合并文件:./data/process01_143
开始合并文件:./data/process01_144
开始合并文件:./data/process01_145
开始合并文件:./data/process01_146
开始合并文件:./data/process01_147
开始合并文件:./data/process01_148
开始合并文件:./data/process01_149
开始合并文件:./data/process01_150
开始合并文件:./data/process01_151
开始合并文件:./data/process01_152
开始合并文件:./data/process01_153
开始合并文件:./data/process01_154
开始合并文件:./data/process01_155
开始合并文件:./data/process01_156
开始合并文件:./data/process01_157
开始合并文件:./data/process01_158
开始合并文件:./data/process01_159
开始合并文件:./data/process01_160
开始合并文件:./data/process01_161
开始合并文件:./data/process01_162
开始合并文件:./data/process01_163
开始合并文件:./data/process01_164
开始合并文件:./data/process01_165
开始合并文件:./data/process01_166
开始合并文件:./data/process01_167
开始合并文件:./data/process01_168
开始合并文件:./data/process01_169
开始合并文件:./data/process01_170
开始合并文件:./data/process01_171
开始合并文件:./data/process01_172
开始合并文件:./data/process01_173
开始合并文件:./data/process01_174
开始合并文件:./data/process01_175
开始合并文件:./data/process01_176
开始合并文件:./data/process01_177
开始合并文件:./data/process01_178
开始合并文件:./data/process01_179
开始合并文件:./data/process01_180
开始合并文件:./data/process01_181
开始合并文件:./data/process01_182
开始合并文件:./data/process01_183
开始合并文件:./data/process01_184
开始合并文件:./data/process01_185
开始合并文件:./data/process01_186
开始合并文件:./data/process01_187
开始合并文件:./data/process01_188
开始合并文件:./data/process01_189
开始合并文件:./data/process01_190
开始合并文件:./data/process01_191
开始合并文件:./data/process01_192
开始合并文件:./data/process01_193
开始合并文件:./data/process01_194
开始合并文件:./data/process01_195
开始合并文件:./data/process01_196
开始合并文件:./data/process01_197
开始合并文件:./data/process01_198
开始合并文件:./data/process01_199
开始合并文件:./data/process01_200
开始合并文件:./data/process01_201
开始合并文件:./data/process01_202
开始合并文件:./data/process01_203
开始合并文件:./data/process01_204
开始合并文件:./data/process01_205
开始合并文件:./data/process01_206
开始合并文件:./data/process01_207
开始合并文件:./data/process01_208
开始合并文件:./data/process01_209
开始合并文件:./data/process01_210
开始合并文件:./data/process01_211
开始合并文件:./data/process01_212
开始合并文件:./data/process01_213
开始合并文件:./data/process01_214
开始合并文件:./data/process01_215
<_io.TextIOWrapper name='./data/result_process01' mode='w' encoding='utf-8'>Process finished with exit code 0

2.数据预处理

import pandas as pd
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import re
import time
import jieba# mpl.rcParams['font.sans-serif'] = [u'simHei']#ָ改为指定字体“黑体”
# mpl.rcParams['axes.unicode_minus'] = False #使得坐标轴保存负号变更为方块,用来正常显示负号
# plt.title(u'我是中文')
# get_ipython().magic(u'matplotlib tk')df = pd.read_csv('./data/result_process01', sep = ',', header = None, names= ['from','to', 'date', 'content','label'])
print(df.head(10))

def extract_email_server_address(strl):#发送接收地址提取it = re.findall(r"@([A-Za-z0-9]*\.[A-Za-z0-9\.]+)", str(strl))#正则匹配result = ''if len(it)>0:result = it[0]else:result = 'unknown'return resultdf['from_address'] = pd.Series(map(lambda str : extract_email_server_address(str), df['from']))#map映射并添加
df['to_address'] = pd.Series(map(lambda str: extract_email_server_address(str), df['to']))# print(df.head(10))
# print("========to address=======================")
print("="*10 + 'to address' + "="*20)#也可以这样写
print(df.to_address.value_counts().head(5))#
print("总邮件接受服务器类别数量为:" + str(df.to_address.unique().shape))
print("="*10 + 'from address' + "= "*20)
print(df.from_address.value_counts().head(5))
print("邮件发送服务器类别数量为:" + str(df.from_address.unique().shape))
from_address_df = df.from_address.value_counts().to_frame()#转为结构化的输出,输出带索引
# print(from_address_df)
len_less_10_from_address_count = from_address_df[from_address_df.from_address<=10].shape
print("发送邮件数量小于10封的服务器数量为:" + str(len_less_10_from_address_count))
总邮件接受服务器类别数量为:(12,)
==========from address= = = = = = = = = = = = = = = = = = = =
163.com                  7500
mail.tsinghua.edu.cn     6498
126.com                  5822
tom.com                  4075
mails.tsinghua.edu.cn    3205
Name: from_address, dtype: int64
邮件发送服务器类别数量为:(3567,)
np.unique(list(map(lambda t: len(str(t).strip()), df['date'])))#根据长度去特征
print(np.unique(list(map(lambda t: len(str(t).strip()), df['date']))))
np.unique(list(filter(lambda t: len(str(t).strip())==30, df['date'])))
print(np.unique(list(filter(lambda t: len(str(t).strip())==31, df['date']))))
def extract_email_date(str1):if not isinstance(str1, str):str1 = str(str1)str_len = len(str1)week = ""hour = ""time_quantum = ""      if str_len < 10:week = "unknown"hour = "unknown"time_quantum = "unknown"passelif str_len == 16:rex = r"(\d{2}):\d{2}"#只取冒号前面的it = re.findall(rex, str1)if len(it) == 1:hour = it[0]else:hour = "unknown"week = "Fri"time_quantum = "0"passelif str_len == 19: #['Sep 23 2005 1:04 AM']week = "Sep"hour = "01"time_quantum = "3"passelif str_len == 21: #['August 24 2005 5:00pm'week ="Wed"hour = "17"time_quantum = "1"passelse:               #'Fri 2 Sep 2005 08:17:50'  Wed 31 Aug 2005 15:06:36 rex = r"([A-Za-z]+\d?[A-Za-z]*) .*?(\d{2}):\d{2}:\d{2}.*"# 加问号保险些# 'Fri 23 Sep 2005 09:39:39 +0800 X-Priority: 3 X-Mailer: FoxMail'it = re.findall(rex, str1)if len(it) == 1 and len(it[0]) ==2:week = it[0][0][-3:]hour = it[0][1]int_hour = int(hour)if int_hour <8:time_quantum = "3"elif int_hour <13:time_quantum = "0"elif int_hour <19:time_quantum = "1"else:time_quantum = "2"passelse:week = "unknown"hour = "unknown"time_quantum = 'unknown'week = week.lower()hour = hour.lower()time_quantum = time_quantum.lower()return(week, hour, time_quantum)
#数据转换
date_time_extract_result = list(map(lambda st: extract_email_date(st), df['date']))
df['date_week'] = pd.Series(map(lambda t: t[0], date_time_extract_result))
df['date_hour'] = pd.Series(map(lambda t: t[1], date_time_extract_result))
df['date_time_quantum'] = pd.Series(map(lambda t: t[2], date_time_extract_result))
print(df.head(4))print("======星期属性字段的描述==========")
print(df.date_week.value_counts().head(3))
print(df[['date_week', 'label']].groupby(['date_week', 'label'])['label'].count())print("======小时属性字段的描述==========")
print(df.date_hour.value_counts().head(3))
print(df[['date_hour', 'label']].groupby(['date_hour', 'label'])['label'].count())print("======时间段属性字段的描述==========")
print(df.date_hour.value_counts().head(3))
print(df[['date_time_quantum', 'label']].groupby(['date_time_quantum', 'label'])['label'].count())            df['has_date'] = df.apply(lambda c: 0 if c['date_week'] == 'unknown' else 1, axis=1)
print(df.head(4))
#===========================开始分词==============================================
print('='*30 + '现在开始分词,请耐心等待5分钟。。。' + '='*20)
df['content'] = df['content'].astype('str')
df['jieba_cut_content'] = list(map(lambda st: "  ".join(jieba.cut(st)), df['content']))
df.head(4)
                                     from                 to  \
0                    yan<(8月27-28上海)培训课程>    lu@ccert.edu.cn
1                     pan <pan@jdl.ac.cn>   shi@ccert.edu.cn
2    =?GB2312?B?1cW6o8TP?= <jian@163.con>  xing@ccert.edu.cn
3  =?GB2312?B?tPq/qreixrE=?= <pan@12.com>  ling@ccert.edu.cn   date  \
0  Tue 30 Aug 2005 10:08:15 +0800
1  Sun 14 Aug 2005 10:16:47 +0800
2  Sun 14 Aug 2005 10:17:57 +0800
3  Sun 14 Aug 2005 10:19:02 +0800   content  label from_address  \
0  非财务纠淼牟莆窆芾-(沙盘模拟)------如何运用财务岳硖岣吖芾砑ㄐ[课 程 背 景]每一...    1.0      unknown
1  讲的是孔子后人的故事。一个老领导回到家乡,跟儿子感情不和,跟贪财的孙子孔为本和睦。老领导的弟...    0.0    jdl.ac.cn
2  尊敬的贵公司(财务/经理)负责人您好!我是深圳金海实业有限公司(广州。东莞)等省市有分公司。...    1.0      163.con
3  贵公司负责人(经理/财务)您好:深圳市华龙公司受多家公司委托向外低点代开部分增值税电脑发票(...    1.0       12.com   to_address date_week date_hour date_time_quantum
0  ccert.edu.cn       tue        10                 0
1  ccert.edu.cn       sun        10                 0
2  ccert.edu.cn       sun        10                 0
3  ccert.edu.cn       sun        10                 0
print("======星期属性字段的描述==========")
print(df.date_week.value_counts().head(3))
print(df[['date_week', 'label']].groupby(['date_week', 'label'])['label'].count())print("======小时属性字段的描述==========")
print(df.date_hour.value_counts().head(3))
print(df[['date_hour', 'label']].groupby(['date_hour', 'label'])['label'].count())print("======时间段属性字段的描述==========")
print(df.date_hour.value_counts().head(3))
print(df[['date_time_quantum', 'label']].groupby(['date_time_quantum', 'label'])['label'].count())            df['has_date'] = df.apply(lambda c: 0 if c['date_week'] == 'unknown' else 1, axis=1)
print(df.head(4))
======星期属性字段的描述==========
fri    10859
sat    10316
thu     9780
Name: date_week, dtype: int64
date_week  label
fri        0.0      38841.0      6975
mon        0.0      25681.0      5491
sat        0.0      36811.0      6635
sep        0.0         1
sun        0.0      27851.0      5724
thu        0.0      33301.0      6450
tue        0.0      27331.0      5399
unknown    1.0       553
wed        0.0      27841.0      5626
Name: label, dtype: int64
======小时属性字段的描述==========
19    2835
16    2772
15    2750
Name: date_hour, dtype: int64
date_hour  label
00         0.0       9041.0      1716
01         0.0       9251.0      1791
02         0.0       8681.0      1736
03         0.0       8391.0      1682
04         0.0       8241.0      1771
05         0.0       8221.0      1791
06         0.0       7581.0      1748
07         0.0       8631.0      1775
08         0.0       8011.0      1732
09         0.0       8961.0      1795
10         0.0       8741.0      1847
11         0.0       8891.0      1779
12         0.0       9361.0      1740
13         0.0       9091.0      1712
14         0.0       9451.0      1757
15         0.0       9791.0      1771
16         0.0       9881.0      1784
17         0.0       9401.0      1802
18         0.0       9951.0      1744
19         0.0       9861.0      1849
20         0.0      10021.0      1744
21         0.0       9091.0      1723
22         0.0       9791.0      1747
23         0.0       9351.0      1763
24         1.0         1
unknown    1.0       553
Name: label, dtype: int64
======时间段属性字段的描述==========
19    2835
16    2772
15    2750
Name: date_hour, dtype: int64
date_time_quantum  label
0                  0.0       43961.0       8893
1                  0.0       57561.0      10570
2                  0.0       48111.0       8827
3                  0.0       68031.0      14010
unknown            1.0        553
Name: label, dtype: int64from                 to  \
0                    yan<(8月27-28上海)培训课程>    lu@ccert.edu.cn
1                     pan <pan@jdl.ac.cn>   shi@ccert.edu.cn
2    =?GB2312?B?1cW6o8TP?= <jian@163.con>  xing@ccert.edu.cn
3  =?GB2312?B?tPq/qreixrE=?= <pan@12.com>  ling@ccert.edu.cn   date  \
0  Tue 30 Aug 2005 10:08:15 +0800
1  Sun 14 Aug 2005 10:16:47 +0800
2  Sun 14 Aug 2005 10:17:57 +0800
3  Sun 14 Aug 2005 10:19:02 +0800   content  label from_address  \
0  非财务纠淼牟莆窆芾-(沙盘模拟)------如何运用财务岳硖岣吖芾砑ㄐ[课 程 背 景]每一...    1.0      unknown
1  讲的是孔子后人的故事。一个老领导回到家乡,跟儿子感情不和,跟贪财的孙子孔为本和睦。老领导的弟...    0.0    jdl.ac.cn
2  尊敬的贵公司(财务/经理)负责人您好!我是深圳金海实业有限公司(广州。东莞)等省市有分公司。...    1.0      163.con
3  贵公司负责人(经理/财务)您好:深圳市华龙公司受多家公司委托向外低点代开部分增值税电脑发票(...    1.0       12.com   to_address date_week date_hour date_time_quantum  has_date
0  ccert.edu.cn       tue        10                 0         1
1  ccert.edu.cn       sun        10                 0         1
2  ccert.edu.cn       sun        10                 0         1
3  ccert.edu.cn       sun        10                 0         1
#===========================开始分词==============================================
print('='*30 + '现在开始分词,请耐心等待5分钟。。。' + '='*20)
df['content'] = df['content'].astype('str')
df['jieba_cut_content'] = list(map(lambda st: "  ".join(jieba.cut(st)), df['content']))
df.head(4)

#特征工程之四 长度提取
def precess_content_length(lg):if lg <= 10:return 0elif lg <= 100:return 1elif lg <= 500:return 2elif lg <= 1000:return 3elif lg <= 1500:return 4elif lg <= 2000:return 5elif lg <= 2500:return 6elif lg <=  3000:return 7elif lg <= 4000:return 8elif lg <= 5000:return 9elif lg <= 10000:return 10elif lg <= 20000:return 11elif lg <= 30000:return 12elif lg <= 50000:return 13else:return 14df['content_length'] = pd.Series(map(lambda st:len(st), df['content']))
df['content_length_type'] = pd.Series(map(lambda st: precess_content_length(st), df['content_length']))
# print(df.head(10))  #如果不count就按照自然顺序排
df2 = df.groupby(['content_length_type', 'label'])['label'].agg(['count']).reset_index()#agg 计算并且添加count用于后续计算
df3 = df2[df2.label == 1][['content_length_type', 'count']].rename(columns = {'count' : 'c1'})
df4 = df2[df2.label == 0][['content_length_type', 'count']].rename(columns = {'count' : 'c2'})
df5 = pd.merge(df3, df4)#注意pandas中merge与concat的区别
df5['c1_rage'] = df5.apply(lambda r: r['c1'] / (r['c1'] + r['c2']), axis = 1)
df5['c2_rage'] = df5.apply(lambda r: r['c2'] / (r['c1'] + r['c2']), axis = 1)
print(df5)
#画图出来观测为信号添加做准备
plt.plot(df5['content_length_type'], df5['c1_rage'], label = u'垃圾邮件比例')
plt.plot(df5['content_length_type'], df5['c2_rage'], label = u'正常邮件比例')
plt.grid(True)
plt.legend(loc = 0)#加入图例
plt.show()

#添加信号量,数值分析模拟回归方程def process_content_sema(x):if x > 10000:return 0.5 / np.exp(np.log10(x) - np.log10(500)) + np.log(abs(x - 500) + 1) - np.log(abs(x - 10000)) + 1else:return 0.5 / np.exp(np.log10(x) - np.log10(500)) + np.log(abs(x - 500) + 1)
a = np.arange(1, 20000)
plt.plot(a, list(map(lambda t: process_content_sema(t) ,a)), label = u'信息量')
# plt.plot(df['content_length'], list(map(lambda t: process_content_sema(t) ,df['content_length'])), label = u'信息量')
plt.grid(True)
plt.legend(loc = 0)
plt.show()

df['content_length_sema'] = list(map(lambda st: process_content_sema(st), df['content_length']))
# print(df.head(10))         print(df.dtypes) #可以查看每一列的数据类型,也可以查看每一列的名称
from                    object
to                      object
date                    object
content                 object
label                  float64
from_address            object
to_address              object
date_week               object
date_hour               object
date_time_quantum       object
has_date                 int64
jieba_cut_content       object
content_length           int64
content_length_type      int64
content_length_sema    float64
dtype: object
df.drop(['from', 'to', 'date', 'from_address', 'to_address', \'date_week','date_hour', 'date_time_quantum', 'content', \'content_length', 'content_length_type'], 1, inplace=True)
print(df.info())
print(df.head(10))
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 64620 entries, 0 to 64619
Data columns (total 4 columns):
label                  64619 non-null float64
has_date               64620 non-null int64
jieba_cut_content      64620 non-null object
content_length_sema    64620 non-null float64
dtypes: float64(2), int64(1), object(1)
memory usage: 2.0+ MB
Nonelabel  has_date                                  jieba_cut_content  \
0    1.0         1  非  财务  纠淼  牟  莆  窆  芾  -  (  沙盘  模拟  )  ------...
1    0.0         1  讲  的  是  孔子  后人  的  故事  。  一个  老  领导  回到  家乡  ...
2    1.0         1  尊敬  的  贵  公司  (  财务  /  经理  )  负责人  您好  !  我  ...
3    1.0         1  贵  公司  负责人  (  经理  /  财务  )  您好  :  深圳市  华龙  公...
4    1.0         1  这是  一封  HTML  格式  信件  !  ---------------------...
5    1.0         1  TO  :  贵  公司  经理  、  财务  您好  !  深圳市  春洋  贸易  有...
6    0.0         1  那  他  为什么  不  愿意  起诉  ,  既然  这样  了  !  起诉  后  ...
7    1.0         1  尊敬  的  负责人  (  经理  /  财务  )  :  您好  !  我  是  深...
8    1.0         1  您好     以下  是  特别  为  阁下  发  的  香港  信息  (  图片  ...
9    0.0         1  我  觉得  ,  负债  不要紧  ,  最  重要  的  是  能  负得起  这个 ...   content_length_sema
0             7.456151
1             6.486084
2             6.175171
3             6.565682
4             2.063409
5             6.143747
6             3.807568
7             5.593684
8             6.611074
9             6.041340
df.to_csv('./data/result_process02', encoding='utf-8', index = False)
df.to_csv('./data/result_process02.csv', encoding='utf-8', index = False)

3.模型训练预测

3.1 KNN

#-*- coding:utf-8 -*-
import pandas as pd
import numpy as np
import jieba
import timefrom sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.decomposition import TruncatedSVD
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import f1_score, precision_score, recall_score
from sklearn.ensemble.tests.test_forest import check_min_samples_leafdf = pd.read_csv('./data/result_process02', sep =',')
# print(df.head(5))
df.dropna(axis = 0, how ='any', inplace = True)
# print(df.head(5))
# print(df.info())x_train, x_test, y_train, y_test = train_test_split(df[['has_date','jieba_cut_content',\'content_length_sema']],df['label'],\test_size = 0.2, random_state = 0)
print("训练集大小%d" % x_train.shape[0])
print("测试集大小%d" % x_test.shape[0])
# print(x_train.head(1000))
# print(x_test.head(10))
# #================================================================================================
print('开始训练集的特征工程:')
start_time_train = time.time()
transformer = TfidfVectorizer(norm = 'l2', use_idf = True)
svd = TruncatedSVD(n_components=20)
jieba_cut_content = list(x_train['jieba_cut_content'].astype('str'))
transformer_model = transformer.fit(jieba_cut_content)#Tf-idf
df1 = transformer_model.transform(jieba_cut_content)
svd_model = svd.fit(df1)
df2 = svd_model.transform(df1)
data = pd.DataFrame(df2)
end_time_train = time.time()
print('Running train_svd time: %.2s second(s)'%(end_time_train-start_time_train))
# print(data.head(10))
# print(data.info())
#
data['has_date'] = list(x_train['has_date'])
data['content_length_sema'] = list(x_train['content_length_sema'])
# print(data.head(10))
# print(data.info())
#
print('开始KNN模型训练:')
knn = KNeighborsClassifier(n_neighbors=5)
model = knn.fit(data, y_train)
#测试集处理
jieba_cut_content_test = list(x_test['jieba_cut_content'].astype('str'))
data_test = pd.DataFrame(svd_model.transform(transformer_model.transform(jieba_cut_content_test)))
data_test['has_date'] = list(x_test['has_date'])
data_test['content_length_sema'] = list(x_test['content_length_sema'])
# print(data_test.head(10))
# print(data_test.info())
start_time_KNN = time.time()
y_predict = model.predict(data_test)
#
precision = precision_score(y_test, y_predict)
recall = recall_score(y_test, y_predict)
f1mean = f1_score(y_test, y_predict)print('精确率为:%0.5f' % precision)
print('召回率为:%0.5f' % recall)
print('F1均值为:%0.5f' % f1mean)
end_time_KNN = time.time()
print('Running KNN_model time: %.2s second(s)'%(end_time_KNN-start_time_KNN))
C:\Anaconda3\python.exe D:/hjz-py/Project/垃圾邮件过滤课件及数据/Spam-sorting/k_nearest_neighbor.py
训练集大小51427
测试集大小12857
开始训练集的特征工程:
Running train_svd time: 22 second(s)
开始KNN模型训练:
精确率为:0.98029
召回率为:0.98654
F1均值为:0.98340
Running KNN_model time: 1. second(s)Process finished with exit code 0

3.2 SVM


import pandas as pd
import numpy as np
import jieba
import timefrom sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.decomposition import TruncatedSVD
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.metrics import f1_score, precision_score, recall_score
from sklearn.ensemble.tests.test_forest import check_min_samples_leafdf = pd.read_csv('./data/result_process02', sep =',')
# print(df.head(5))
df.dropna(axis = 0, how ='any', inplace = True)
# print(df.head(5))
# print(df.info())
print("训练集大小:",df.shape)x_train, x_test, y_train, y_test = train_test_split(df[['has_date','jieba_cut_content',\'content_length_sema']],df['label'],\test_size = 0.2, random_state = 0)
print("训练集大小%d" % x_train.shape[0])
print("测试集大小%d" % x_test.shape[0])
# print(x_train.head(1000))
# print(x_test.head(10))
#================================================================================================
print('开始训练集的特征工程-TF-IDF+SVD:')
transformer = TfidfVectorizer(norm = 'l2', use_idf = True)
svd = TruncatedSVD(n_components=20)
jieba_cut_content = list(x_train['jieba_cut_content'].astype('str'))
transformer_model = transformer.fit(jieba_cut_content)
df1 = transformer_model.transform(jieba_cut_content)
svd_model = svd.fit(df1)
df2 = svd_model.transform(df1)
data = pd.DataFrame(df2)
# print(data.head(10))
# print(data.info())data['has_date'] = list(x_train['has_date'])
data['content_length_sema'] = list(x_train['content_length_sema'])
# print(data.head(10))
# print(data.info())
print('开始SVM模型训练:')
start_time = time.time()
svm = SVC(C = 1, kernel='rbf', degree = 3, gamma = 0.001)
model = svm.fit(data, y_train)jieba_cut_content_test = list(x_test['jieba_cut_content'].astype('str'))
data_test = pd.DataFrame(svd_model.transform(transformer_model.transform(jieba_cut_content_test)))
data_test['has_date'] = list(x_test['has_date'])
data_test['content_length_sema'] = list(x_test['content_length_sema'])
# print(data_test.head(10))
# print(data_test.info())y_predict = model.predict(data_test)precision = precision_score(y_test, y_predict)
recall = recall_score(y_test, y_predict)
f1mean = f1_score(y_test, y_predict)print('精确率为:%0.5f' % precision)
print('召回率为:%0.5f' % recall)
print('F1均值为:%0.5f' % f1mean)end_time= time.time()
print('Running SVM model time: %.2s second(s)'%(end_time-start_time))
C:\Anaconda3\python.exe D:/hjz-py/Project/垃圾邮件过滤课件及数据/Spam-sorting/support_vector_machine.py
训练集大小: (64284, 4)
训练集大小51427
测试集大小12857
开始训练集的特征工程:
开始SVM模型训练:
精确率为:0.87746
召回率为:0.98583
F1均值为:0.92849
Running svm model time: 99 second(s)Process finished with exit code 0

3.3 Decision Tree

import pandas as pd
import numpy as np
import jieba
import time
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.decomposition import TruncatedSVD
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import f1_score, precision_score, recall_scoredf = pd.read_csv('./data/result_process02', sep =',')
# print(df.head(5))
df.dropna(axis = 0, how ='any', inplace = True)
# print(df.head(5))
# print(df.info())
print("训练集大小:",df.shape)x_train, x_test, y_train, y_test = train_test_split(df[['has_date','jieba_cut_content',\'content_length_sema']],df['label'],\test_size = 0.2, random_state = 0)
print("训练集大小%d" % x_train.shape[0])
print("测试集大小%d" % x_test.shape[0])
# print(x_train.head(1000))
# print(x_test.head(10))
#================================================================================================
print('开始训练集的特征工程-TF-IDF+SVD:')
transformer = TfidfVectorizer(norm = 'l2', use_idf = True)
svd = TruncatedSVD(n_components=20)
jieba_cut_content = list(x_train['jieba_cut_content'].astype('str'))
transformer_model = transformer.fit(jieba_cut_content)
df1 = transformer_model.transform(jieba_cut_content)
svd_model = svd.fit(df1)
df2 = svd_model.transform(df1)
data = pd.DataFrame(df2)
# print(data.head(10))
# print(data.info())data['has_date'] = list(x_train['has_date'])
data['content_length_sema'] = list(x_train['content_length_sema'])
# print(data.head(10))
# print(data.info())print('开始决策树模型训练:')
start_time = time.time()tree = DecisionTreeClassifier(criterion='gini', max_depth = 5, random_state = 0)#'entropy'
model = tree.fit(data, y_train)jieba_cut_content_test = list(x_test['jieba_cut_content'].astype('str'))
data_test = pd.DataFrame(svd_model.transform(transformer_model.transform(jieba_cut_content_test)))
data_test['has_date'] = list(x_test['has_date'])
data_test['content_length_sema'] = list(x_test['content_length_sema'])
# print(data_test.head(10))
# print(data_test.info())y_predict = model.predict(data_test)precision = precision_score(y_test, y_predict)
recall = recall_score(y_test, y_predict)
f1mean = f1_score(y_test, y_predict)print('精确率为:%0.5f' % precision)
print('召回率为:%0.5f' % recall)
print('F1均值为:%0.5f' % f1mean)end_time= time.time()
print('Running DT model time: %.2s second(s)'%(end_time-start_time))
C:\Anaconda3\python.exe D:/hjz-py/Project/垃圾邮件过滤课件及数据/Spam-sorting/decision_tree.py
训练集大小: (64284, 4)
训练集大小51427
测试集大小12857
开始训练集的特征工程-TF-IDF+SVD:
开始决策树模型训练:
精确率为:0.96956
召回率为:0.98146
F1均值为:0.97547
Running DT model time: 2. second(s)Process finished with exit code 0

3.4 Random forest

import time
import pandas as pd
import numpy as np
import jiebafrom sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.decomposition import TruncatedSVD
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import f1_score, precision_score, recall_score
from sklearn.ensemble.tests.test_forest import check_min_samples_leafdf = pd.read_csv('./data/result_process02', sep =',')
# print(df.head(5))
df.dropna(axis = 0, how ='any', inplace = True)
# print(df.head(5))
# print(df.info())
print("训练集大小:",df.shape)x_train, x_test, y_train, y_test = train_test_split(df[['has_date','jieba_cut_content',\'content_length_sema']],df['label'],\test_size = 0.2, random_state = 0)
print("训练集大小%d" % x_train.shape[0])
print("测试集大小%d" % x_test.shape[0])
# print(x_train.head(1000))
# print(x_test.head(10))
#================================================================================================
print('开始训练集的特征工程-TF-IDF+SVD:')
transformer = TfidfVectorizer(norm = 'l2', use_idf = True)
svd = TruncatedSVD(n_components=20)
jieba_cut_content = list(x_train['jieba_cut_content'].astype('str'))
transformer_model = transformer.fit(jieba_cut_content)
df1 = transformer_model.transform(jieba_cut_content)
svd_model = svd.fit(df1)
df2 = svd_model.transform(df1)
data = pd.DataFrame(df2)
# print(data.head(10))
# print(data.info())data['has_date'] = list(x_train['has_date'])
data['content_length_sema'] = list(x_train['content_length_sema'])
# print(data.head(10))
# print(data.info())print('开始RF模型训练:')
start_time = time.time()forest = RandomForestClassifier(n_estimators=100, criterion='gini', max_depth=3, random_state=0)
model = forest.fit(data, y_train)jieba_cut_content_test = list(x_test['jieba_cut_content'].astype('str'))
data_test = pd.DataFrame(svd_model.transform(transformer_model.transform(jieba_cut_content_test)))
data_test['has_date'] = list(x_test['has_date'])
data_test['content_length_sema'] = list(x_test['content_length_sema'])
print(data_test.head(10))
print(data_test.info())y_predict = model.predict(data_test)precision = precision_score(y_test, y_predict)
recall = recall_score(y_test, y_predict)
f1mean = f1_score(y_test, y_predict)print('精确率为:%0.5f' % precision)
print('召回率为:%0.5f' % recall)
print('F1均值为:%0.5f' % f1mean)end_time= time.time()
print('Running RF model time: %.2s second(s)'%(end_time-start_time))
C:\Anaconda3\python.exe D:/hjz-py/Project/垃圾邮件过滤课件及数据/Spam-sorting/random_forest.py
训练集大小: (64284, 4)
训练集大小51427
测试集大小12857
开始训练集的特征工程-TF-IDF+SVD:
开始RF模型训练:
精确率为:0.94293
召回率为:0.98914
F1均值为:0.96548
Running RF model time: 5. second(s)Process finished with exit code 0

3.5 GBDT


#-*- coding:utf-8 -*-
import pandas as pd
import numpy as np
import jieba
import timefrom sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.decomposition import TruncatedSVD
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import f1_score, precision_score, recall_score
from sklearn.ensemble.tests.test_forest import check_min_samples_leafdf = pd.read_csv('./data/result_process02', sep =',')
# print(df.head(5))
df.dropna(axis = 0, how ='any', inplace = True)
# print(df.head(5))
# print(df.info())
print("训练集大小:",df.shape)x_train, x_test, y_train, y_test = train_test_split(df[['has_date','jieba_cut_content',\'content_length_sema']],df['label'],\test_size = 0.2, random_state = 0)
print("训练集大小%d" % x_train.shape[0])
print("测试集大小%d" % x_test.shape[0])
# print(x_train.head(1000))
# print(x_test.head(10))
#================================================================================================
print('开始GBDT模型训练:')
start_time = time.time()
transformer = TfidfVectorizer(norm = 'l2', use_idf = True)
svd = TruncatedSVD(n_components=20)
jieba_cut_content = list(x_train['jieba_cut_content'].astype('str'))
transformer_model = transformer.fit(jieba_cut_content)
df1 = transformer_model.transform(jieba_cut_content)
svd_model = svd.fit(df1)
df2 = svd_model.transform(df1)
data = pd.DataFrame(df2)
# print(data.head(10))
# print(data.info())data['has_date'] = list(x_train['has_date'])
data['content_length_sema'] = list(x_train['content_length_sema'])
# print(data.head(10))
# print(data.info())gbdt = GradientBoostingClassifier(learning_rate=0.01, n_estimators =100, max_depth=3,\min_samples_split = 50, loss = 'deviance', random_state = 0)#对数似然损失函数   指数损失函数exponential
model = gbdt.fit(data, y_train)jieba_cut_content_test = list(x_test['jieba_cut_content'].astype('str'))
data_test = pd.DataFrame(svd_model.transform(transformer_model.transform(jieba_cut_content_test)))
data_test['has_date'] = list(x_test['has_date'])
data_test['content_length_sema'] = list(x_test['content_length_sema'])
# print(data_test.head(10))
# print(data_test.info())y_predict = model.predict(data_test)precision = precision_score(y_test, y_predict)
recall = recall_score(y_test, y_predict)
f1mean = f1_score(y_test, y_predict)print('精确率为:%0.5f' % precision)
print('召回率为:%0.5f' % recall)
print('F1均值为:%0.5f' % f1mean)end_time= time.time()
print('Running GBDT model time: %.2s second(s)'%(end_time-start_time))
C:\Anaconda3\python.exe D:/hjz-py/Project/垃圾邮件过滤课件及数据/Spam-sorting/gradient_boost_decision_tree.py
训练集大小: (64284, 4)
训练集大小51427
测试集大小12857
开始GBDT模型训练:
精确率为:0.95038
召回率为:0.98831
F1均值为:0.96897
Running GBDT model time: 32 second(s)Process finished with exit code 0

3.6 Bayes

import pandas as pd
import numpy as np
# import matplotlib as mpl
# import matplotlib.pyplot as plt
import jieba
import timefrom sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.decomposition import TruncatedSVD
from sklearn.naive_bayes import BernoulliNB
from sklearn.model_selection import train_test_split
from sklearn.metrics import f1_score, precision_score, recall_score# mpl.rcParams['font.sans-serif'] = [u'simHei']
# mpl.rcParams['axes.unicode_minus'] = Falsedf = pd.read_csv('./data/result_process02', sep =',')
# print(df.head(5))
df.dropna(axis = 0, how ='any', inplace = True) #按行删除Nan
# print(df.head(5))
# print(df.info())
print("训练集大小:",df.shape)
x_train, x_test, y_train, y_test = train_test_split(df[['has_date','jieba_cut_content',\'content_length_sema']],df['label'],\test_size = 0.2, random_state = 0)print("训练数据集大小:%d" % x_train.shape[0])
print("测试集数据大小:%d" % x_test.shape[0])
# print(x_train.head(10))
# print(x_test.head(10)) #注意前面索引
#================================================================================================
print('开始训练集的特征工程-TF-IDF+SVD:')
start1 = time.time()
transformer = TfidfVectorizer(norm = 'l2', use_idf = True)#逆向文件频率
svd = TruncatedSVD(n_components=20)
jieba_cut_content = list(x_train['jieba_cut_content'].astype('str'))
transformer_model = transformer.fit(jieba_cut_content)
df1 = transformer_model.transform(jieba_cut_content)
svd_model = svd.fit(df1)
df2 = svd_model.transform(df1)
data = pd.DataFrame(df2)
# print(data.head(10))
# print(data.info())data['has_date'] = list(x_train['has_date'])
data['content_length_sema'] = list(x_train['content_length_sema'])
# print(data.head(10))
# print(data.info())end1 = time.time()
print('结束特征工程耗时: %.2s second(s)'%(end1-start1))
jieba_cut_content_test = list(x_test['jieba_cut_content'].astype('str'))
data_test = pd.DataFrame(svd_model.transform(transformer_model.transform(jieba_cut_content_test)))
data_test['has_date'] = list(x_test['has_date'])
data_test['content_length_sema'] = list(x_test['content_length_sema'])
# print(data_test.head(10))
# print(data_test.info())print('开始Bayes模型训练:')
start_time = time.time()nb = BernoulliNB(alpha = 1.0, binarize = 0.0005)#二值转换阈值
model = nb.fit(data, y_train)#开始预测
y_predict = model.predict(data_test)precision = precision_score(y_test, y_predict)
recall = recall_score(y_test, y_predict)
f1mean = f1_score(y_test, y_predict)print('精确率为:%0.5f' % precision)
print('召回率:%0.5f' % recall)
print('F1均值为:%0.5f' % f1mean)end_time= time.time()
print('Running Bayes model time: %.2s second(s)'%(end_time-start_time))
C:\Anaconda3\python.exe D:/hjz-py/Project/垃圾邮件过滤课件及数据/Spam-sorting/bayes.py
训练集大小: (64284, 4)
训练数据集大小:51427
测试集数据大小:12857
开始训练集的特征工程-TF-IDF+SVD:
结束特征工程耗时: 22 second(s)
开始Bayes模型训练:
精确率为:0.94664
召回率:0.98878
F1均值为:0.96725
Running Bayes model time: 0.06 second(s)Process finished with exit code 0

4.算法模型对比

不同机器跑出来差异不大,就上以前的表格了,可以再做个LR

5.总结

  1. 垃圾邮件过滤一般常用的算法有Bayes、KNN、LR等。一般最常用的算法选择Bayes算法。
  2. 垃圾邮件过滤系统中一般采用算法过滤+其它过滤统计结合的方式来进行垃圾邮件过滤。
  3. 在垃圾邮件过滤中主要是需要进行分词操作,中文邮件一般可以选择使用jieba(python)、ANSJ( java)等工具进行分词处理。
  4. 在垃圾邮件过滤中一般注意召回率,也就是说一般情况下,需要尽可能的提高垃圾邮件过滤的成功率。

机器学习项目-垃圾邮件分类-KNN-SVM-DT-RF-GBDT-Bayes相关推荐

  1. 机器学习项目 - 垃圾邮件分类

    一, 数据清洗  (1),先做数据清洗,清洗过的数据被称之为"干净数据":     具体过程为->要结合业务场景来判断哪些特征是值得被提取的,     如果自身对业务场景并不 ...

  2. 【人工智能项目】机器学习中文垃圾邮件分类任务

    [人工智能项目]机器学习中文垃圾邮件分类任务 本次采用机器学习模型对中文邮件是否为垃圾邮件进行判别.那么工友们,学起来吧!!! 任务说明 0,商业秘密的秘密性那是维系其商业价值和垄断地位的前提条件之一 ...

  3. 4.4 机器学习系统设计--垃圾邮件分类-机器学习笔记-斯坦福吴恩达教授

    机器学习系统设计–垃圾邮件分类 假定我们现有一封邮件,其内容如下: From: cheapsales@buystufffromme.com To: ang@cs.stanford.edu Subjec ...

  4. Spark机器学习之垃圾邮件分类

    Spark机器学习之垃圾邮件分类 步骤概述 通过HashingTF构建文本的特征向量,然后使用随机梯度下降算法实现逻辑回归,进而对邮件进行分类 垃圾邮件分类代码 导入相关的包 import org.a ...

  5. 垃圾邮件分类实战(SVM)

    1. 数据集说明 trec06c是一个公开的垃圾邮件语料库,由国际文本检索会议提供,分为英文数据集(trec06p)和中文数据集(trec06c),其中所含的邮件均来源于真实邮件保留了邮件的原有格式和 ...

  6. 基于Bayes和SVM的垃圾邮件分类实现(改进版)

    对本文标题进行分词和提取关键词,本文关键词如下:分类.垃圾邮件分类(spam).Bayes.SVM.改进版(体现在哪里?).本文不对Bayes.SVM原理做过多的摄入和解释,主要是使用这些算法做一个基 ...

  7. Python实现基于朴素贝叶斯的垃圾邮件分类 标签: python朴素贝叶斯垃圾邮件分类 2016-04-20 15:09 2750人阅读 评论(1) 收藏 举报 分类: 机器学习(19) 听说

    Python实现基于朴素贝叶斯的垃圾邮件分类 标签: python朴素贝叶斯垃圾邮件分类 2016-04-20 15:09 2750人阅读 评论(1) 收藏 举报  分类: 机器学习(19)  听说朴 ...

  8. 垃圾邮件分类快速理解机器学习中的朴素贝叶斯(Naive Bayes)

    贝叶斯方法是一个历史悠久,有着坚实的理论基础的方法,同时处理很多问题时直接而又高效,很多高级自然语言处理模型也可以从它演化而来.因此,学习贝叶斯方法,是研究自然语言处理问题的一个非常好的切入口. 其实 ...

  9. 使用线性SVM实现对垃圾邮件分类

    本文内容 代码地址 使用线性SVM实现对垃圾邮件分类 (1)问题描述: (2)实现过程: 实验小结: 代码地址 代码地址 使用线性SVM实现对垃圾邮件分类 (1)问题描述: ​ 编程实现一个垃圾邮件S ...

最新文章

  1. python迭代列表_Python迭代列表中列的元素
  2. 使用winrar自解压功能制作安装包
  3. OverLoad与override的区别
  4. 山西农信社计算机知识,山西人事考试网 山西农信社考试计算机知识高频考点(二)...
  5. 【杂谈】有三AI知识星球最近都GAN了哪些内容?
  6. 十进制数转化为2进制后有多少个1
  7. IoT -- (五) IoT都有哪些通信协议
  8. JReBel激活码注册申请--方便Java开发中使用Jrebel热部署
  9. 前台文件PHP完善步骤,ThinkPHP使用步骤
  10. distenct oracle_oracle中distinct的用法详解
  11. sql无法写入mysql_windows7 sqlserver2012 无法写入受保护的内存 解决办法
  12. Ubuntu系统下允许Apache的mod_rewrite功能
  13. 【Win10】【Win2D】实现控件阴影效果
  14. 试试Navicat和Axere RP Pro吧
  15. 申请与认证IB课程全流程
  16. Tomcat环境配置 以及报错500的问题
  17. 人员疏散模型(pso元胞自动机)网挑思路
  18. Packet Tracer使用说明
  19. 6大论坛,30+技术干货议题,2022首届阿里巴巴开源开放周来了!
  20. 阿里云官方 Redis 开发规范

热门文章

  1. ncverilog脚本_NcVerilog_工作学习记录.pdf
  2. rtsp直播流转m3u8
  3. 遗传算法的理解及例子解释
  4. 怎么恢复永久删除的文件
  5. cie1931 python绘制_在cie1931颜色空间python 2.7中绘制色域
  6. 别让抱怨毁了你的工作生活
  7. 棋盘算法c语言程序,骑士走棋盘算法
  8. 鸿蒙系统问世(开源!!!)
  9. HILDON手册(转载自CSDN)
  10. 苹果怎么换行打字_微信悄悄上线新功能!安卓苹果都有,很多人还不知道……...