机器学习笔记 - 15. SVM实践(讲师:邹博)

核函数

机器学习笔记 - 15. SVM实践(讲师:邹博)_第1张图片
核函数

往往会选择高斯核函数

机器学习笔记 - 15. SVM实践(讲师:邹博)_第2张图片

映射关系两个不同变量之间求点乘,将其定义为核函数


机器学习笔记 - 15. SVM实践(讲师:邹博)_第3张图片
机器学习笔记 - 15. SVM实践(讲师:邹博)_第4张图片


机器学习笔记 - 15. SVM实践(讲师:邹博)_第5张图片
多项式核

如果n=3,则此多项式核函数有9+3+1=13个特征

多项式核函数,把原函数映射成平方或更高次的维度


机器学习笔记 - 15. SVM实践(讲师:邹博)_第6张图片

如图,根据原有SVM,无法将cancer样本区分出来,所以需要利用核函数,将cancer样本升维,其他样本降维,通过线性方式分开

机器学习笔记 - 15. SVM实践(讲师:邹博)_第7张图片
高斯核
机器学习笔记 - 15. SVM实践(讲师:邹博)_第8张图片
高斯核是无穷维的

利用泰勒展式展开,即形成第二行的算式

高斯核函数,把原始的函数映射成无穷维

先求φ,再去做映射是不可能的

高斯核函数->将线性的变成非线性

问:几种核函数的使用和数据集分布有关么?

答:可以无脑式的先试试高斯核函数,但是有些时候不见得一定使用高斯核函数,有些时候使用多项式核函数就够了。

实践中做一些探索性的项目,可以用SVM做图像分类,可以解决问题,也很稳定,不一定需要神经网络。但是用高斯核函数,在训练集很好,测试集却过不了。然后改成多项式核函数,就能把事情做得很好。

所以根据实践情况,来确定是否合适。

即如果没有太多的先验知识,可以先用高斯核函数,但是在训练集效果好,测试集效果不好,如过拟合,可以试着退回不太强的核函数,即多项式核函数。也许能得到更好的效果。

问:无穷维怎么算?

答:高斯核函数隐藏着φ(x),相当于帮我们做了无穷维。(保证半正定)

问:SVM做OCR合适么?

答:在现在的情况不一定合适。假定做中文的OCR,字符集成千上万,假定有一万个常用字,则需要做一万个分类。分类数量增多,SVM效果会降下去。只能说有一定的可能性,但不一定非常合适。

机器学习笔记 - 15. SVM实践(讲师:邹博)_第9张图片
高斯核的分类


机器学习笔记 - 15. SVM实践(讲师:邹博)_第10张图片


机器学习笔记 - 15. SVM实践(讲师:邹博)_第11张图片


机器学习笔记 - 15. SVM实践(讲师:邹博)_第12张图片
二变量优化问题


机器学习笔记 - 15. SVM实践(讲师:邹博)_第13张图片
SMO的迭代公式


机器学习笔记 - 15. SVM实践(讲师:邹博)_第14张图片
退出条件


机器学习笔记 - 15. SVM实践(讲师:邹博)_第15张图片


机器学习笔记 - 15. SVM实践(讲师:邹博)_第16张图片


机器学习笔记 - 15. SVM实践(讲师:邹博)_第17张图片
惩罚因子的影响

惩罚因子越小,抗过拟合能力越强,宽度越大


机器学习笔记 - 15. SVM实践(讲师:邹博)_第18张图片
高斯核函数的影响


机器学习笔记 - 15. SVM实践(讲师:邹博)_第19张图片
总结与思考

问:(xgboost的问题)用6分类的数据,训练集与测试集分开。为何出现过拟合?训练集准确率非常高,可是测试集非常差,请问如何改进?

答:可以尝试减少树的深度,增大λ的阻尼值


机器学习笔记 - 15. SVM实践(讲师:邹博)_第20张图片
作业

Python代码实践

1. 鸢尾花代码


机器学习笔记 - 15. SVM实践(讲师:邹博)_第21张图片


机器学习笔记 - 15. SVM实践(讲师:邹博)_第22张图片

SVC指:支撑向量分类器(Support Vector Classifier)

C取0.1,意味着α是从0~0.1

kernel: linear, 意味着使用线性核函数

decision function: 以鸢尾花三分类为例,给出某一个样本属于哪个类别的可能是比较大的

decision_function_shape: ovr,one_vs_rest。

得到三个SVM,根据得分大小,进行分类


机器学习笔记 - 15. SVM实践(讲师:邹博)_第23张图片


机器学习笔记 - 15. SVM实践(讲师:邹博)_第24张图片


机器学习笔记 - 15. SVM实践(讲师:邹博)_第25张图片


2. decision_function

SVM多分类器实现,用若干个二分类器,合成一个多分类器


机器学习笔记 - 15. SVM实践(讲师:邹博)_第26张图片


机器学习笔记 - 15. SVM实践(讲师:邹博)_第27张图片

可以加入np.set_printoptions(suppress=True),控制numpy的输出

scipy的:stats.multivariate_normal: 多元正态分布,将均值与方差喂给此函数,即可得到模型

用此模型调用rvs,即动态随机采样(Random Variable Sample)

sigmas * 0.1的目的:方差不要太大,有利于各个点分散一些,不要太聚在一起

a = np.array((0, 1, 2, 3)).reshape((-1, 1))的目的,是将a转换为:

arrary([[0],

            [1],

            [2],

            [3]])

的形式。

np.tile方法:如np.tile(a, N),即将arrary:a,复制N次,得到新的array。

如y = np.tile(a. 2),则得到:

array([[0, 0],

          [1,1],

          [2,2],

          [3,3]])

然后,我们对y做flatten,即做拉伸,得到新的array:

array([0,0,1,1,2,2,3,3])

等同于y.reshape(-1,)

这个目的就是得到分类向量y

svm的核函数使用的是高斯RBF, decistion function shape使用的是ovr: one-vs-rest,如果是4分类,则会输出多行4列的矩阵。

还有一个类别是ovo: one-vs-one,从四个类别之间两两之间做分类器,其实需要6个值(12,13,14,23,24,34)。即decision_function输出会是多行6列的矩阵。

取得分最大的列索引为分配的类别


机器学习笔记 - 15. SVM实践(讲师:邹博)_第28张图片

穿插讲解如何分类


机器学习笔记 - 15. SVM实践(讲师:邹博)_第29张图片

五角星相比蓝线距离是负数,相比红线与黑线距离是正数。

而五角星到黑线距离更远,则分类会将五角星分类到黑线类别

PS: 负数代表不可能属于这个类别

decision_function,会输出各个类别的得分,取得分最大的索引为分配的类别。


机器学习笔记 - 15. SVM实践(讲师:邹博)_第30张图片


机器学习笔记 - 15. SVM实践(讲师:邹博)_第31张图片


机器学习笔记 - 15. SVM实践(讲师:邹博)_第32张图片

3. SVM_draw

机器学习笔记 - 15. SVM实践(讲师:邹博)_第33张图片


机器学习笔记 - 15. SVM实践(讲师:邹博)_第34张图片


机器学习笔记 - 15. SVM实践(讲师:邹博)_第35张图片


机器学习笔记 - 15. SVM实践(讲师:邹博)_第36张图片


机器学习笔记 - 15. SVM实践(讲师:邹博)_第37张图片

此截图,方便看全plt.scatter的所有参数


机器学习笔记 - 15. SVM实践(讲师:邹博)_第38张图片


机器学习笔记 - 15. SVM实践(讲师:邹博)_第39张图片

另一种简洁绘制方式:


机器学习笔记 - 15. SVM实践(讲师:邹博)_第40张图片

4. ClassifierIndex

机器学习笔记 - 15. SVM实践(讲师:邹博)_第41张图片
分类器指标

以预测疾病为例进行解释:

精度(accuracy):将得病与未得病做对的预测/总样本个数

准确率(precision): 被诊断得病的样本个数/被诊断得病的样本个数+错误诊断得病的样本个数

召回率(recall): 被诊断得病的样本个数/被诊断得病的样本个数+得病但是没有被诊断得病的样本个数

Precision与Recall不可能同时增大,因此需要做加强,F1与Fβ就是做这个事情

如果β^2是∞,则Fβ就是Recall,如果β趋近于0,则Fβ趋近于Precision

F1是什么呢?当然就是β为1时的公式啊


机器学习笔记 - 15. SVM实践(讲师:邹博)_第42张图片
示例

实际数据:

4正    2负

预测

正    负

TP:3    FN:1

FP:2    TN:0

所以,

accuracy = (3 + 0) / (3 + 1 + 2 + 0) = 0.5

precision = 3 / 3 + 2 = 0.6

recall = 3 / 3 + 1 = 0.75

代码示例

机器学习笔记 - 15. SVM实践(讲师:邹博)_第43张图片

sklearn的metrics中,已经内置了precision, recall, f1, fbeta的计算类,可以直接使用

机器学习笔记 - 15. SVM实践(讲师:邹博)_第44张图片
机器学习笔记 - 15. SVM实践(讲师:邹博)_第45张图片
机器学习笔记 - 15. SVM实践(讲师:邹博)_第46张图片
机器学习笔记 - 15. SVM实践(讲师:邹博)_第47张图片

classification_report,可以将precision, recall, f1-score, support的值,根据各个分类,整体输出为一张表。非常方便。

5. unBalance

机器学习笔记 - 15. SVM实践(讲师:邹博)_第48张图片


机器学习笔记 - 15. SVM实践(讲师:邹博)_第49张图片

class_weight的参数:因为1的样本数据只有10个,所以权重设置很大,如class_weight={-1:1, 1:99}。但是设置为99未必一定好,设置为10其实效果也不错,或者说堪用了,不会完全过拟合。

机器学习笔记 - 15. SVM实践(讲师:邹博)_第50张图片



机器学习笔记 - 15. SVM实践(讲师:邹博)_第51张图片


机器学习笔记 - 15. SVM实践(讲师:邹博)_第52张图片


机器学习笔记 - 15. SVM实践(讲师:邹博)_第53张图片

问:如果样本不均衡比例达到1000:1,是不是只能通过增加样本来建模?

答:1000:1的情况是普遍存在的,比如金融欺诈数据。是的,实在搞不定,只能这样了

6. HandWrittenDigits

数据下载地址:http://archive.ics.uci.edu/ml/machine-learning-databases/optdigits/

一行数据表示一副图片:每行65个数字,前64个数字代表8x8的小图片,其数值代表黑色的强度:0~16,第65个数字代表对应的数字。

使用SVM,即是十分类问题

机器学习笔记 - 15. SVM实践(讲师:邹博)_第54张图片


机器学习笔记 - 15. SVM实践(讲师:邹博)_第55张图片
读取数据,注意iloc的用法



机器学习笔记 - 15. SVM实践(讲师:邹博)_第56张图片


机器学习笔记 - 15. SVM实践(讲师:邹博)_第57张图片

此处取高斯核,为了稳妥一些,gamma值足够小,相当于近似线性核


机器学习笔记 - 15. SVM实践(讲师:邹博)_第58张图片


机器学习笔记 - 15. SVM实践(讲师:邹博)_第59张图片

7. MNIST

28x28的图像,数据下载地址为:https://pjreddie.com/projects/mnist-in-csv/

数据集第一列是代表的数字,之后28x28列的数字,代表数字各个点的黑度

所以特征集通过: data.iloc[:,1:].values获取

真实值y,通过data.iloc[:,0].values获取

因为已经有mnist_test.csv作为测试集,所以无需train_test_split这个方法将训练集进行拆分

这些代码已经经过实际调试,确保运行正常

机器学习笔记 - 15. SVM实践(讲师:邹博)_第60张图片
机器学习笔记 - 15. SVM实践(讲师:邹博)_第61张图片

训练集的初始图片以及代表的数字:

机器学习笔记 - 15. SVM实践(讲师:邹博)_第62张图片
测试图片预览

SVM的核函数为高斯核函数

机器学习笔记 - 15. SVM实践(讲师:邹博)_第63张图片
根据参数选择训练算法


机器学习笔记 - 15. SVM实践(讲师:邹博)_第64张图片


机器学习笔记 - 15. SVM实践(讲师:邹博)_第65张图片
分类错误示例

随机森林训练的速度在一分钟以内

训练集的准确率在100%,随机森林确实挺强的

机器学习笔记 - 15. SVM实践(讲师:邹博)_第66张图片
随机森林训练速度及结果

但是SVM训练的速度就慢得多~~~

机器学习笔记 - 15. SVM实践(讲师:邹博)_第67张图片

如果说此例SVM算法的训练时间以及predict的时间,就令你怀疑人生,那是因为还没有见过训练几天几夜也结束不了的数据集与相关算法。。。

8. SVR

绘制支撑向量回归的曲线


机器学习笔记 - 15. SVM实践(讲师:邹博)_第68张图片

y: 正弦的曲线,加上一点噪声,噪声给的大一些,样本会随着曲线抖动的厉害一些

如果不要噪声,则构建完全在线的数据

机器学习笔记 - 15. SVM实践(讲师:邹博)_第69张图片
机器学习笔记 - 15. SVM实践(讲师:邹博)_第70张图片


机器学习笔记 - 15. SVM实践(讲师:邹博)_第71张图片

很显然,在这个例子,多项式核的能力是让我们吃惊的。完全没有按照正弦趋势走。

而SVR,高斯核,则体现出正弦曲线的趋势

问:SVR的损失函数?

答:SVR的损失函数与SVC的损失函数一致的。仍然是我们计算预测值和实际值误差的平方,作为它的损失值。但是这个值离的近的话,依然给它更大的损失;如果这个值足够远,就不要给它损失了。

9. Grid

机器学习笔记 - 15. SVM实践(讲师:邹博)_第72张图片
机器学习笔记 - 15. SVM实践(讲师:邹博)_第73张图片
机器学习笔记 - 15. SVM实践(讲师:邹博)_第74张图片

问:随机森林在实际应用中,要把所有输入特征离散化么?

答:这个根据具体情况。比如用随机森林做了鸢尾花数据的分类,而鸢尾花数据,事实上是连续的。所以不见得所有特征都要做离散化

你可能感兴趣的:(机器学习笔记 - 15. SVM实践(讲师:邹博))