{{category R}} !!!SVM: Support Vector Machine サポートベクターマシーン *分類には、境界部分のデータポイントに注目 *できるだけ距離を置いて分けられる方が良いという発想 {{pre install.packages("kernlab", dependencies = T) library(kernlab) }} !サンプリングの方法(トレーニングデータとテストデータの二種類のデータセットの作成) {{pre rnd.number <- sample(全体の数,ランダムサンプルする数) training.data <- data.frame[rnd.number, ] test.data <- data.frame[-rnd.number, ] }} !SVM関数 ksvm(分類カテゴリ~説明変数, data=データフレーム, kernel="使用するカーネル関数", kpar=パラメタ) *これでモデルを作って、predictでテストデータを使って試す predict(モデル, テストデータ) *もしくは、オプションで交差検証法を使う ** cross=交差検証法の回数 *カーネル関数 **vanilladot 線形カーネル **polydot 多項式カーネル ***kpar=list(degree=2) で2乗の多項式 **rbfdot ガウシアンカーネル ***kpar=list(sigma=1) sigmaが大きいと細かく複雑になる *kernelもkparも指定しなければ、自動で最適なものを適用してくれる! ksvm(分類カテゴリ~説明変数, data=データフレーム) だけでOK !!分析例 {{pre > str(training.errdat5) 'data.frame': 200 obs. of 52 variables: $ Criterion : Factor w/ 5 levels "1","2","3","4",..: 3 5 3 3 3 4 4 3 3 3 ... $ M.ADJ : num 0 0 0 0 0 0 0 0 0 0 ... $ M.ADV : num 0 1.08 1.1 0 0 ... $ M.CONJ : num 0 0.54 0 0 0 ... $ M.CONTR : num 0 0 0 0 0 0 0 0 0 0 ... $ M.DET : num 8.9 1.62 1.1 1.58 6.57 ... > str(test.errdat5) 'data.frame': 179 obs. of 52 variables: $ Criterion : Factor w/ 5 levels "1","2","3","4",..: 3 4 4 3 5 5 4 3 3 4 ... $ M.ADJ : num 0 1.154 2.493 0 0.709 ... $ M.ADV : num 2.985 1.154 3.324 0 0.709 ... $ M.CONJ : num 0 0 0 0 0 ... $ M.CONTR : num 0 0 0 0 0 0 0 0 0 0 ... $ M.DET : num 1.49 1.15 0 1.64 4.96 ... > rnd.number <- sample(379,200) > training.errdat5 <- errdat5[rnd.number, ] > test.errdat5 <- errdat5[-rnd.number, ] > errdat5.svm <- ksvm(Criterion~., data=training.errdat5) > errdat5.svm Support Vector Machine object of class "ksvm" SV type: C-svc (classification) parameter : cost C = 1 Gaussian Radial Basis kernel function. Hyperparameter : sigma = 0.0130333504236064 Number of Support Vectors : 200 Objective Function Value : -1.4671 -1.4843 -1.4522 -1.3289 -24.5718 -23.2186 -15.5245 -108.7821 -35.9234 -37.528 Training error : 0.29 > errdat5.pred <- predict(errdat5.svm, test.errdat5) > table(errdat5.pred, test.errdat5$Criterion) errdat5.pred 1 2 3 4 5 1 0 0 0 0 0 2 0 0 0 0 0 3 1 4 61 23 3 4 0 2 20 53 12 5 0 0 0 0 0 > errdat5.table <- table(errdat5.pred, test.errdat5$Criterion) > 1-sum(diag(errdat5.table))/sum(errdat5.table) [1] 0.3631285 }} *誤判別率36%(判別率あまりよくない) !confusion matrixから誤判別率の出し方 *diag()で対角線の値を取り出すのがポイント **つまり、confusion matrixで、対角線のところが正しく判別できたところになる。 **合ってた数の合計をテーブル全体を足した数で割れば、正判別率になる。 **それを1から引けば、誤判別率 !!References https://www.cis.doshisha.ac.jp/mjin/R/31/31.html http://yut.hatenablog.com/entry/20120827/1346024147 https://shohei-doi.github.io/notes/posts/2019-05-20-classification/#SVM