经典算法---支持向量机

来源:互联网 发布:蒙泰端口jv33 编辑:程序博客网 时间:2024/05/21 04:18

 

基本介绍

      在机器学习众多算法中支持向量机算法被广大使用者称为通用的算法,通常在使用模型进行训练的时候,可以首先考虑使用支持向量机来训练样本数据。该算法是根据支持向量(Support Vector)来确定超平面,从而对样本进行分类或回归预测,因而得名支持向量算法,使用支持向量机这个名称可能是因人们的习惯。

      支持向量机算法已经在很多领域如分本文类,图像分类,数据挖掘,手写字符识别等领域大显生手,且其可应用领域还远远不止这些。

      本打算对自己认识的支持向量机算法做个简介,但发现有大牛已经把这部分理论内容说的很透彻,在此就不想班门弄斧。本文主要从应用角度介绍该算法,介绍如何从Scikit-Learn中调用和参数调试,具体的理论和公式推导将会附上大牛的原著。

 

算法名词

支持向量机算法

官方简介这是一种监督学习方法,用于分类,回归和异常点的检测。弄清算法基本原理需要知道最大间隔原则,对偶表示和KKT条件

  

支持向量

对数据样本进行分隔时,支撑分割的线或平面上的点即为支持向量,如图1 虚线间隔边界上点则是支持向量。

   

                             图1 支持向量 

超平面

如图1我们很容易找到一条分类线,但如何确定这条分类线呢?图中我们看到两组样本都有离分割线很近的点,当我们找到两组样本中最近点到分割线距离最大的时候,这样我们就可以确定这个分割线。若是在三维空间,此处的分割线将会变成一个分割面,我们称这个分割面为超平面

 

核函数 

支持向量机算法分类和回归方法中都支持线性和非线性类型的数据类型。非线性类型通常在二维平面不可分,为了使数据可分,需要通过一个函数将原始数据映射到高维空间,从而使得数据在高维空间可以很容易区分,这样就达到数据分类或回归的目的,而实现这一目标的函数称为核函数

  

算法优缺点

优点在高维空间行之有效

         --当维数大于样本数时仍然可用(此时的效果不理想)

         --在决策函数中只使用训练点的一个子集(支持向量),大大节省了内存开销

         --用途广泛,决策函数中可使用不同的核函数,甚至自定义核函数

缺点 --SVM不直接提供概率估计

         --当特征数远大于样本数时,通过交叉验证计算,代价比较高

 

Scikit-Learn库调用和调参

Scikit-learn中支持向量机同时支持密集样本向量(numpy.ndarray和可通过numpy.asarray转化的数据类型)和稀疏样本向量(任何scipy.sparse对象)。但如果想用SVM对稀疏数据进行预测,则必须先在这些数据上拟合。 

下面介绍如何从Scikit_learn中调用SVM模型以及如何优化调参,案例使用sklearn的自带数据完整训练,因而不涉及特征工程,且只调用了SVC模型对breast_cancer数据进行训练,分类和预测,没有讨论更多模型情况。                                                                                                                           

 

1.采用默认参数调用SVC

fromsklearn.datasetsimportload_breast_cancer
from sklearn importsvm
from sklearn.model_selection import train_test_split


#Get the breast cancer data from sklearn libary

load = load_breast_cancer()
x , y = load.data, load.target
x_train, x_test, y_train, y_test = train_test_split(x,y,test_size=0.3,random_state=3)

model_svc = svm.SVC()
model_svc.fit(x_train, y_train)
print("Modelscore:",model_svc.score(x_test,y_test))
print("ActualY_test %s\nModle predict %s"%(y_test[:10],model_svc.predict(x_test)[:10]))

  

Output:

Model score: 0.637426900585

Actual Y_test [1 1 1 1 0 1 1 1 1 1]

Modle predict [1 1 1 1 1 1 1 1 1 1]

 

2.对模型SVC进行参数优化,为快速寻找最佳参数,将调用GridSearchCV方法

import numpy as np
from sklearn.datasets importload_wine, load_iris, load_breast_cancer
from sklearn importsvm
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
from matplotlib importpyplotasplt

load = load_breast_cancer()
x , y = load.data, load.target
x_train, x_test,y_train,y_test = train_test_split(x,y, test_size=0.3,random_state=3)


#Set different C and gamma value and use GridSearchCV 

gamma = list(map(lambdax:1/np.power(10,x),np.arange(1,6)))
C = [200, 100, 10,1,0.1]
param = {"gamma":gamma, "C":C}
clf = svm.SVC()
model_svc = GridSearchCV(clf,param,cv=5)
model_svc = model_svc.fit(x_train, y_train)
 
# for ss in score:
#     print("The score %s and params%s " %(ss[1],ss[0]))
 

print ("Model best Score %s---params%s"%(model_svc.best_score_,model_svc.best_params_))
print("Actual Y_test %s\nModle predict %s"%(y_test[:10],model_svc.predict(x_test)[:10]))

 

Output:

Model best Score 0.952261306533---params {'C':200, 'gamma': 1.0000000000000001e-05}

Actual Y_test [1 1 1 1 0 1 1 1 1 1]

Modle predict [1 1 1 1 0 1 1 1 1 1] 


通过修改模型SVCCgamma的参数,所有配置参数中,有一组配置参数,C=200,gamma=1e-5为最佳配置,模型的训练分数和预测效果比默认参数下有显著的提高。当然C值过大其损失函数值也会过于敏感。程序中有两行注释的代码,该代码用于打印显示模型所有的分数和配置参数,下面提取了模型前几个高分和配置参数,从中可以看到当gamma足够小的时候,C值为101也会有不错的结果。为了进一步分析Cgamma参数对模型训练的影响,接着将对C固定取值为1,然后调整gamma来观察模型的训练效果

 SVC模型中C和gamma取不同值训练得到分值较高的模型和配置参数

The score 0.952261306533 and params {'C': 200, 'gamma':1.0000000000000001e-05}

The score 0.942211055276 and params {'C': 100, 'gamma':1.0000000000000001e-05}

The score 0.942211055276 and params {'C': 10, 'gamma': 0.0001}

The score 0.934673366834 and params {'C': 10, 'gamma':1.0000000000000001e-05}

The score 0.929648241206 and params {'C': 1, 'gamma': 0.0001}

 

3.分析模型SVCgamma值对训练结果的影响

调整gamma值,其他参数均采用默认值,测试代码和结果图如下:

from sklearn.datasetsimportload_breast_cancer
from sklearn importsvm
from sklearn.model_selection import train_test_split
from matplotlib importpyplotasplt

load = load_breast_cancer()
x, y  = load.data, load.target
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=3)

#Set different gamma value to check the relation of  model score and gamma value  
gamma = list(map(lambdax:1/np.power(10,x),np.arange(1,10)))
score = []
for ga ingamma:
    model_svc = svm.SVC(gamma=ga)
    model_svc =model_svc.fit(x_train,y_train)
   score.append(model_svc.score(x_test,y_test))

print("Model score %s"%(score))
figure = plt.figure()
plt.plot(np.log10(gamma),score,'r')
plt.xlabel("Log10 forGamma")
plt.xticks(np.log10(gamma))
plt.ylabel("Modelscore")
plt.title("SVC model scoreand gamma relation")
plt.show()


Output:

Model score [0.9064327485380117,0.91812865497076024, 0.92982456140350878, 0.94736842105263153,0.91812865497076024, 0.63742690058479534, 0.63742690058479534]


SVC 模型只调整gamma参数, 分数和gamma值对应关系如图2


                                                                     图2 


  

本文主要从应用的角度介绍了支持向量机中的SVC模型调用和调参,而支持向量机的具体理论及其公式推导早有大牛详细解说,具体参考链接:

http://blog.csdn.net/v_july_v/article/details/7624837