支持向量机

用SVM对手写字母进行分类

2019-02-25  本文已影响6人  apricoter

SVM 可用于离散因变量的分类和连续因变量的预测,相对于单一的分类算法(Logistic、决策树、KNN。朴素贝叶斯等)有更好的预测准确率,因为它可以将低维线性不可分的空间转换为高维的线性可分空间。

主要思想是利用某些支持向量所构成的“超平面”,将不同类别的样本点划分,无论样本点线性可分、近似线性可分或者非线性可分,都可以利用“超平面”将样本点以较高的准确度切割开来。

显著优点:鲁棒性(增加或删除非支持向量的样本点,不会改变分类器的效果)
避免”维度灾难“的发生(模型不会随数据维度提升而提高计算的复杂度)
避免过拟合,具有很好地泛化能力
解决小样本下机器学习问题;
解决非线性问题;
无局部极小值问题(相对于神经网络等算法);

明显缺点:模型不适合大样本的分类或预测,会消耗大量的计算资源和时间
对缺失样本很敏感,建模之前清洗好
对参数调节和核函数的选择敏感,原始分类器不加修改仅适用于处理二类
问题;
是黑盒模型,对计算得到的结果无法解释
对于核函数的高维映射解释力不强,尤其是径向基函数;

应用领域:文本分类、图像识别、主要二分类领域。

分隔带越宽,模型能将样本点划分的越清晰,模型泛化能力越强,分类可信度越高。
SVM就是在努力寻找这个最宽的“带”。

此数据集是当一个用户在设备中写入某个字母时,该设备需要准确地识别并返回写入字母的实际值,即根据字母的信息(宽度,高度,边际)判断属于哪一种字母。

因为模型涉及到惩罚系数C(松弛因子的系数)的影响,因此采用交叉验证的方法。

# 导入第三方模块
from sklearn import svm
import pandas as pd
from sklearn import model_selection
from sklearn import metrics
# 读取外部数据
letters = pd.read_csv(r'F:\letterdata.csv')
# 数据前5行
letters.head()

第一列letter为因变量

# 将数据拆分为训练集和测试集
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}
parameters
grid_linear_svc = model_selection.GridSearchCV(estimator = svm.LinearSVC(),param_grid =parameters,scoring='accuracy',cv=5,verbose =1)
grid_linear_svc
# 模型在训练数据集上的拟合
grid_linear_svc.fit(X_train,y_train)
# 返回交叉验证后的最佳参数值
grid_linear_svc.best_params_, grid_linear_svc.best_score_
# 模型在测试集上的预测
pred_ linear_svc = grid_linear_svc.predict(X_test)
# 模型的预测准确率
metrics.accuracy_score(y_test, pred_linear_svc)

经过5重交叉验证,最佳惩罚系数为0.1,在训练数据集上的平均准确率只有69.2%,在测试数据集上的预测准确率也不足72%,说明线性可分SVM模型不太适合改数据集的拟合和预测,使用非线性SVM重新建模。

# 使用网格搜索法,选择非线性SVM“类”中的最佳C值
kernel=['rbf','linear','poly','sigmoid']
C=[0.1,0.5,1,2,5]
parameters = {'kernel':kernel,'C':C}
grid_svc = model_selection.GridSearchCV(estimator = svm.SVC(),param_grid =parameters,scoring='accuracy',cv=5,verbose =1)
# 模型在训练数据集上的拟合
grid_svc.fit(X_train,y_train)
# 返回交叉验证后的最佳参数值
grid_svc.best_params_, grid_svc.best_score_
# 模型在测试集上的预测
pred_svc = grid_svc.predict(X_test)
# 模型的预测准确率
metrics.accuracy_score(y_test,pred_svc)

经过5重交叉验证,最佳惩罚系数C为5,最佳核函数为径向基核函数,平均准确率分别为97.34%,97.86%,说明非线性SVM模型更加理想。

上一篇下一篇

猜你喜欢

热点阅读