深度学习基础知识

【机器学习与R语言】9- 支持向量机

2020-09-08  本文已影响0人  生物信息与育种

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

1)SVM特点

2)用超平面分类

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

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

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

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%。

上一篇 下一篇

猜你喜欢

热点阅读