天天看點

基于SVM的垃圾郵件識别

UC Irvine Machine Learning Repository:UCI指的是加州大學歐文分校。UCI機器學習庫主要是收集的機器學習領域的一些相關資料集和資料生成器,可以用來做一些基本的實驗。存檔是建立為大衛阿哈和加州大學歐文分校研究員在1987年研究所學生FTP檔案。自那時以來,它已被廣泛用于學生,教育工作者,和其他研究機器學習的研究者,作為一個資料來源。

本文是利用UCI machine learning repository的spambase資料集進行垃圾郵件的分類;

資料來源:UCI Machine Learning Repository: Spambase Data Set

3.1 資料描述

Data Set Characteristics: Multivariate Number of Instances: 4601 Area: Computer
Attribute Characteristics: Integer, Real Number of Attributes: 57 Date Donated 1999-07-01
Associated Tasks: Classification Missing Values? Yes Number of Web Hits: 665357

3.2 資料集部分屬性

word_freq_make:

word_freq_address:

char_freq_!:

capital_run_length_average:

capital_run_length_longest:

continuous.

continuous.

continuous.

continuous.

continuous.

3.3 資料集部分資料

表3.1 資料集部分資料

模型将原資料集的70%作為訓練集,30%作為測試集,核函數采用的是linear,模型的精度截至疊代步數均采用預設值,分别是0.001和200。模型具體參數如表4.1所示。

表4.1 模型參數

參數名 參數值
訓練用時 1.9323
資料切分 0.7
資料洗牌
懲罰系數 0.8
核函數 linear
核函數系數 scale
核函數常數
核函數最高項次數 3
誤差收斂條件 0.001
最大疊代次數 200
多分類融合政策 ovr
基于SVM的垃圾郵件識别

圖5.1 訓練集的混淆矩陣

基于SVM的垃圾郵件識别

圖5.2 測試集的混淆矩陣

基于SVM的垃圾郵件識别

圖5.3 模型ROC曲線

import pandas as pd  
import numpy as np  
from sklearn import SVM   
from sklearn import model_selection  
import matplotlib.pyplot as plt  
from sklearn.metrics import plot_confusion_matrix  
from sklearn.metrics import confusion_matrix  
import time  
plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文标簽  
plt.rcParams['axes.unicode_minus']=False #用來正常顯示負号  
import warnings  
warnings.filterwarnings("ignore")  
##  導入資料并命名  
  
path='./spamdata.csv'  
yuanshuju=pd.read_csv(path)  
hangshu=yuanshuju.shape[0]  
lieshu=yuanshuju.shape[1]  
print("行列數分别為:",hangshu,lieshu)  
bianliang=yuanshuju.head(0)  
shuju=yuanshuju.iloc[0:hangshu,0:lieshu]  
x=shuju.iloc[0:4600,0:56]  
y=shuju.iloc[0:4600,57]  
class_names = yuanshuju.head(0)  
  
##  劃分進行訓練集和測試集劃分  
  
x_train, x_test, y_train, y_test=model_selection.train_test_split(x, y, random_state=1, test_size=0.3)  
  
## SVM分類器建構  
  
def classifier():   
    clf = SVM.SVC(C=0.8,                         # 誤差項懲罰系數  
                  kernel='linear',                  # 線性核 高斯核 rbf               
                  decision_function_shape='ovr') # 決策函數  
    return clf  
      
    # 訓練模型  
def train(clf, x_train, y_train):  
    clf.fit(x_train, y_train.ravel()) # 訓練集特征向量和 訓練集目标值  
  
clf = classifier()  
Starttime=time.time()               #訓練開始時間  
train(clf, x_train, y_train)  
Endtime=time.time()                 #訓練結束時間      
Calculate=Endtime-Starttime         #時間差  
print('calculate:',Calculate)       #輸出總用時  
y_test_predict=clf.predict(x_test)  
print(y_test_predict)  
# ======判斷a,b是否相等計算acc的均值  
def show_accuracy(a, b, tip):  
    acc = a.ravel() == b.ravel()  
    print('%s Accuracy:%.3f' %(tip, np.mean(acc)))  
     
# 分别列印訓練集和測試集的準确率 score(x_train, y_train)表示輸出 x_train,y_train在模型上的準确率  
def print_accuracy(clf, x_train, y_train, x_test, y_test):  
    print('training prediction:%.3f' %(clf.score(x_train, y_train)))  
    print('test data prediction:%.3f' %(clf.score(x_test, y_test)))  
    # 原始結果和預測結果進行對比 predict() 表示對x_train樣本進行預測,傳回樣本類别  
    show_accuracy(clf.predict(x_train), y_train, 'traing data')  
    show_accuracy(clf.predict(x_test), y_test, 'testing data')  
    # 計算決策函數的值 表示x到各個分割平面的距離  
    #print('decision_function:\n', clf.decision_function(x_train))  
def sicanshu(tt):  
    FP=tt[0,0]  
    FN=tt[0,1]  
    TP=tt[1,1]  
    TN=tt[1,0]  
    print('FP,FN,TP,TN分别為:\n',FP,FN,TP,TN)  
    P=TP/(TP+FN)  
    R=TP/(TP+TN)  
    ACC=(2*P*R)/(P+R)  
    print('準确率,召回率,精确度分别為:\n',P,R,ACC)  
  
# 4 模型評估  
print('-------- eval ----------')  
print_accuracy(clf, x_train, y_train, x_test, y_test)  
  
print("************測試集的混淆矩陣************")  
plot_confusion_matrix(clf, x_test,y_test,cmap='Blues', labels=[1,0])  
ceshi=confusion_matrix(y_test,clf.predict(x_test))  
sicanshu(ceshi)  
#ceshi_FP,ceshi_FN,ceshi_TP,ceshi_TN=sicanshu(ceshi)  
#print('FP,FN,TP,TN\n',ceshi_FP,ceshi_FN,ceshi_TP,ceshi_TN)  
plt.title('測試集的混淆矩陣')  
plt.savefig('測試集的混淆矩陣.jpg',dpi=1200,quality=95)  
plt.show()  
print("************訓練集的混淆矩陣************")  
plot_confusion_matrix(clf,x_train,y_train,cmap='Blues', labels=[1,0])  
xunlian=confusion_matrix(y_train,clf.predict(x_train))  
sicanshu(xunlian)  
#XUNLIAN_FP,XUANLIAN_FN,XUNALIAN_TP,XUANLIAN_TN=sicanshu(xunlian)  
#print('FP,FN,TP,TN\n',XUNLIAN_FP,XUANLIAN_FN,XUNALIAN_TP,XUANLIAN_TN)  
plt.title('訓練集的混淆矩陣')  
plt.savefig('訓練集的混淆矩陣.jpg',dpi=1200,quality=95)  
plt.show()  
  
print("************ROC曲線************")  
from sklearn.metrics import roc_curve  
from sklearn.metrics import RocCurveDisplay  
y_score = clf.decision_function(x_test)  
  
fpr, tpr, _ = roc_curve(y_test, y_score, pos_label=clf.classes_[1])  
roc_display = RocCurveDisplay(fpr=fpr, tpr=tpr).plot()  
plt.title('ROC曲線')  
plt.savefig('ROC曲線.jpg',dpi=1200,quality=95)  
plt.show()