Rで使える機械学習の手法の比較

使うのはアヤメのデータ(iris)
縦軸: Sepal.Width, 横軸: Sepal.Lengthでプロットする

ggplot(iris,aes(x=Sepal.Length,y=Sepal.Width,color=rev(Species)))+geom_point()


k-meansクラスタリング

R言語プログラミング: クラスター分析 - k-means
http://d.hatena.ne.jp/hamadakoichi/20100415/p1
Rでk平均法を使う
http://xn--p8ja5bwe1i.jp/wiki/%E3%83%90%E3%82%A4%E3%82%AA%E3%83%BB%E3%83%87%E3%83%BC%E3%82%BF%E3%83%BB%E3%83%9E%E3%82%A4%E3%83%8B%E3%83%B3%E3%82%B0/R%E3%81%A7k%E5%B9%B3%E5%9D%87%E6%B3%95%E3%82%92%E4%BD%BF%E3%81%86/

km <- kmeans(iris[,1:4],3)
result <- km$cluster
result <- as.vector(result)
df <- transform(iris,kmeans=result)
ggplot(df,aes(x=Sepal.Length,y=Sepal.Width,color=factor(kmeans),group=kmeans))+geom_point()


MDS:多次元尺度構成法

ML for hackers, Chapter9 (MDS)を参照
http://shop.oreilly.com/product/0636920018483.do

iris.matrix <- as.matrix(iris[,1:4])
rownames(iris.matrix) <- iris$Species
iris.adjacent <- iris.matrix %*% t(iris.matrix)
iris.dist <- dist(iris.adjacent)
iris.mds <- cmdscale(iris.dist)
iris.df <- data.frame(Species=rownames(iris.mds),mds1=iris.mds[,1],mds2=iris.mds[,2])
ggplot(iris.df,aes(x=mds1,y=mds2,color=rev(factor(Species)),group=Species))+geom_point()


PCA:主成分分析

Rによるデータサイエンス1.3.7章、p.75を参考

iris.pca <- princomp(iris[,-5])
plot(iris.pca$scores,type='n')
lab<-as.numeric(iris[,5])
text(iris.pca$scores,label=lab,col=lab)
biplot(iris.pca)



SVMサポートベクターマシン

Rで行うSVM解析
http://bi.biopapyrus.net/compute/r-svm.html
パッケージユーザーのための機械学習(3):サポートベクターマシン(SVM)
http://tjo.hatenablog.com/entry/2013/12/03/183055

多クラスSVM:e1071のパッケージで標準に使える

library('e1071')
iris.svm <- svm(Species~.,data=iris)
prediction <- predict(iris.svm,iris)
table(prediction,iris[,5])
df <- transform(iris,svm=prediction)
ggplot(df,aes(x=Sepal.Length,y=Sepal.Width,color=svm,group=svm))+geom_point()


階層的クラスタリング

R言語プログラミング: クラスター分析 - 階層的クラスタリング
http://d.hatena.ne.jp/hamadakoichi/20100324/p1
Rで階層クラスタリングを使う
http://xn--p8ja5bwe1i.jp/wiki/%E3%83%90%E3%82%A4%E3%82%AA%E3%83%BB%E3%83%87%E3%83%BC%E3%82%BF%E3%83%BB%E3%83%9E%E3%82%A4%E3%83%8B%E3%83%B3%E3%82%B0/R%E3%81%A7%E9%9A%8E%E5%B1%A4%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%82%92%E4%BD%BF%E3%81%86/

色の付け方:http://stackoverflow.com/questions/18036094/how-to-create-a-dendrogram-with-colored-branches
階層的クラスタリングを分類に使い時は
k近傍法と組合せよとのこと http://stackoverflow.com/questions/21064315/how-do-i-predict-new-datas-cluster-after-clustering-training-data

iris.matrix <- as.matrix(iris[,-5])
rownames(iris.matrix) <- iris[,5]
iris.dist <- dist(iris.matrix)
iris.cls <- hclust(iris.dist)
require(devtools)
install_github('dendextend', 'talgalili')
require(Rcpp) #不要?
install_github('dendextendRcpp', 'talgalili') #不要?
require(dendextend)
dend <- as.dendrogram(iris.cls)
d <- color_branches(dend,k=5,col=c(2,3,4,5,6))
plot(d)

決定木

Rで決定木を使う
http://xn--p8ja5bwe1i.jp/wiki/%E3%83%90%E3%82%A4%E3%82%AA%E3%83%BB%E3%83%87%E3%83%BC%E3%82%BF%E3%83%BB%E3%83%9E%E3%82%A4%E3%83%8B%E3%83%B3%E3%82%B0/R%E3%81%A7%E6%B1%BA%E5%AE%9A%E6%9C%A8%E3%82%92%E4%BD%BF%E3%81%86/

library(mvpart)
iris.tree <- rpart(Species~.,data=iris)
plot(iris.tree,uniform=T)
text(iris.tree,uniform=T,use.n=T,all=F,pretty=1)
library(mvpart)
iris.tree <- rpart(Species~.,data=iris)
plot(iris.tree,uniform=T)
text(iris.tree,uniform=T,use.n=T,all=F,pretty=1)
predtree <- predict(iris.tree,data=iris)
df <- transform(iris,rpart=colnames(predtree)[max.col(predtree)])
ggplot(df,aes(x=Sepal.Length,y=Sepal.Width,color=rev(rpart),group=rpart))+geom_point()



ランダムフォレスト

R言語による Random Forest 徹底入門−集団学習による分類・予測−
http://d.hatena.ne.jp/hamadakoichi/20110130/p1
http://www.slideshare.net/hamadakoichi/introduction-torandomforest-tokyor
パッケージユーザーのための機械学習(5):ランダムフォレスト
http://tjo.hatenablog.com/entry/2013/12/24/190000

library(randomForest)
iris.rf <- randomForest(Species~.,data=iris)
iris.pred <- predict(iris.rf,data=iris)
iris.pred.df <- transform(iris,randomForest=iris.pred)
ggplot(iris.pred.df,aes(x=Sepal.Length,y=Sepal.Width,color=rev(randomForest),group=randomForest))+geom_point()


ロジスティック回帰

(多クラスロジスティック回帰?多項ロジットモデル?)

参考:ロジスティック回帰+確率的勾配降下法 http://d.hatena.ne.jp/n_shuyo/20110710/logistic
ロジスティック回帰 http://aidiary.hatenablog.com/entry/20100430/1272590402

結局multinom関数を使うことに
やるのはMultinomial logistic regression 多重ロジスティック回帰。
多変数ロジスティック回帰(Multi variable logistic regression)とは異なる。
R Data Analysis Examples: Multinomial Logistic Regression http://www.ats.ucla.edu/stat/r/dae/mlogit.htm

library(reshape2)
ml <- iris
ml$Species2 <- relevel(ml$Species,ref='setosa')
test <- multinom(Species2 ~ Sepal.Length+Sepal.Width+Petal.Length+Petal.Width,data=ml)
prediction <- predict(test,newdata=iris[,1:4],'probs')
predicted <- colnames(prediction)[max.col(round(prediction))]
result <-table(predicted,iris$Species)
sum(diag(result))/sum(result)
df <- transform(iris,MultiLogitRegression=predicted)
ggplot(df,aes(x=Sepal.Length,y=Sepal.Width,color=rev(MultiLogitRegression)))+geom_point()

ナイーブベイズ

http://xn--p8ja5bwe1i.jp/wiki/%E3%83%90%E3%82%A4%E3%82%AA%E3%83%BB%E3%83%87%E3%83%BC%E3%82%BF%E3%83%BB%E3%83%9E%E3%82%A4%E3%83%8B%E3%83%B3%E3%82%B0/R%E3%81%A7Na%C3%AFve%20Bayes%E3%82%92%E4%BD%BF%E3%81%86/

library('e1071')
nb <- naiveBayes(Species~.,iris)
nb.predict <- predict(nb,iris)
table(nb.predict,iris$Species)
df <- transform(iris,NaiveBayes=nb.predict)
ggplot(df,aes(x=Sepal.Length,y=Sepal.Width,color=rev(NaiveBayes)))+geom_point()

混合分布モデル:混合ガウス分布モデル(GMM)

(より一般的な枠組みとして、EMアルゴリズム
http://d.hatena.ne.jp/hamadakoichi/20100415/p2

library(mclust)
iris.mc <- Mclust(iris[,1:4],G=3,modelNames="EII")
result <- iris.mc$classification
ctbl <- table(result,iris[,5])
df <- transform(df,GMM=result)
ggplot(df,aes(x=Sepal.Length,y=Sepal.Width,color=rev(factor(GMM))))+geom_point()


ニューラルネットワーク

パッケージユーザーのための機械学習(4):ニューラルネットワーク
http://tjo.hatenablog.com/entry/2013/12/13/190958

require(nnet)
d.nnet <- nnet(Species~.,iris,size=5)
predict(d.nnet,iris[,-5])
prediction <- (predict(d.nnet,iris[,-5]))
nnet.pred.vec <- colnames(prediction)[max.col(round(prediction,0))]
df <- transform(iris,NNet=nnet.pred.vec)
ggplot(df,aes(x=Sepal.Length,y=Sepal.Width,color=rev(NNet)))+geom_point()


k近傍法

参考:http://wacky.hatenablog.jp/entry/2013/08/13/190217

k=1(最近傍法)

train:test=8:2で分割

library(class)
n <- nrow(iris)
indices <- sample(1:n,n*0.8)
iris.train <- iris[indices,1:4]
iris.test <- iris[-indices,1:4]
c <- iris[rownames(iris.train),5]
knn1 <- knn1(iris.train,iris.test,c)
df <- transform(iris.test,KNN=knn1)
ggplot(df,aes(x=Sepal.Length,y=Sepal.Width,color=rev(factor(KNN))))+geom_point()


k=3:3近傍法
library(class)
n <- nrow(iris)
indices <- sample(1:n,n*0.8)
iris.train <- iris[indices,1:4]
iris.test <- iris[-indices,1:4]
c <- iris[rownames(iris.train),5]
knn(iris.train,iris.test,c,k=3,prob=T)
knn <- knn(iris.train,iris.test,c,k=3,prob=T)
df <- transform(iris.test,KNN=knn1)
ggplot(df,aes(x=Sepal.Length,y=Sepal.Width,color=rev(factor(KNN))))+geom_point()


k-NN Cross Validatioin

交差検証k近傍法

knn.cv <- knn.cv(train,c,k=3)
df <- transform(iris,KNN.CV=knn.cv)
ggplot(df,aes(x=Sepal.Length,y=Sepal.Width,color=rev(factor(KNN.CV))))+geom_point()


自己組織化マップ(SOM)

somライブラリ
library(som)
iris1 <- normalize(iris[,1:4])
iris.som2 <- som(iris1,xdim=6,ydim=5)
ransu <- cbind(rnorm(nrow(iris),0,0.13),rnorm(nrow(iris),0,0.13))
out.new <- iris.som2$visual[,1:2]+0.5+ransu
plot(out.new[,1:2],col=c(2:4)[unclass(iris[,5])],pch=c(1:3)[unclass(iris[,5])])


kohonenライブラリ

predictを使うならこっち?

> library(kohonen)
> set.seed(10)
> gr <- somgrid(topo='hexagonal',xdim=10,ydim=7)
> iris.som <- som(as.matrix(iris[,1:4]),gr,rlen=200)
> lab.cod <- as.numeric(iris[,5])
> plot(iris.som,type='mapping',labels=lab.cod,col=lab.cod)
> prediction <- predict(iris.som,as.matrix(iris[,1:4]),trainY=iris[,5])
> result <- table(prediction$prediction,iris[,5])
> result
            
             setosa versicolor virginica
  setosa         50          0         0
  versicolor      0         49         1
  virginica       0          1        49
> sum(diag(result))/sum(result)
[1] 0.9866667