うずまき2017 powered by Jun-Systems

耳管開放症, SAS, 統計解析, 人工知能, プログラミングそれに思考

*

ディープボルツマンマシンとかいうので遊んだ

      2016/08/02

2016/08/02追記: 初学者の頃のブログ記事を読んで驚愕した。これdeepnet使って予測やってるけど、使ってるモデルDeep Belief Networkじゃないですか。
モデル学ばずに適当にデータ突っ込んでるとこういうことがおきますのでご注意ください。

最近機械学習系の話をいろいろ試してるんですけど,その中でもボルツマンマシンとかいうのにちょっと惹かれたので試してみる.なんかよくわかんないけどそのまま突っ込めばなんかいい感じの結果が出てくるという世間の噂を鵜呑みにして何もいじらずにちょっと遊ぶ.本当に全く予備知識のない状態でやります.

Rに入ってるIrisデータセットを使って花の品種を予測するモデルを作成し,予測精度を見ました.

ボルツマンマシンでの実装

使うパッケージはdeepnet

install.packages("deepnet")
library(deepnet)

データの作成

dat<-iris[which(iris$Species != "virginica"),]
sampled<-sample(nrow(dat),length(dat[,1])/2,replace=F)

dat.learn<-dat[sampled,]
dat.learn.x<-data.matrix(dat.learn[,1:4])
dat.learn.y<-as.numeric(dat.learn[,5]) -1

dat.predict<-dat[-sampled,]
dat.predict.x<-data.matrix(dat.predict[,1:4])
dat.predict.y<-(as.numeric(dat.predict[,5]) -1)

01で予測をかけたいのでとりあえずverginicaを落とし,データセットを学習用と予測用で半分に分割.あとは説明変数をmatrixに,目的変数をvectorにする.

dnn<-dbn.dnn.train(x=dat.learn.x,y=dat.learn.y)

すげえ.さくっと終わった.

RStudio
こうかっこいい感じで学習が進んでいくの,なんか,ちょっといいな.

nn.test(dnn,x=dat.predict.x,y=dat.predict.y)

いよいよテスト.nn.test()で吐き出されるのはエラーレートです.

RStudio

ふーん.
そんなもんなんだ.

とりあえず100回試行してエラー率の平均取るよ.


result.dnn<-rep(0,100)
dat.learn.y.mean<-rep(0,100)
for (i in 1:100){
  #簡単のために目的変数をbinomialに
  dat<-iris[which(iris$Species != "virginica"),]
  
  #ランダムサンプリングで半分に分割
  sampled<-sample(nrow(dat),length(dat[,1])/2,replace=F)
  dat.learn<-dat[sampled,]
  
  #データフレームから説明変数はmatrixに,目的変数は01のvectorに変換
  dat.learn.x<-data.matrix(dat.learn[,1:4])
  dat.learn.y<-(as.numeric(dat.learn[,5]) -1)
  
  #学習させる
  dnn<-dbn.dnn.train(x=dat.learn.x,y=dat.learn.y)
  
  #テストデータの作成
  dat.predict<-dat[-sampled,]
  dat.predict.x<-data.matrix(dat.predict[,1:4])
  dat.predict.y<-(as.numeric(dat.predict[,5]) -1)
  
  result.dnn[i]<-nn.test(dnn,x=dat.predict.x,y=dat.predict.y)
  dat.learn.y.mean[i]<-mean(dat.learn.y)
}
mean(result.dnn)
mean(dat.learn.y.mean)

> mean(result.dnn)
[1] 0.2665

ふーん.
そんなもんなんだ.

念のため,「もしかして全部1(もしくは0)に推定してんじゃねえか」と思われないように品種の比率も見てます.今回だと
> mean(dat.learn.y.mean)
[1] 0.4996
で全体で見てほぼ1:1の割合で2品種が含まれてるので,全部に0 or 1の同じ値をつければ正誤率は0.5ぐらいになりますし,ランダムにピックアップした1サンプルに適当に0か1のラベリングを行っても正誤率は0.5ぐらいになります.つまりその中でエラー率が平均0.2665ってことは,まあ何らかの予測はちゃんと行ったうえで正誤を間違っていて,なおかつランダムにやるよりは一応予測力は改善しておるわけであります.

しかしながら,元データ目視した限りだと,setosaとversicolorの分類だけならPetal.Width見ただけで9割ぐらい取れててもいい気がするじゃないですか.(欲を言えば100%予測できてもいい)
だってPetal.WidthとPetal.Lengthだけとって散布図プロットしてもこれだからね.
RStudio
このクソみたいにダサい散布図も念のためコード書いときますね.

plot(x=dat[,4],y=dat[,3],pch=16,col=rainbow(2)[dat[,5]],xlab="Petal.Width",ylab="Petal.Length")

k-meansで分類してみる

こんなんk-meansが最も得意とするところじゃねーかということでkmeansも試す.k-meansは教師なし(っていうかただのクラスタリング)なので,verginicaを落としただけの元データをそのままk-means突っ込んで分類させても…

km<-kmeans(x=dat[,1:4],2)
table(dat[,5],km$cluster)

kmeans

まあ当然ですわな.

考えてみるところ

なんかあんまり予測良くないし,もしかしてディープボルツマンマシンってこうやって使うやつじゃないのかな,などと思っていろいろ調べていたところStackOverflowとかで普通にdeepnetで同じやり方でIrisの多変量を実装してる人とかいた.しかも何のパラメータもいじらずに.
R deep learning, multiple outputs – Stack Overflow

あと適当に見てたら地元中京大学情報理工学部で開講されている確率統計学Bという講義で,deepnetでirisを扱う課題が出ていた.クロバリもやれというやつらしく,理系は学部でこういうことやれるのかと思うと楽しそうだし出席してみたさが募る.適当にやったので学部生は課題にあたってこういうブログを参考にしないでほしいしそもそも突っ込むだけなんだからこれぐらい自分でやれ.

とりあえずの雑感として本当にインプットとアウトプットしかないんだなあという驚きはある.普段モデル作ってあれこれ調整してる身としてはマジかという感じ.

あとはH2Oとかなどというライブラリも存在するらしいので,もうちょっといろいろやってみるかね.
pt.2に続く.


 - R Programming, 分析例 , , ,

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

  関連記事

no image
Rでお洒落なチェックを作る
no image
続・ディープボルツマンマシンとかいうので遊んだ
続2・深層学習でirisの品種予測.ーパラメータによる予測性能の比較ー
no image
Rの状態空間モデルdlmパッケージの使い方
no image
最近レコードの売上が伸びているらしいという話。