美文网首页支持向量机
用SVM对手写字母进行分类

用SVM对手写字母进行分类

作者: apricoter | 来源:发表于2019-02-25 22:25 被阅读6次

    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模型更加理想。

    相关文章

      网友评论

        本文标题:用SVM对手写字母进行分类

        本文链接:https://www.haomeiwen.com/subject/imhnyqtx.html