-------[p.286 Naive Bayes]----------------------------------------------------------------------
単純ベイズ分類器(Naive Bayes classifier)=ベイズの定理を用いて確率モデルを用いて分類
利点は、パラメータ訓練用のデータ数が少なくて済む点(wikipedia)。
変数間は独立と仮定され、共分散行列全体は不要。
参考:
http://aidiary.hatenablog.com/entry/20100613/1276389337
http://getpopfile.org/docs/jp:glossary:bayesian
http://www.ints.info.hiroshima-cu.ac.jp/~takahama/LS/bayes.pdf
<ベイズの定理>
P(B)=事象Bの発生確率(事前確率: Prior probability)
例:tumorカテゴリ出現確率
P(B|A)=事象Aが起きた後で事象Bが発生する確率(事後確率: Posterior probability)
例:事象Aがtumorカテゴリに分類される確率
P(A|B) P(B)
P(B|A) = ---------------------------- ∝ P(A|B) P(B)
P(A)
---------------データ準備-----------------------------------------------------------
> library(e1071)
> load('cancer.rda');
> ls()
[1] "mldata"
> train_row <- sample(1:83,60)
> train<-mldata[train_row,]
> test<-mldata[-train_row,]
> ls()
[1] "mldata" "test" "train" "train_row"
---------naiveBays実行------------------------------
> testClass <- test$tumor
> model <- naiveBayes(tumor~.,data=train)
> testRes_nb <- predict(model,test)
> summary(testRes_nb)
BL EW NB RM
4 9 4 6
--------[p.288 Bootstrapping in machine learning]--------------------------------------
Bootstrap標本化=経験分布を用いた近似分布に従って標本化を行う。
標本集団より重複を許したリサンプリングを多数繰り返し、
新規に得られた標本集団で母集団の性質を推定する。
https://oku.edu.mie-u.ac.jp/~okumura/stat/bootstrap.html
http://www.stat.wisc.edu/~larget/stat302/chap3.pdf
http://nakhirot.hatenablog.com/entry/20131216/1387203429
> data(iris)
> myData<-iris[c(1:150),]
> source( "myboot.R" )
> source( "corPred.R")
> res.bs<-myboot( d=myData,label="Species",iter=1000)
1万回実行だが、早く計算する為に1000回に変更
-------補足-----------------------------------
<<myboot.Rの中身>>
myboot <- function (d,label,iter){
bootres = c()
for(i in 1:iter){
indices=sample(1:nrow(d),floor((2*nrow(d))/3))
res=corPred(d,label,indices) SVM予測
bootres=c(bootres,res)
}
BOOT.RES <- bootres
BOOT.MEAN <- mean(bootres) 平均
BOOT.SD <- sd(bootres) 標準偏差
return(list(BOOT.RES, BOOT.MEAN, BOOT.SD))
}
<<参考情報>>
> nrow(myData)
[1] 150
つまり、indices=sample(1:nrow(d),floor((2*nrow(d))/3))は、
indices=sample(1:150,100) 訓練データとして100ランダム抽出、50をテストに。
<<corPred.Rの中身>>
corPred <- function(data,label,indices){
train<-myData[indices,]
test<-myData[-indices,]
testClass<-test[,label]
colnames(train)[ncol(train)]="Class"
mySVM = svm(Class~., data=train, cost=100, gamma=1)
myPred = predict(mySVM, test)
TP=sum(myPred == testClass)
return(TP)
}
-------------------------------------------------------------
> res.bs
[[1]] TP値(全正解で50)
:
[937] 48 45 48 46 49 47 47 46 47 47 48 47 43 49 46 45 44 47
[955] 46 47 44 47 47 48 47 45 47 45 49 43 47 48 46 46 48 46
[973] 48 47 49 47 46 45 47 43 49 47 46 46 48 47 48 47 46 49
[991] 46 47 47 47 46 48 49 46 48 48
[[2]] TP平均
[1] 46.73
[[3]] TP標準偏差
[1] 1.419548
-------[p.290 Cross-validation for classifiers]---------------------------------------------
Cross Validation(交差検証)法は、統計学で標本データを分割する。一部を
testとして残りは訓練材料になる。
> data(iris)
> myData<-iris[1:100,]
>myData$Species 確認
[96] versicolor versicolor versicolor versicolor versicolor
Levels: setosa versicolor virginica ラベル3つ
> myData$Species <-factor(as.character(myData$Species))
>myData$Species 確認
[96] versicolor versicolor versicolor versicolor versicolor
Levels: setosa versicolor ラベル2つに限定
> source('crossvalid.R')
------------補足---------------------------------------------
<<crossvalid.Rの中身>>
k=10
index<-sample(1:k,nrow(myData),replace=TRUE)
folds <- 1:k
myRes <- data.frame()
for (i in 1:k){
training= subset(myData,index %in% folds[-i])
test = subset(myData,index %in% c(i))
mymodel = svm(training$Species~., data=training) #モデル学習
actual = test[,ncol(test)]
temp=data.frame(predict(mymodel,test[,-ncol(test)])) #予測
colnames(temp) = "Predicted"
results = data.frame(Predicted=temp, Actual=actual)
myRes= rbind(myRes,results) #データ追加
}
> k=10 訓練データ150行を10セットに分割、1セットtest,残り9セットtrainingに利用
> nrow(myData)
[1] 100
> index<-sample(1:10,100,replace=TRUE)
> index
[1] 7 3 6 7 5 8 10 5 5 10 5 2 9 9 6 5 2 10 4
[20] 2 1 4 4 3 10 8 3 3 8 2 5 6 1 8 5 8 1 5
[39] 7 9 7 5 10 4 9 4 4 5 1 4 9 8 8 10 6 3 2
[58] 4 6 7 1 7 4 4 4 2 10 10 4 10 4 9 2 3 7 3
[77] 1 4 4 9 1 8 8 7 6 7 2 5 9 5 4 7 2 3 4
[96] 4 6 4 10 9
> folds<-1:10
> folds
[1] 1 2 3 4 5 6 7 8 9 10
> tmpidx <- index %in% folds[-1]
> tmpidx
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
[10] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
[19] TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE TRUE
[28] TRUE TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE
[37] FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
[46] TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE
[55] TRUE TRUE TRUE TRUE TRUE TRUE FALSE TRUE TRUE
[64] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
[73] TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE FALSE
[82] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
[91] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
[100] TRUE
> training = subset(myData, tmpidx)
----------------補足終了-------------------------------------------------
> myRes
Predicted Actual
29 setosa setosa
37 setosa setosa
40 setosa setosa
41 setosa setosa
54 versicolor versicolor
64 versicolor versicolor
66 versicolor versicolor
70 versicolor versicolor
79 versicolor versicolor
81 versicolor versicolor
96 versicolor versicolor
100 versicolor versicolor
2 setosa setosa
:
> table(myRes)
Actual
Predicted setosa versicolor
setosa 50 0
versicolor 0 50