MENU

R で SVM の C パラメータについて具体例を示す

SVM(サポートベクターマシン)のコストパラメータ C について。

>>もう統計で悩むのは終わりにしませんか? 

↑期間・数量限定で無料プレゼント中!

目次

SVM の C とは?

SVM(サポートベクターマシン)のコストパラメータ C とは何か?

コストパラメータ C は誤分類を許容する指標。

C が小さいと誤分類を許容する。

大きいと誤分類を許容しない。

C が大きい場合は、複雑に分類している。

複雑に分類すると、学習しているデータでは誤分類せずきれいに分類できる。

しかし、汎用性は下がる。

テストデータでは分類性能が下がる。

C を小さくして、誤りをある程度許容すると汎化性能が上がる。

出典:Tokyo.R 41 サポートベクターマシンで眼鏡っ娘分類システム構築

SVM の C 例示のためのサンプルデータ準備

ISLRパッケージのOJデータを使う。

OJデータはシトラスヒル(CH)とミニッツメイド(MM)どちらのオレンジジュースを買ったかのデータ。

どちらのオレンジジュース買うかを予測する分類器を作成するというお題。

最初一回だけインストールする。

install.packages("ISLR")

呼び出すのがlibrary()だ。

library(ISLR)

学習セットのために1070件のデータの3分の2をサンプリングする。

同じ結果が得られるためにseedを決めておく。

set.seed(20180916)
sub <- c(sample(1:1070, round(1070*2/3)))

>>もう統計で悩むのは終わりにしませんか? 

↑1万人以上の医療従事者が購読中

SVM の C コストパラメータを変えて結果を確認してみる

コストのデフォルトは 1 で、指定しないと 1 で計算される。

model1 <- svm(Purchase ~ ., data = OJ[sub,], cross=10)
(svm.confusion.tr1 <- table(fitted(model1),OJ[sub,]$Purchase))
sum(diag(svm.confusion.tr1))/sum(svm.confusion.tr1)
pred1 <- predict(model1, newdata=OJ[-sub,])
(svm.confusion1 <- table(OJ[-sub,]$Purchase, pred1))
sum(diag(svm.confusion1))/sum(svm.confusion1)

学習セットの正答率は86.0%で、テストセットでは81.5%だ。

> (svm.confusion.tr1 <- table(fitted(model1),OJ[sub,]$Purchase))
CH  MM
CH 393  65
MM  35 220
> sum(diag(svm.confusion.tr1))/sum(svm.confusion.tr1)
[1] 0.8597475
> (svm.confusion1 <- table(OJ[-sub,]$Purchase, pred1))
pred1
CH  MM
CH 200  25
MM  41  91
> sum(diag(svm.confusion1))/sum(svm.confusion1)
[1] 0.8151261

コストを10倍の10にしてみる。

model2 <- svm(Purchase ~ ., data = OJ[sub,], cross=10, cost=10)
(svm.confusion.tr2 <- table(fitted(model2),OJ[sub,]$Purchase))
sum(diag(svm.confusion.tr2))/sum(svm.confusion.tr2)
pred2 <- predict(model2, newdata=OJ[-sub,])
(svm.confusion2 <- table(OJ[-sub,]$Purchase, pred2))
sum(diag(svm.confusion2))/sum(svm.confusion2)

学習セットの正答率は87.0%まで上がるが、テストセットでは78.4%に下がった。

コストを高くすると汎化性能は下がることがわかる。

> (svm.confusion.tr2 <- table(fitted(model2),OJ[sub,]$Purchase))
CH  MM
CH 394  59
MM  34 226
> sum(diag(svm.confusion.tr2))/sum(svm.confusion.tr2)
[1] 0.8695652
> (svm.confusion2 <- table(OJ[-sub,]$Purchase, pred2))
pred2
CH  MM
CH 193  32
MM  45  87
> sum(diag(svm.confusion2))/sum(svm.confusion2)
[1] 0.7843137

コストを0.1にしてみるとどうか?

model3 <- svm(Purchase ~ ., data = OJ[sub,], cross=10, cost=0.1)
(svm.confusion.tr3 <- table(fitted(model3),OJ[sub,]$Purchase))
sum(diag(svm.confusion.tr3))/sum(svm.confusion.tr3)
pred3 <- predict(model3, newdata=OJ[-sub,])
(svm.confusion3 <- table(OJ[-sub,]$Purchase, pred3))
sum(diag(svm.confusion3))/sum(svm.confusion3)

コスト1に比べると、学習セットでもテストセットでも正答率は下がる。

コストを下げ過ぎると性能が悪くなることがわかる。

> (svm.confusion.tr3 <- table(fitted(model3),OJ[sub,]$Purchase))
CH  MM
CH 383  80
MM  45 205
> sum(diag(svm.confusion.tr3))/sum(svm.confusion.tr3)
[1] 0.8246844
> (svm.confusion3 <- table(OJ[-sub,]$Purchase, pred3))
pred3
CH  MM
CH 201  24
MM  46  86
> sum(diag(svm.confusion3))/sum(svm.confusion3)
[1] 0.8039216

まとめ

以上、サポートベクターマシンのコストパラメータ C を変えてみて、分類器の性能を確認してみた。

コストパラメータは上げ過ぎても下げ過ぎてもよくないことがわかった。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

リサーチクエスチョン探し?データ分析?論文投稿?、、、で、もう悩まない!

第1章臨床研究ではなぜ統計が必要なのか?計画することの重要性
  • 推定ってどんなことをしているの?
  • 臨床研究を計画するってどういうこと?
  • どうにかして標本平均を母平均に近づけられないか?
第2章:研究目的をどれだけ明確にできるのかが重要
  • データさえあれば解析でどうにかなる、という考え方は間違い
  • 何を明らかにしたいのか? という研究目的が重要
  • 研究目的は4種類に分けられる
  • 統計専門家に相談する上でも研究目的とPICOを明確化しておく
第3章:p値で結果が左右される時代は終わりました
  • アメリカ統計協会(ASA)のp値に関する声明で指摘されていること
  • そうは言っても、本当に有意差がなくてもいいの…?
  • なぜ統計専門家はp値を重要視していないのか
  • 有意差がない時に「有意な傾向があった」といってもいい?
  • 統計を放置してしまうと非常にまずい
第4章:多くの人が統計を苦手にする理由
  • 残念ながら、セミナー受講だけで統計は使えません。
  • インプットだけで統計が使えない理由
  • どうやったら統計の判断力が鍛えられるか?
  • 統計は手段なので正解がないため、最適解を判断する力が必要
第5章:統計を使えるようになるために今日から何をすれば良いか?
  • 論文を読んで統計が使えるようになるための5ステップ
第6章:統計を学ぶために重要な環境
  • 統計の3つの力をバランスよく構築する環境

以下のボタンをクリックして、画面に出てくる指示に従って、必要事項を記入してください。

この記事を書いた人

統計 ER ブログ執筆者

元疫学研究者

統計解析が趣味

コメント

コメントする

目次