Programming Exercise 6:Support Vecter Machines
Python版本3.6
编译环境:anaconda Jupyter Notebook
链接:实验数据和实验指导书
提取码:i7co
本章课程笔记部分见:支持向量机 支持向量机大边界分类背后的数学和核函数
在本练习中,我们将使用支持向量机(SVM)来构建垃圾邮件分类器。 我们将从一些简单的2D数据集开始使用SVM来查看它们的工作原理。 然后,我们将对一组原始电子邮件进行一些预处理工作,并使用SVM在处理的电子邮件上构建分类器,以确定它们是否为垃圾邮件。
1-线性SVM
第一件事是看一个简单的二维数据集,看看线性SVM如何对数据集进行不同的C值(类似于线性/逻辑回归中的正则化项)。
%matplotlib inline
#IPython的内置magic函数,可以省掉plt.show(),在其他IDE中是不会支持的
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style="whitegrid",color_codes=True)
import scipy.io as sio
import scipy.optimize as opt
import sklearn.svm
查看数据和可视化
d = sio.loadmat('./data/ex6data1.mat')
print(d.keys())
data = pd.DataFrame(d.get('X'), columns=['X1', 'X2'])
data['y'] = d.get('y')
data.head()
dict_keys(['__header__', '__version__', '__globals__', 'X', 'y'])
X1 | X2 | y | |
---|---|---|---|
0 | 1.9643 | 4.5957 | 1 |
1 | 2.2753 | 3.8589 | 1 |
2 | 2.9781 | 4.5651 | 1 |
3 | 2.9320 | 3.5519 | 1 |
4 | 3.5772 | 2.8560 | 1 |
将其用散点图表示,其中类标签由符号表示(+表示正类,o表示负类)。
positive = data[data['y'].isin([1])]
negative = data[data['y'].isin([0])]
fig, ax = plt.subplots(figsize=(8,6))
ax.scatter(positive['X1'], positive['X2'], s=50, marker='x', label='Positive')
ax.scatter(negative['X1'], negative['X2'], s=50, marker='o', label='Negative')
ax.legend()
<matplotlib.legend.Legend at 0xd9d6478240>
还有一个异常的正例在其他样本之外。这些类仍然是线性分离的,但它非常紧凑。 我们要训练线性支持向量机来学习类边界。
try C = 1 C=1 C=1
from sklearn import svm
svc = svm.LinearSVC(C