sklearn svm基本使用

栏目: 编程工具 · 发布时间: 7年前

内容简介:SVM在解决分类问题具有良好的效果,出名的软件包有推荐使用SVM的步骤为:

SVM基本使用

SVM在解决分类问题具有良好的效果,出名的软件包有 libsvm (支持多种核函数), liblinear (线性核)。此外 python 机器学习库scikit-learn也有svm相关算法, sklearn.svm. SVC

sklearn.svm.LinearSVR 分别由libsvm和liblinear发展而来。

推荐使用SVM的步骤为:

  1. 将原始数据转化为SVM算法软件或包所能识别的数据格式;
  2. 将数据标准化;(防止样本中不同特征数值大小相差较大影响分类器性能)
  3. 不知使用什么核函数,考虑使用RBF;
  4. 利用交叉验证网格搜索寻找最优参数(C, γ);(交叉验证防止过拟合,网格搜索在指定范围内寻找最优参数)
  5. 使用最优参数来训练模型;
  6. 测试。

下面利用scikit-learn说明上述步骤:

 1 import numpy as np
 2 from sklearn.svm import SVC
 3 from sklearn.preprocessing import StandardScaler
 4 from sklearn.model_selection import GridSearchCV, train_test_split
 5 
 6 def load_data(filename)
 7     '''
 8     假设这是鸢尾花数据,csv数据格式为:
 9     0,5.1,3.5,1.4,0.2
10     0,5.5,3.6,1.3,0.5
11     1,2.5,3.4,1.0,0.5
12     1,2.8,3.2,1.1,0.2
13     每一行数据第一个数字(0,1...)是标签,也即数据的类别。
14     '''
15     data = np.genfromtxt(filename, delimiter=',')
16     x = data[:, 1:]  # 数据特征
17     y = data[:, 0].astype(int)  # 标签
18     scaler = StandardScaler()
19     x_std = scaler.fit_transform(x)  # 标准化
20     # 将数据划分为训练集和测试集,test_size=.3表示30%的测试集
21     x_train, x_test, y_train, y_test = train_test_split(x_std, y, test_size=.3)
22     return x_train, x_test, y_train, y_test
23 
24 
25 def svm_c(x_train, x_test, y_train, y_test):
26     # rbf核函数,设置数据权重
27     svc = SVC(kernel='rbf', class_weight='balanced',)
28     c_range = np.logspace(-5, 15, 11, base=2)
29     gamma_range = np.logspace(-9, 3, 13, base=2)
30     # 网格搜索交叉验证的参数范围,cv=3,3折交叉
31     param_grid = [{'kernel': ['rbf'], 'C': c_range, 'gamma': gamma_range}]
32     grid = GridSearchCV(svc, param_grid, cv=3, n_jobs=-1)
33     # 训练模型
34     clf = grid.fit(x_train, y_train)
35     # 计算测试集精度
36     score = grid.score(x_test, y_test)
37     print('精度为%s' % score)
38 
39 if __name__ == '__main__':
40     svm_c(load_data('example.csv'))

其它内容

网格搜索小技巧

网格搜索法中寻找最优参数中为寻找最优参数,网格大小如果设置范围大且步长密集的话难免耗时,但是不这样的话又可能找到的参数不是很好,针对这解决方法是,先在大范围,大步长的粗糙网格内寻找参数。在找到的参数左右在设置精细步长找寻最优参数比如:

  1. 一开始寻找范围是 C = 2 −5 , 2 −3 , . . . , 2 15 and γ = 2 −15 , 2 −13 , . . . , 2 3 .由此找到的最优参数是(2 3 , 2 −5 );
  2. 然后设置更小一点的步长,参数范围变为2 1 , 2 1.25 , . . . , 2 5 and γ = 2 −7 , 2 −6.75 , . . . , 2 −3   在这个参数范围再寻找最优参数。

这样既可以避免一开始就使用大范围,小步长而导致分类器进行过于多的计算而导致计算时间的增加。

线性核和RBF的选择

如果训练样本的特征数量过于巨大,也许就不需要通过RBF等非线性核函数将其映射到更高的维度空间上,利用非线性核函数也并不能提高分类器的性能。利用linear核函数也可以获得足够好的结果,此外,也只需寻找一个合适参数C,但是利用RBF核函数取得与线性核函数一样的效果的话需要寻找两个合适参数(C, γ)。

分三种情况讨论:

  1. 样本数量远小于特征数量:这种情况,利用情况利用linear核效果会高于RBF核。
  2. 样本数量和特征数量一样大:线性核合适,且速度也更快。liblinear更适合
  3. 样本数量远大于特征数量: 非线性核RBF等合适。

本文主要参考这篇 A Practical Guide to Support Vector Classification

libsvm: A Library for Support Vector Machines

liblinear : A Library for Large Linear Classification

sklearn : scikit-learn Machine Learning in Python


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Node.js in Action

Node.js in Action

Mike Cantelon、Marc Harter、TJ Holowaychuk、Nathan Rajlich / Manning Publications / 2013-11-25 / USD 44.99

* Simplifies web application development * Outlines valuable online resources * Teaches Node.js from the ground up Node.js is an elegant server-side JavaScript development environment perfect for scal......一起来看看 《Node.js in Action》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具