Rでnnetを試してみる
以前,SVMをさわってみましたが,それだけでは何なので他の分類器も使ってみることにしました.
まずは無難にニューラルネットワークから.
Rのnnetはインストール不要だし,そもそも最初にやっておけ,という話でもありますが...
iris実行コード&結果
SVMのときとあまり変わりません.
逆に言えば,変えずにほぼそのまま使えるのがRのよいところ.
library(nnet) train <- seq.int(1, 150, by=2) test <- setdiff(1:150, train) iris.nnet <- nnet(Species~., size=3, data=iris[train,]) iris.pred <- predict(iris.nnet, iris[test,], type="class") table(iris[test,5], iris.pred)
nnetの引数"size'で,隠れ層のユニット数を指定します.
# nnetのhelpより size number of units in the hidden layer. Can be zero if there are skip-layer units.
それから,predの"type"で出力形式を指定します.通常は"class"でよいでしょう.
# predic.nnetのhelpより If type = "raw", the matrix of values returned by the trained network; if type = "class", the corresponding class (which is probably only useful if the net was generated by nnet.formula).
# weights: 27 initial value 86.336297 iter 10 value 36.173022 iter 20 value 34.652665 iter 30 value 34.299414 iter 40 value 5.966404 iter 50 value 0.008819 iter 60 value 0.000990 iter 70 value 0.000717 final value 0.000091 converged iris.pred setosa versicolor virginica setosa 25 0 0 versicolor 0 24 1 virginica 0 3 22
実行してみると,正答率94.7%でした.まあまあ?
同様にBreast-cancer dataも
library(nnet) bcdata <- subset(read.csv('~/Downloads/breast-cancer-wisconsin.data', head=TRUE), select=-Samplecodenumber) train <- seq.int(1, 699, by=2) test <- setdiff(1:699, train) # decayはデフォルト0だが,今回は変更しないとまともに動作しなかった breast.nnet <- nnet(Class~., data=bcdata[train,], size=3, decay=0.1) breast.pred <- predict(breast.nnet, bcdata[test,], type="class") table(bcdata[test,10], breast.pred)
# weights: 34 initial value 352.980584 iter 10 value 177.479271 iter 20 value 51.829073 iter 30 value 36.800539 iter 40 value 34.257121 iter 50 value 33.375747 iter 60 value 33.096451 iter 70 value 32.962505 iter 80 value 32.940039 iter 90 value 32.916829 iter 100 value 32.912908 final value 32.912908 stopped after 100 iterations breast.pred benign malignant benign 223 8 malignant 9 109
正答率95.1%.