SVM模型的应用

SVM模型的应用

前言

  SVM是Support Vector Machine的简称,它的中文名为支持向量机,属于一种有监督的机器学习算法,可用于离散因变量的分类和连续因变量的预测。通常情况下,该算法相对于其他单一的分类算法(如Logistic回归、决策树、朴素贝叶斯、KNN等)会有更好的预测准确率,主要是因为它可以将低维线性不可分的空间转换为高维线性可分空间。由于该算法具有较高的预测准确率,所以其备受企业界的欢迎,如利用该算法实现医疗诊断、图像识别、文本分类、市场营销等。
  该算法的思想就是利用某些支持向量所构成的“超平面”,将不同类别的样本点进行划分。不管样本点是线性可分的、近似线性可分的还是非线性可分的,都可以利用“超平面”将样本点以较高的准确度切割开来。需要注意的是,如果样本点为非线性可分,就要借助于核函数技术,实现样本在核空间下完成线性可分的操作。关键是“超平面”如何构造,可查阅其它文献资料。
  运用SVM模型对因变量进行分类或预测时具有几个显著的优点:例如,由于SVM模型最终所形成的分类器仅依赖于一些支持向量,这就导致模型具有很好的鲁棒性(增加或删除非支持向量的样本点,并不会改变分类器的效果)以及避免“维度灾难”的发生(模型并不会随着数据维度的提升而提高计算的复杂度),模型具有很好的泛化能力,一定程度上可以避免模型的过拟合;也可以避免模型在运算过程中出现的局部最优。当然,该算法的缺点也是明显的,例如该模型不适合大样本的分类或预测,因为它会消耗大量的计算资源和时间;模型对缺失样本非常敏感,这就需要在建模前清洗好每一个样本;虽然可以通过核函数解决非线性可分问题,但是模型对核函数的选择也同样很敏感;SVM为黑盒模型(相比于回归或决策树算法),对计算得到的结果无法解释。

分类问题的解决

  本节所使用的数据集是关于手体字母的识别,当一个用户在设备中写入某个字母后,该设备就需要准确地识别并返回写入字母的实际值。很显然,这是一个分类问题,即根据写入字母的特征信息(如字母的宽度、高度、边际等)去判断其属于哪一种字母。该数据集一共包含20000个观测和17个变量,其中变量letter为因变量,具体的值就是26个英文字母。接下来利用SVM模型对该数据集的因变量做分类判断。
  首先使用线性可分SVM对手体字母数据集进行建模,由于该模型会受到惩罚系数C的影响,故采用交叉验证的方法,从给定的几种C值中筛选出一个相对合理的,代码如下:

# 导入第三方模块
from sklearn import svm
import pandas as pd
from sklearn import model_selection
from sklearn import metrics

# 读取外部数据
letters = pd.read_csv('datasource/letterdata.csv')
# 数据前5行,见图1
letters.head()

图1:数据的前5行预览
图1:数据的前5行预览
  图1反映了手体字母数据集的前5行预测,都是关于手写体的长、宽及坐标信息特征。通常在建模前都需要将原始数据集拆分为两个部分,分别用于模型的构建和测试,具体代码如下:

# 将数据拆分为训练集和测试集
predictors = letters.columns[1:]
X_train, X_test, y_train, y_test = model_selection.train_test_split(letters[predictors], letters.letter, test_size=0.25, random_state=1234)
# 使用网格搜索法,选择线性可分SVM“类”中的最佳C值
C = [0.05, 0.1, 0.5, 1, 2, 5]
parameters = {
   'C' : C}
grid_linear_svc = model_selection.GridSearchCV(estimator=svm.LinearSVC(), param_grid
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值