《Python大规模机器学习》 —3.2.2Scikit-learn的SVM实现

举报
华章计算机 发表于 2020/02/14 22:19:24 2020/02/14
【摘要】 本节书摘来自华章计算机《Python大规模机器学习》 一书中第3章,第3.2.2节,作者是[荷]巴斯蒂安·贾丁(Bastiaan Sjardin)[意]卢卡·马萨罗(Luca Massaron)[意]阿尔贝托·博斯凯蒂(Alberto Boschetti),王贵财 刘春明 译。

3.2.2Scikit-learn的SVM实现

Scikit-learn使用两个C++库(提供与其他语言交互的C语言API):用于SVM分类和回归的支持向量机库(LIBSVM)(http://www.csie.ntu.edu.tw/~cjlin/libSVM/)和在大型和稀疏数据集上使用线性方法的分类问题的用于LIBLINEAR(http://www.csie.ntu.edu.tw/~ cjlin/liblinear/)。这两个库都能免费使用,计算速度非常快,并且已在很多方法中得到测试,sklearn.svm模块中的所有Scikit-learn实现都依赖于其中一个或另一个(顺便说一下,也会用到Perceptron和LogisticRegression类),这使Python成为一个便捷的分装器。

另一方面,SGDClassifier和SGDRegressor使用不同实现,因为LIBSVM和LIBLINEAR都不能在线实现,两者都是批量学习工具。实际上,运行过程中LIBSVM和LIBLINEAR通过cache_size参数为内核操作分配合适的内存时都表现最好。

分类实现如表3-1所示。

表3-1分类实现

 image.png


 

回归方法如表3-2所示。

表3-2回归方法

image.png

如你所见,每个版本都需要调整大量超参数,当采用默认参数时,或者交叉验证适当调整时,在Scikit-learn中使用grid_search模块的GridSearchCV会让SVM具备优秀的学习能力。

作为黄金法则,某些参数会严重影响结果,因此有必要事先修正,而其他参数依赖其值。根据这样的经验规则,必须正确设置以下参数(按重要性排序):

 C:以前讨论过的惩罚值。减少它会使边界更大,从而忽略更多噪音,但会增加更多计算。通常在np.logspace(-3,3,7)范围内查找最佳值。

 kernel:非线性主角,SVM设置选项有linear、poly、rbf、sigmoid或自定义核(专业人士)。通常肯定使用rbf。

 degree:与kernel='poly'配合工作,表示多项式的展开维数,其他核不用。通常,取2~5范围内的值最好。

 gamma:'rbf'、'poly'和'sigmoid'的系数; 高值倾向于以更好方式拟合数据。推荐的网格搜索范围是np.logspace(-3,3,7)。

 nu:用于nuSVR和nuSVC的回归和分类; 该参数接近那些未被分类的训练点、误分类点和边界内或边界上的正确点。它的取值介于[0,1]范围之间,与训练集成比例关系。最后,它会像高的C值一样扩大边界。

 epsilon:定义一个ε值较大的范围,其中惩罚与点的真实值无关,这样该参数会指定SVR的错误发生率。建议搜索范围是np.inser(np.logspace(-4,2,7),0,[0])。

 penalty,损失和对偶:对于LinearSVC,这些参数允许取值('l1','squared_hinge',False)、('l2','hinge',True)、('l2','squared_hinge',True)和('l2','squared_hinge',False)组合。('l2','hinge',True)组合等同于SVC(kernel='linear')学习算法。

这里给出一个使用Scikit-learn的sklearn.svm模块实现SVC和SVR基本分类和回归的示例,算法中使用Iris和Boston数据集,它们两个是比较常用的简单数据集(http://scikit-learn.org/stable/datasets/)。

首先,加载Iris数据集:

 

 image.png

然后使用RBF核函数拟合SVC(在Scikit-learn的已知示例基础上设置C和伽玛)并使用cross_val_score函数测试结果:

 image.png

拟合模型可为用户指出训练样例中支持向量的索引:

 image.png

Iris数据集中表示SVC的支持向量,不同颜色代表不同区域(我们测试离散网格值以便能够提供预测模型,用于判断图形的每个区域所投影的类型),如图3-6所示。

 image.png

图3-6使用SVC和SVR处理简单数据集

 

如果你有兴趣复制相同图形,请查看http://scikit-learn.org/stable/auto_examples/SVM/plot_iris.html代码并调整。

 

可以使用SVR处理Boston数据集来测试SVM回归量。首先,将数据集上传到核心内存中,然后随机化实例顺序,显然,实际上这种数据集以巧妙方式排序,导致非顺序随机的交叉验证结果无效:

 image.png

由于使用NumPy包中random模块的permutation函数可能得到一个不同的打乱数据集,因此与以下交叉验证测试的得分略有不同。另外,对于不同比例的特征,对其进行标准化以使其具有零中心均值和单位方差是个不错选择。特别是使用SVM核函数时,标准化确实很重要。

最后,可以拟合SVR模型(使用熟悉且效果好的C、gamma和epsilon等参数)并进行交叉验证,以均方根差来对其评估:

image.png

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。