zoukankan      html  css  js  c++  java
  • 【机器学习与R语言】9- 支持向量机

    1.理解支持向量机(SVM)

    1)SVM特点

    • 支持向量机和神经网络都是“黑箱模型”的代表:潜在的模型基于复杂的数学系统,而且结果难以解释。
    • SVM的目标是创建一个平面边界(“超平面”),使得任何一边的数据划分都是均匀的。结合了kNN和线性回归。
    • 几乎适用于所有的学习任务,包括分类和数值预测。

    2)用超平面分类

    • 线性可分:可以由一条直线或一个平面进行划分

    image.png

    • 最大间隔超平面(MMH):很多线都能对数据点进行分类,但要寻找能使类形成最大间隔的那条线(因为在边界附近点位置的微小变化可能导致某些点落在线之外),支持向量就是每个类中最接近最大间隔超平面的点。所以单独使用支持向量,就能定义最大间隔超平面。

    image.png

    • 线性可分条件下,最大间隔超平面要尽可能远离两组数据点的外边界(“凸包”),最大间隔超平面就是两个凸包之间的最短距离直线的垂直平分线,可通过“二次优化”算法实现。

    image.png

    • 非线性可分:数据不是线性可分的条件下,使用一个“松弛变量”来创建一个软间隔,允许一些点落在线不正确的一边。

    图中字母为松弛项(错误落入点)

    • 非线性可分中的成本参数C:即所有违反约束的点,试图使总成本最小,而非寻找最大间隔。修改C将调整对于落在超平面错误一边的案例的惩罚。C越大,实现100%分离的优化就越困难。较小的C将把重点放在更宽的整体边缘。

    3)对非线性空间使用核函数

    • 另一种处理非线性问题的方法,就是使用“核技巧”的处理将问题映射到一个更高维的空间,这样非线性关系可能会变为完全线性。

    核技巧示例:新维度(海拔高度)使得类完全线性可分

    • 从本质上讲,核技巧涉及一个添加能够表述度量特征之间数学关系新特征的过程。
    • 非线性核SVM的特点:

    image.png

    • 核函数:线性核函数(特征的点积),多项式核函数(加一个非线性数据变换),S形核函数(类似神经网络的S形激活函数),高斯RBF核函数(类似RBF神经网络)。多数情况下,核函数的选择是任意的,因为性能可能只有轻微的变化。

    2. 支持向量机应用示例

    使用SVM进行光学字符识别(OCR图像处理):通过将印刷或手写文本转换为电子形式,保存在数据库种来处理纸质文件。

    难点:

    • 图像的规则模式很难严格定义
    • 图像数据往往是噪声数据

    1)收集数据

    数据集包含26个大写英文字母的2000个案例,使用20种不同的随机重塑和扭曲的黑斯和白色字体印刷。
    假设当图像字符被扫描到计算机,转换为像素,有16个统计属性(如水平垂直尺寸,黑色像素比例等)。
    image.png

    数据下载:

    链接: https://pan.baidu.com/s/1q8zHWkMZcapwnX90PA4hOg 提取码: eaqt

    2)探索和准备数据

    SVM需要所有特征都是数值型的,而且每一个特征需要缩小到一个相当小的区间内。所以不要有因子,而且要做标准化。这里略过没做。

    ## Example: Optical Character Recognition ----
    
    ## Step 2: Exploring and preparing the data ----
    # read in data and examine structure
    letters <- read.csv("letterdata.csv")
    str(letters)
    
    # divide into training and test data
    letters_train <- letters[1:16000, ] #80%
    letters_test  <- letters[16001:20000, ] #20%
    

    3)训练数据

    SVM的R包有e1071,klaR和kernlab等,这里用kernlab(与caret连用,允许SVM使用各种自动化方法进行训练和评估)。

    kernlab::ksvm(target~predictors, 
                     data=mydata, 
                     kernel="rbfdot", #隐非线性映射,rbfdot/polydot/tanhdot/vanilladot
                     c=1) #违法约束条件的惩罚,较大的c值导致较窄的边界
    

    训练:

    ## Step 3: Training a model on the data ----
    # begin by training a simple linear SVM
    library(kernlab)
    letter_classifier <- ksvm(letter ~ ., data = letters_train,
                              kernel = "vanilladot")  #默认使用高斯RBF核函数,这里用线性函数
    
    # look at basic information about the model
    letter_classifier
    

    image.png

    4)评估模型

    letter_predictions <- predict(letter_classifier, letters_test)
    
    head(letter_predictions)
    
    table(letter_predictions, letters_test$letter)
    

    image.png

    # look only at agreement vs. non-agreement
    # construct a vector of TRUE/FALSE indicating correct/incorrect predictions
    agreement <- letter_predictions == letters_test$letter
    table(agreement)
    prop.table(table(agreement))
    

    image.png
    识别的准确度大概为84%。

    5)提高性能

    可以使用一个更复杂的核函数,将数据映射到更高维的空间,获得一个较好的模型拟合度。如试试高斯RF核函数,或者修改成本约束参数C值来修正决策边界的宽度。

    ## Step 5: Improving model performance ----
    set.seed(12345)
    letter_classifier_rbf <- ksvm(letter ~ ., data = letters_train, kernel = "rbfdot") #高斯RBF核函数
    letter_predictions_rbf <- predict(letter_classifier_rbf, letters_test)
    
    agreement_rbf <- letter_predictions_rbf == letters_test$letter
    table(agreement_rbf)
    prop.table(table(agreement_rbf))
    

    image.png

    训练时间更长,将准确度提高到了93%。


    机器学习与R语言系列推文汇总:
    【机器学习与R语言】1-机器学习简介
    【机器学习与R语言】2-K近邻(kNN)
    【机器学习与R语言】3-朴素贝叶斯(NB)
    【机器学习与R语言】4-决策树
    【机器学习与R语言】5-规则学习
    【机器学习与R语言】6-线性回归
    【机器学习与R语言】7-回归树和模型树
    【机器学习与R语言】8-神经网络
    【机器学习与R语言】9-支持向量机
    【机器学习与R语言】10-关联规则
    【机器学习与R语言】11-Kmeans聚类
    【机器学习与R语言】12-如何评估模型的性能?
    【机器学习与R语言】13-如何提高模型的性能?

  • 相关阅读:
    php之工厂模式
    PHP 给GIF 缩略图实例代码
    WGS84 Mercator project转换的算法(C#)
    .net Enum用法
    Google Maps API编程资源大全
    结对作业
    使用Lightbox制作照片条
    使用css3中transition的页面切换
    使用css3中transition的页面切换(继续创新版)
    iframe中父窗口获取子窗口的元素
  • 原文地址:https://www.cnblogs.com/jessepeng/p/13636231.html
Copyright © 2011-2022 走看看