题目:
在本练习中,您将使用支持向量机(SVMs)来构建垃圾邮件分类器。
数据集:
https://www.heywhale.com/mw/project/5da961c8c83fb400420f3dd7/dataset
python代码:
支持向量机
import numpy as np
import pandas as pd
import scipy.io as io
import matplotlib.pyplot as plt
#第一部分 线性可分
#1、引入数据
data1 = io.loadmat('C:/Users/Administrator/Desktop/吴恩达机器学习数据集/week1/ex6data1.mat')
data1.keys() #字典(Dictionary) keys() 函数以列表返回一个字典所有的键
X,y = data1['X'], data1['y']
print(X.shape,y.shape)
#2、数据可视化
def plot_data(data,fig,ax):
X, y = data['X'], data['y']
plt.scatter(X[:,0], X[:,1], c=y.flatten(), cmap='jet') #flatten函数按行方向降为一维,颜色根据y来分要么为1要么为0
plt.xlabel('X1') #x轴y轴标签
plt.ylabel('y1')
fig,ax = plt.subplots(figsize=(12,8))
plot_data(data1,fig,ax)
plt.show()
#3、导入svm并且实例化 C=1时,忽略偏离点
from sklearn.svm import SVC
svc1 = SVC(C=1, kernel='linear') #确定kernel为线性,其余函数由拟合而来
svc1.fit(X,y.flatten()) #拟合学习,确定svm其他参数
svc1.predict(X) #预测数据集标签
svc1.score(X,y.flatten()) #计算准确率
#4、绘制边界
def plot_boundary(model):
x_min,x_max = -0.5,4.5
y_min,y_max = 1.3,5
xx,yy = np.meshgrid(np.linspace(x_min,x_max,500),
np.linspace(y_min,y_max,500)) # meshgrid 函数用来生成网格矩阵,可以是二维网格矩阵
z = model.predict(np.c_[xx.flatten(),yy.flatten()]) #np.c_是按行连接两个矩阵,就是把两矩阵左右相加,要求行数相等
zz = z.reshape(xx.shape) #边界线
plt.contour(xx,yy,zz) #函数主要对网格中每个点的值等于一系列值的时候做出一条条轮廓线,类似于等高线 。
plot_boundary(svc1)
plot_data(data1,fig,ax)
plt.show()
#第二步 C=100时,不忽略点
svc100 = SVC(C=100, kernel='linear')
svc100.fit(X,y.flatten())
svc100.predict(X)
svc100.score(X,y.flatten())
plot_boundary(svc100)
plot_data(data1,fig,ax)
plt.show()
#第三部分 非线性数据集
#1、数据引入
data2 = io.loadmat('C:/Users/Administrator/Desktop/吴恩达机器学习数据集/week1/ex6data2.mat')
data2.keys()
X,y = data2['X'], data2['y']
print(X.shape,y.shape)
#2、数据可视化
def plot_data(data,fig,ax):
X, y = data['X'], data['y']
plt.scatter(X[:,0], X[:,1], c=y.flatten(), cmap='jet') #flatten函数按行方向降为一维,颜色根据y来分要么为1要么为0
plt.xlabel('X1') #x轴y轴标签
plt.ylabel('y1')
fig,ax = plt.subplots(figsize=(12,8))
plot_data(data2,fig,ax)
plt.show()
#3、svm
svc3 = SVC(C=1,kernel='rbf',gamma=1000)#rbf为高斯核
svc3.fit(X,y.flatten())
svc3.predict(X)
svc3.score(X,y.flatten())
#4、绘制边界
def plot_boundary(model):
x_min,x_max = 0,1 #自己设定
y_min,y_max = 0.4,1
xx,yy = np.meshgrid(np.linspace(x_min,x_max,500),
np.linspace(y_min,y_max,500)) # meshgrid 函数用来生成网格矩阵,可以是二维网格矩阵
z = model.predict(np.c_[xx.flatten(),yy.flatten()]) #np.c_是按行连接两个矩阵,就是把两矩阵左右相加,要求行数相等
zz = z.reshape(xx.shape) #边界线
plt.contour(xx,yy,zz) #函数主要对网格中每个点的值等于一系列值的时候做出一条条轮廓线,类似于等高线 。
plot_boundary(svc3)
plot_data(data2,fig,ax)
plt.show()
#第四部分 第四个数据集寻找最优参数C和gamma
#1、导入数据集
mat = io.loadmat('C:/Users/Administrator/Desktop/吴恩达机器学习数据集/week1/ex6data3.mat')
X,y =mat['X'],mat['y']
Xval,yval = mat['Xval'],mat['yval']
def plot_data(data,fig,ax):
X, y = data['X'], data['y']
plt.scatter(X[:,0], X[:,1], c=y.flatten(), cmap='jet') #flatten函数按行方向降为一维,颜色根据y来分要么为1要么为0
plt.xlabel('X1') #x轴y轴标签
plt.ylabel('y1')
fig,ax = plt.subplots(figsize=(12,8))
plot_data(mat,fig,ax)
plt.show()
#2、求最优参数
Cvalues = [0.01, 0.03, 0.1, 0.3, 1, 3, 10, 30, 100]
gammas = [0.01, 0.03, 0.1, 0.3, 1, 3, 10, 30, 100]
best_score = 0
best_params = (0,0) #设定元组
print('最优C和sigma值:')
for C in Cvalues:
for gamma in gammas:
svc = SVC(C=C, kernel='rbf',gamma=gamma)
svc.fit(X,y.flatten())
score = svc.score(Xval,yval.flatten())
if(score > best_score):
best_score = score
best_params =(C,gamma)
print('best_score,best_params:', best_score,best_params)
#svm
svc4 = SVC(C=0.3,kernel='rbf',gamma=100)
svc4.fit(X,y.flatten())
#绘制边界
def plot_boundary(model):
x_min,x_max = -0.6,0.4 #自己设定
y_min,y_max = -0.7,0.6
xx,yy = np.meshgrid(np.linspace(x_min,x_max,500),
np.linspace(y_min,y_max,500)) # meshgrid 函数用来生成网格矩阵,可以是二维网格矩阵
z = model.predict(np.c_[xx.flatten(),yy.flatten()]) #np.c_是按行连接两个矩阵,就是把两矩阵左右相加,要求行数相等
zz = z.reshape(xx.shape) #边界线
plt.contour(xx,yy,zz) #函数主要对网格中每个点的值等于一系列值的时候做出一条条轮廓线,类似于等高线 。
plot_boundary(svc4)
plot_data(mat,fig,ax)
plt.show()
#第五部分 判断一封邮件是否是垃圾邮件
#训练集
data5 = io.loadmat('C:/Users/Administrator/Desktop/吴恩达机器学习数据集/week1/spamTrain.mat')
#测试集、
data6 = io.loadmat('C:/Users/Administrator/Desktop/吴恩达机器学习数据集/week1/spamTest.mat')
X,y =data5['X'],data5['y']
Xtest,ytest =data6['Xtest'],data6['ytest']
#最优参数
Cvalues = [3,10,30,100,0.01,0.03,0.1,0.3,1]
best_score = 0
best_params = 0 #设定元组
print('最优C和sigma值:')
for C in Cvalues:
svc = SVC(C=C, kernel='linear')
svc.fit(X,y.flatten())
score = svc.score(Xtest,ytest.flatten())
if(score > best_score):
best_score = score
best_params =C
print('best_score,best_params:', best_score,best_params)
#svm实例化
svc = SVC(0.03,kernel='linear')
svc.fit(X,y.flatten())
score_train =svc.score(X,y.flatten)
score_test =svc.score(Xtest,ytest.flatten())
print(score_train,score_test)