Support Vector Machine
导入库函数
1 | import numpy as np |
Example Dataset 1
画出含有两个特征的样本集的线性边界函数。
数据处理
1 | data=loadmat('ex6data1.mat') |
不知道标签的话可以查看
1 | print(data.keys()) # 用于查看标签名称 |
- 将数据可视化以便观察,注意要把正负样本分开可视化。
1 | #==================================观察数据 |
SVM拟合
可以通过改变c的大小来观察决策边界的变换。C的大小影响着模型对异常样本的反应。
因为这里是线性分类,所以使用线性核函数,参数kernel='linear'
。使用sklearn
中的svm.SVC()
来拟合,其结果返回一个分类器对象。最后还需要用clf.fit(X,y)
来拟合出最终模型。
1 | c=1 |
可视化决策边界
np.meshgrid()
生成网格点,再对每个网格点进行预测,最后画出等高线图,即决策边界。
关于np.meshgrid()
可以参考 Numpy中的Meshgrid。
1 | #=============================================可视化决策边界 |
像前面提到的,不同的C值对决策边界会产生不同影响
c=1时:
c=1000时:
注意左上角的正样本,c较大时,决策边界会过于追求将数据正确分类,而失去大间距的特点。
SVM with Gaussion Kernels
Gaussion Kernel
用SVM做分线性分类,我们需要用到高斯核函数。
- 公式:
- 代码:
1 | #=============================================高斯核函数 |
Example Dataset 2
- 数据处理及可视化
1 | data2=loadmat('ex6data2.mat') |
- 用高斯核函数拟合模型
1 | sigma=0.1 |
kernel='rbf'
代表使用高斯核函数,其中gamma
值就是公式中的整个分母项,即$\frac{1}{2\sigma^{2} }$。
- 决策边界
1 | plot_data(X2,y2) |
Example Dataset 3
- 数据处理即可视化
1 | data3=loadmat('ex6data3.mat') |
可以发现,有个别样本存在比较大的差异。
- 使用带高斯核函数的SVM进行训练
1 | clf=svm.SVC(c,kernel='rbf',gamma=gamma) |
- 决策边界
1 | plot_data(X3,y3) |
Spam Classification
建立一个垃圾邮件分类器,下面这个例子将会告诉你如何通过一封邮件来建立特征向量。
导入库函数
1 | import numpy as np |
Preprocesssing Email
- 读取数据
1 | with open('emailSample1.txt','r') as f: |
打印邮件内容为
1 | > Anyone knows how much it costs to host a web portal ? |
一般邮件都具有一些相似的内容,比如数字、URL、其它邮件地址。因此我们会采取一些”标准化“的方法来处理邮件,这些方法会提高垃圾邮件分类的性能。
例如:
1 | 1. Lower-casing: 把整封邮件转化为小写。 |
- 邮件内容处理:
1 | def process_email(email): |
再接下来提取词干,去除非字符内容,并返回一个单词列表。
1 | def email2TokenList(email): |
Vocabulary List
我们得到了邮件的单词列表,接下来需要结合记录实际中经常使用到的单词的词汇表vocab.txt
。函数返回邮件单词在词汇表中的索引值。
1 | def email2VocabIndices(email, vocab): |
得到的索引值如下:
Extracting Feature from Emails
如果邮件中的单词出现在词汇表的第i个位置,则把特征向量的第i个索引值置为1,;如果没出现,置为0。也就是说,建立一个和词汇表同维度的向量feature,再把上面得到的索引位置的值改写为1,其余为0。可以得到:
1 | def email_feature_vector(email): |
该向量长度为1899,其中有45个索引值为1。
Training SVM for Spam Classification
用已经预处理过的训练集和测试集来拟合模型,并计算准确度。
1 | clf = svm.SVC(C=0.1, kernel='linear') |
打印结果:
1 | 0.99825 0.989 |
Top predictors for Spam
返回权重最大的15个单词,这些单词出现频率高的邮件就是垃圾邮件。
1 | def get_vocab_list(): |
获取词汇表
1 | vocab_list = get_vocab_list() #得到词汇表 存在字典中 |
最终打印结果:
1 | otherwis (0.500614) |
参考资料
[1] 机器学习 | 吴恩达机器学习第七周编程作业(Python版)
[2] 吴恩达机器学习作业Python实现(六):SVM支持向量机
这次的代码几乎完全照抄两位大神的,实在是正则化的内容不懂,而因为用了sklearn库使得拟合变得又很简单。记录一下自己的naive,还得努力。