■google

■最近のコメント
■最近のトラックバック
■最近の記事
■月別アーカイブ
■ブログランキング
■ブログ検索

■ブロとも申請フォーム
■リンク
■RSSフィード
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


スポンサー広告 | --:--:--
カーネルSVM
久々の更新です。

最近、カーネルSVMの威力に驚いています。


基本的には、判別分析と同じで、
直線を引いて、この線よりこっち側はクラスAで
反対側はBですよというもの。
↓イメージ
SVM1


ただし、下の場合のようにどうしても線が引けない時が出てきてしまいます。
そんなときは、カーネル関数によって次元を上げてしまうのです。
SVM2


この図ですと、2次元から3次元にしたことによって、
2種類の○が直線によってわかられるのです。
(正確には平面)


「いやいや次元飛ばさなくても、曲線描けば分けられるよ」
と思うかも知れませんが、
解が計算できない場合が多いのです。

もちろん2次の判別関数(qda)というものも存在します。
まだ、判別関数について説明はしていませんが、
いずれしたいと思います。

判別関数にもちゃんとした長所もありますが
今回はSVMについて。
二つメリットを挙げます。

SVMは稀なデータでも可能
・精度がものすごく高い

稀に1がでてくるが、ほとんど0を予測するのは難しいです。
ロジスティック回帰でもなかなか正解率を上げるのは大変です。
でも、SVMは本当に稀に1というのもOK.

実際の社会でも、この稀に起こる現象がものすごく重要ということがあるのです。

例えば、
ミサイル誤発射、誘拐、洪水。。。
毎日何気なく通っているが一度も入ったことがないお店にふと入る。

実際に米軍がSVMを使っているという。

なんだか話はそれましたが、例を示します。

今回使うデータは、RのMASSライブラリの中のcats。

library(MASS)
cats


<出力の一部抜粋>
Sex Bwt Hwt
1 F 2.0 7.0
2 F 2.0 7.4
3 F 2.0 9.5
4 F 2.1 7.2
5 F 2.1 7.3
6 F 2.1 7.6
7 F 2.1 8.1
: : : :

サンプルは144、
変数は性別と体重(kg)と心臓の重さ(g)

ここで、体重と心臓の重さから、
性別を予測したいとおもいます。

まず、SVMを使う関数があるのは、e1071ライブラリです。
(kernlabライブラリにもある)

このe1071をインストールしたら、
以下の2つのコマンドによってカーネルSVMができます。

library(e1071)
re.svm<-svm(cats[,"Sex"]~.,data=cats,cross=10)

svm()の中の
cats[,"Sex"]~.,data=cats
はcatsデータの中の変数Sexをその他の変数で回帰するという意味です。
また、特に指定していませんが、カーネル関数を選択することも可能です。
詳しくは?svmを見てくださいね。
デフォルトはradial basis関数です。

cross=10は、10-fold クロスバリデーションを行うことを意味しています。
これは、

データをランダムに10分割して、
そのうちの1つをテストデータに、他の9つを学習データにして評価し、
次に、別の1つをテストデータに、他の9つを学習データにして評価する
さらに、別の1つをテストデータにして・・・・

※評価というのは、実測値と予測値があっているかの正解率です。

このように10個のデータの塊が交代でテストデータになっていきます。

summary(re.svm)によってその結果を示します。

re.svm


このTotal accuracyが100%になっていることがわかります。
当然ですが、10回のテストデータへの適用でも100%の正解率です。

抜群の正解率です。

ただし欠点は、判別関数でいうところの係数が判らないことです。
でも、どこかのネコ飼育所でオス、メスを自動的に分けるロボットが
作れるかもしれません。(心臓の重さはどうやって測るのだろう・・・)






スポンサーサイト
SVM | 00:08:56 | Trackback(0) | Comments(0)

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。