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 |
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicWZwpmLhZjN5UzN2gzYlVWZxEDM4Y2Y3QDNiZTY0EWMjNTMzQ2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpeg)
圖5.1 訓練集的混淆矩陣
圖5.2 測試集的混淆矩陣
圖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()