SVM迷你项目

文章目录
  1. 1. 项目背景
  2. 2. 运行代码
  3. 3. 时间
  4. 4. 减小训练集
  5. 5. 速度与准确率
  6. 6. 部署RBF内核
  7. 7. 优化C参数
  8. 8. 优化C后使用完整训练集
  9. 9. 从SVM提取预测
  10. 10. 预测Chris的邮件数量
  11. 11. 部署SVM最后提醒
  12. 12. 源码分享
  13. 13. 书签

项目背景

在此迷你项目中,我们将解决与朴素贝叶斯迷你项目相同的电子邮件作者 ID 问题,不同的是我们将运用 SVM。我们的研究结果将阐明两种算法之间的一些实际差异。此项目还向我们提供比朴素贝叶斯更多的机会来使用参数,因此我们也将这样做。

运行代码

转到 svm 目录,查找初始代码 (svm/svm_author_id.py)。

使用 sklearn SVC 分类器进行导入、创建、训练和预测。在创建分类器时使用线性内核(如果你忘记此步骤,你会发现分类器要花很长的时间来训练)。

分类器的准确率是多少?

时间

跟你在朴素贝叶斯迷你项目中所做的一样,将计时代码用于拟合和预测函数。与朴素贝叶斯相比,训练和预测如何计时?

朴素贝叶斯结果:

1
2
training time: 1.517 s
0.973265073948

SVM结果:

1
2
training time: 207.594 s
0.984072810011

减小训练集

加快算法速度的一种方式是在一个较小的训练数据集上训练它。这样做换来的是准确率几乎肯定会下降。让我们更具体地探讨这个问题:在训练分类器之前,立即加入以下两行。

1
2
features_train = features_train[:len(features_train)/100] 
labels_train = labels_train[:len(labels_train)/100]

这两行有效地将训练数据集切割至原始大小的 1%,丢弃掉 99% 的训练数据。你可以使其他所有代码保持不变。

现在的准确率是多少?
修改后SVM结果:

1
2
training time: 0.124 s
0.884527872582

速度与准确率

如果速度是一个主要考虑因素(对于许多实时机器学习应用而言确实如此),并且如果牺牲一些准确率可加快你的训练/预测速度,则你可能会想这样做。

在以下哪些应用中,你可以想象非常快速地运行的算法尤其重要?

1、预测电子邮件作者
2、标记信用卡欺诈,在欺诈发生之前阻止交易
3、Siri 之类的语音识别

答案是2和3。

部署RBF内核

保留上一个测试题中的训练集代码段,以便仍在 1% 的完整训练集上进行训练。将 SVM 的内核更改为“rbf”。

这个更复杂的内核给出的准确率是多少?

1
2
training time: 0.139 s
0.616040955631

优化C参数

保持训练集大小不变,并且保留上一个测试题中的 rbf 内核,但是尝试多个 C 值(比如:10.0、100.、1000. 和 10000.)。

哪个给出的准确率最高?结果依次为:

1
2
3
4
5
6
7
8
9
10
11
training time: 0.142 s
0.616040955631

training time: 0.139 s
0.616040955631

training time: 0.132 s
0.821387940842

training time: 0.127 s
0.892491467577

优化C后的准确率
在你为 RBF 内核优化了 C 值后,你会获得怎样的准确率?该 C 值是否对应更简单或者更复杂的决策边界?

(如果你不确定复杂度,请回顾本节课有关“SVM C 参数”的视频。你在该处发现的结果同样适用于此处,不过,在简单的散点图中画出决策边界现在变得更加困难甚至不可能。)

优化C后使用完整训练集

你已经为 RBF 内核优化了 C,现在恢复为使用完整的训练集。较大的训练集往往能提高算法的性能,所以(通过在大数据集上调整 C 和进行训练)我们应得到相当优化的结果。

经过优化的 SVM 的准确率是多少?

1
2
training time: 142.459 s
0.990898748578

从SVM提取预测

你的 SVM(0 或 1,分别对应 Sara 和 Chris)将测试集中的元素10、元素26和元素50分别预测为哪一类?

(使用 RBF 内核、C=10000 和 1% 的训练集。通常,使用完整的训练集能获得最好的结果,但是我们发现使用 1% 的完整训练集不仅大幅加快计算过程,而且不会改变我们的结果,因此你在这里可以随意使用该快捷算法。)

而且需要说明的是,我们这里给出的数据点数字 (10, 26, 50) 假设使用的是零索引列表。因此,使用类似于 answer=predictions[100] 的表达式可找到元素 # 100 的正确答案。

预测Chris的邮件数量

There are over 1700 test events–how many are predicted to be in the “Chris” (1) class? (Use the RBF kernel, C=10000., and the full training set.)

测试事件的数量超过 1700——其中多少预测在“Chris” (1) 类中?(使用 RBF 内核、C=10000. 以及完整的训练集。)

1
2
training time: 137.599 s
877

部署SVM最后提醒

希望 Sebastian 在说朴素贝叶斯非常适合文本时,更清楚地表达了他的意思。对于这一具体问题,朴素贝叶斯不仅更快,而且通常比 SVM 更出色。当然,SVM 更适合许多其他问题。你在第一次求解问题时就知道该尝试哪个算法,这是机器学习艺术和科学性的一个体现。除了选择算法外,视你尝试的算法而定,你还需要考虑相应的参数调整以及过拟合的可能性(特别是在你没有大量训练数据的情况下)。

我们通常建议你尝试一些不同的算法来求解每个问题。调整参数的工作量很大,但你现在只需要听完这堂课,我们将向你介绍 GridCV,一种几乎能自动查找最优参数调整的优秀 sklearn 工具。

源码分享

https://github.com/voidking/ud120-projects

书签

机器学习入门
https://cn.udacity.com/course/intro-to-machine-learning--ud120