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

核函数

核函数

往往会选择高斯核函数

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



多项式核

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

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


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

高斯核
高斯核是无穷维的

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

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

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

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

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

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

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

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

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

问:无穷维怎么算?

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

问:SVM做OCR合适么?

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

高斯核的分类




二变量优化问题


SMO的迭代公式


退出条件




惩罚因子的影响

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


高斯核函数的影响


总结与思考

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

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


作业

Python代码实践

1. 鸢尾花代码



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

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

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

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

decision_function_shape: ovr,one_vs_rest。

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





2. decision_function

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



可以加入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列的矩阵。

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


穿插讲解如何分类


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

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

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

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




3. SVM_draw





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



另一种简洁绘制方式:


4. ClassifierIndex

分类器指标

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

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

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

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

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

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

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


示例

实际数据:

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

代码示例

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

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

5. unBalance


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





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

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

6. HandWrittenDigits

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

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

使用SVM,即是十分类问题


读取数据,注意iloc的用法




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



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这个方法将训练集进行拆分

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

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

测试图片预览

SVM的核函数为高斯核函数

根据参数选择训练算法



分类错误示例

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

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

随机森林训练速度及结果

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

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

8. SVR

绘制支撑向量回归的曲线


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

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


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

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

问:SVR的损失函数?

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

9. Grid

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容