Skip to content

Latest commit

 

History

History
258 lines (170 loc) · 6.58 KB

150803.md

File metadata and controls

258 lines (170 loc) · 6.58 KB
-------[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