Machine Learning Practical Advices

Machine Learning


这篇文章主要是我在使用 SVM 分类器的一些经验

本文的一些结论可能完全是错误. 欢迎讨论

提前阅读

Andrew Ng 有一个很棒的 lecture, 讲如何应用 Machine Learning 方法 以及 遇到问题改如何去改进. Slides

Updated Doctrines

这里有一些结论还是值得商榷的

Kernel 的选用

  • 维度很高, 样本数少, 可以倾向 linear kernel
  • 纬度低, 样本数多, 可以倾向 rbf kernel
  • RBF kernel 最好对数据 标准化 (均值为0, 方差为1) 和 归一化 scaled 到 [-1,1] 或者 [0,1]
  • 非线性内核最差为 \(O(n^2)\), 尽量选择线性方法

Learning Error Curve 非常关键

通过对 Traing Error 和 Learning Error 的曲线分析, 可以找出问题在哪里.

  • 如果 Training/Learning Error 之间差距很小, 但是两者都精度差, 说明有很高的偏差, 可能需要改进 feature, 说明 feature 没有很好刻画这个样本之间的差异

  • 如果 Training Error 曲线很好, 但是 Learning Error 没有贴近, 或者 方差很大, 说明了, 要不是样本数少了, 要不是选了一些不好的 features, 可以考虑做一下 feature selection.

Weka 和 scikit learning 很适合 prototype

快速开发原型, 再来调试和优化, 最后再做 implementation Weka 的 GUI 工具和 CLI 工具很适合调试, Scikit learning 是 python 写的, 也很适合快速开发, 再不济 matlab 也不错, 当然我不懂 R, 也会有人推荐这个. 最后在考虑在自己的平台或者系统中(android, ios)里如何较好的实现.

One Class v.s. Multi Class

选择哪一种 classifier 取决于你得应用场景, 也就是说 到底能不能得到 label 信息. 比如最简单的 给了一些动物的图片, 来进行分类, 这里很显然我们是知道 label 信息的, 所以应该用 multi-class 分类器. 然后, 有一些场景, 虽然在一些 research paper 中, 作者还是用得 two-class, 但是显然 one-class 应该更贴近实际, 比如 authentication. 一般情况下, authentication 只能拿到 positive 的样本, 所以就缺失了 negative 的 labels. 因此, one-class 也常用来做 novelty detection 和 outlier detection. 不过, 在我看来, 就算是 one-class 的情况, multi-class 也是有参考价值的, 因为它给出了一个上限, 也就是说 one-class 如果能够做到最好, 也许就是接近 multi-class 的结果. (这只是我得感觉, 并不是严谨的结论.). 也就是说如果你得 one-class 结果和 two/multi-class 的结果 还有很大的差距的话, 说明还是有很多提升的空间的.

SVDD vs oneClassSVM

这两种 one-class 实现, 我都用过, 感觉, SVDD 更适合于所有的 training data 都是 labeled 而且这中间并没有 错误. 比如 这个 dataset 中 所有的病人样本都是确诊为这个病的. 对于 training dataset 中就有 outlier 的情况下, oneclasssvm 更好用一些.

Two-Class

Two-class 就是给出 yes or no. 虽然和 one-class output 一样 但是 在 training phase, 两者有不同. 因为 two-class 有 negative labeled 的数据. 注意, 一般 two-class 中 positive 和 negative 的样本数应该接近, 否则 trainning 得到的 classifier 很有可能是 biased.

标准化和归一化

这个需要试一试, 首先是需不要进行 standarize 和 normalize, 是其中一个还是两个都用. 不过一般 scale 之后的结果都会更好.

先写这些, 以后再继续 update.