1.理解支持向量機(jī)(SVM)
1)SVM特點(diǎn)
- 支持向量機(jī)和神經(jīng)網(wǎng)絡(luò)都是“黑箱模型”的代表:潛在的模型基于復(fù)雜的數(shù)學(xué)系統(tǒng),而且結(jié)果難以解釋。
- SVM的目標(biāo)是創(chuàng)建一個(gè)平面邊界(“超平面”),使得任何一邊的數(shù)據(jù)劃分都是均勻的。結(jié)合了kNN和線性回歸。
- 幾乎適用于所有的學(xué)習(xí)任務(wù),包括分類(lèi)和數(shù)值預(yù)測(cè)。
2)用超平面分類(lèi)
- 線性可分:可以由一條直線或一個(gè)平面進(jìn)行劃分

- 最大間隔超平面(MMH):很多線都能對(duì)數(shù)據(jù)點(diǎn)進(jìn)行分類(lèi),但要尋找能使類(lèi)形成最大間隔的那條線(因?yàn)樵谶吔绺浇c(diǎn)位置的微小變化可能導(dǎo)致某些點(diǎn)落在線之外),支持向量就是每個(gè)類(lèi)中最接近最大間隔超平面的點(diǎn)。所以單獨(dú)使用支持向量,就能定義最大間隔超平面。

- 線性可分條件下,最大間隔超平面要盡可能遠(yuǎn)離兩組數(shù)據(jù)點(diǎn)的外邊界(“凸包”),最大間隔超平面就是兩個(gè)凸包之間的最短距離直線的垂直平分線,可通過(guò)“二次優(yōu)化”算法實(shí)現(xiàn)。

- 非線性可分:數(shù)據(jù)不是線性可分的條件下,使用一個(gè)“松弛變量”來(lái)創(chuàng)建一個(gè)軟間隔,允許一些點(diǎn)落在線不正確的一邊。

- 非線性可分中的成本參數(shù)C:即所有違反約束的點(diǎn),試圖使總成本最小,而非尋找最大間隔。修改C將調(diào)整對(duì)于落在超平面錯(cuò)誤一邊的案例的懲罰。C越大,實(shí)現(xiàn)100%分離的優(yōu)化就越困難。較小的C將把重點(diǎn)放在更寬的整體邊緣。
3)對(duì)非線性空間使用核函數(shù)
- 另一種處理非線性問(wèn)題的方法,就是使用“核技巧”的處理將問(wèn)題映射到一個(gè)更高維的空間,這樣非線性關(guān)系可能會(huì)變?yōu)橥耆€性。

- 從本質(zhì)上講,核技巧涉及一個(gè)添加能夠表述度量特征之間數(shù)學(xué)關(guān)系新特征的過(guò)程。
- 非線性核SVM的特點(diǎn):

- 核函數(shù):線性核函數(shù)(特征的點(diǎn)積),多項(xiàng)式核函數(shù)(加一個(gè)非線性數(shù)據(jù)變換),S形核函數(shù)(類(lèi)似神經(jīng)網(wǎng)絡(luò)的S形激活函數(shù)),高斯RBF核函數(shù)(類(lèi)似RBF神經(jīng)網(wǎng)絡(luò))。多數(shù)情況下,核函數(shù)的選擇是任意的,因?yàn)樾阅芸赡苤挥休p微的變化。
2. 支持向量機(jī)應(yīng)用示例
使用SVM進(jìn)行光學(xué)字符識(shí)別(OCR圖像處理):通過(guò)將印刷或手寫(xiě)文本轉(zhuǎn)換為電子形式,保存在數(shù)據(jù)庫(kù)種來(lái)處理紙質(zhì)文件。
難點(diǎn):
- 圖像的規(guī)則模式很難嚴(yán)格定義
- 圖像數(shù)據(jù)往往是噪聲數(shù)據(jù)
1)收集數(shù)據(jù)
數(shù)據(jù)集包含26個(gè)大寫(xiě)英文字母的2000個(gè)案例,使用20種不同的隨機(jī)重塑和扭曲的黑斯和白色字體印刷。
假設(shè)當(dāng)圖像字符被掃描到計(jì)算機(jī),轉(zhuǎn)換為像素,有16個(gè)統(tǒng)計(jì)屬性(如水平垂直尺寸,黑色像素比例等)。

數(shù)據(jù)下載:
鏈接: https://pan.baidu.com/s/1q8zHWkMZcapwnX90PA4hOg 提取碼: eaqt
2)探索和準(zhǔn)備數(shù)據(jù)
SVM需要所有特征都是數(shù)值型的,而且每一個(gè)特征需要縮小到一個(gè)相當(dāng)小的區(qū)間內(nèi)。所以不要有因子,而且要做標(biāo)準(zhǔn)化。這里略過(guò)沒(méi)做。
## 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)訓(xùn)練數(shù)據(jù)
SVM的R包有e1071,klaR和kernlab等,這里用kernlab(與caret連用,允許SVM使用各種自動(dòng)化方法進(jìn)行訓(xùn)練和評(píng)估)。
kernlab::ksvm(target~predictors,
data=mydata,
kernel="rbfdot", #隱非線性映射,rbfdot/polydot/tanhdot/vanilladot
c=1) #違法約束條件的懲罰,較大的c值導(dǎo)致較窄的邊界
訓(xùn)練:
## 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") #默認(rèn)使用高斯RBF核函數(shù),這里用線性函數(shù)
# look at basic information about the model
letter_classifier

4)評(píng)估模型
letter_predictions <- predict(letter_classifier, letters_test)
head(letter_predictions)
table(letter_predictions, letters_test$letter)

# 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))

識(shí)別的準(zhǔn)確度大概為84%。
5)提高性能
可以使用一個(gè)更復(fù)雜的核函數(shù),將數(shù)據(jù)映射到更高維的空間,獲得一個(gè)較好的模型擬合度。如試試高斯RF核函數(shù),或者修改成本約束參數(shù)C值來(lái)修正決策邊界的寬度。
## Step 5: Improving model performance ----
set.seed(12345)
letter_classifier_rbf <- ksvm(letter ~ ., data = letters_train, kernel = "rbfdot") #高斯RBF核函數(shù)
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))

訓(xùn)練時(shí)間更長(zhǎng),將準(zhǔn)確度提高到了93%。