0
データアーティスト株式会社
Rを用いたデータマイニング概論 第5回
判別分析
社内研修
Copyright© 2002-2013 Data Artist, Inc. All Rights Reserved. Page2Page2Page2Page2
アジェンダ
①判別分析の概要
②線形判別・樹木モデル・
SVM・ランダムフォレスト...
判別分析の概要
Copyright© 2002-2013 Data Artist, Inc. All Rights Reserved. Page4Page4Page4Page4
データマイニング
解析(微積)・線形代数・統計・プログラミング
土台
正解が
無い...
Copyright© 2002-2013 Data Artist, Inc. All Rights Reserved. Page5Page5Page5Page5
判別分析概要
※ちなみにt検定は100年以上も前に開発されました。
時代19951...
Copyright© 2002-2013 Data Artist, Inc. All Rights Reserved. Page6Page6Page6Page6
判別分析の流れ
データの取得・生成
埼玉・金融
東京・金融
神奈川・保険
大阪・保...
動かしてみよう!
#今回必要なパッケージ、事前に実行してください
required.packages=c("mvpart","kernlab","randomForest","scatterplot3d")
install.packages(r...
Copyright© 2002-2013 Data Artist, Inc. All Rights Reserved. Page8Page8Page8Page8
フィッシャーの線形判別
クラス間の重心が最も離れるように
軸をとり、垂線で区切る。...
Copyright© 2002-2013 Data Artist, Inc. All Rights Reserved. Page9Page9Page9Page9
線形判別を使ってみよう!!
#線形判別
library(MASS) #まずは分類
...
Copyright© 2002-2013 Data Artist, Inc. All Rights Reserved. Page10Page10Page10Page10
樹木モデル(CART)の理論概要
 

c
i
tipGI
1...
Copyright© 2002-2013 Data Artist, Inc. All Rights Reserved. Page11Page11Page11Page11
樹木モデルを使ってみよう!!
#分類木
library(mvpart)
i...
Copyright© 2002-2013 Data Artist, Inc. All Rights Reserved. Page12Page12Page12Page12
SVM+カーネルトリックの理論概要
直線で分けれない
平面で分けれない
z...
Copyright© 2002-2013 Data Artist, Inc. All Rights Reserved. Page13Page13Page13Page13
SVM+カーネル法を使ってみよう!!
-1.5
-1.0
-0.5
0.0...
Copyright© 2002-2013 Data Artist, Inc. All Rights Reserved. Page14Page14Page14Page14
ランダムフォレストの理論概要
変数1 変数2 変数3 変数4 変数5 クラ...
Copyright© 2002-2013 Data Artist, Inc. All Rights Reserved. Page15Page15Page15Page15
ランダムフォレストを使ってみよう!!
Sepal.Width
Sepal....
様々なデータでの比較
Copyright© 2002-2013 Data Artist, Inc. All Rights Reserved. Page17Page17Page17Page17
相互作用のあるデータ
x.v=rnorm(3000)
y.v=rnorm(...
Copyright© 2002-2013 Data Artist, Inc. All Rights Reserved. Page18Page18Page18Page18
高次元のデータ(spam)
data(spam) #kernlabに入って...
Copyright© 2002-2013 Data Artist, Inc. All Rights Reserved. Page19Page19Page19Page19
high.dim.mat=matrix(rnorm(30000),ncol...
Copyright© 2002-2013 Data Artist, Inc. All Rights Reserved. Page20Page20Page20Page20
correct.ratio.lda.v1 correct.ratio.rp...
Upcoming SlideShare
Loading in...5
×

判別分析

2,347

Published on

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,347
On Slideshare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
21
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Transcript of "判別分析"

  1. 1. データアーティスト株式会社 Rを用いたデータマイニング概論 第5回 判別分析 社内研修
  2. 2. Copyright© 2002-2013 Data Artist, Inc. All Rights Reserved. Page2Page2Page2Page2 アジェンダ ①判別分析の概要 ②線形判別・樹木モデル・ SVM・ランダムフォレストを動かしてみよう! ③様々なデータでの比較 各手法の概念の理解と、 どのような特徴があるかを体感しよう!!
  3. 3. 判別分析の概要
  4. 4. Copyright© 2002-2013 Data Artist, Inc. All Rights Reserved. Page4Page4Page4Page4 データマイニング 解析(微積)・線形代数・統計・プログラミング 土台 正解が 無い ある 正解が 数値 クラス regression 回帰分析 判別分析 クラスター 分析 classification clustering 最大・最小を 調べる。 多変量を あつかう。 不確かな 事象を扱う。 マーケティング 次元圧縮 メタヒューリスティクス 時系列データ テキストデータ ネットワークデータ ※”Rによるデータサイエンス 森北出版”で理論的解説が割愛されているところは、本講義でも割愛。
  5. 5. Copyright© 2002-2013 Data Artist, Inc. All Rights Reserved. Page5Page5Page5Page5 判別分析概要 ※ちなみにt検定は100年以上も前に開発されました。 時代19951930 1960 2001 性能 線形分離 分類木 SVM ランダムフォレスト 分類機能 低 中 高 高 計算速度 高 中 低 中 可読性 中 高 低 中 知名度 高 高 高 低 線形判別 理解のため大切 1本の直線 2本以上の直線 曲線 樹木モデル SVM + カーネル トリック ランダム フォレスト (集団学習) 良く使う
  6. 6. Copyright© 2002-2013 Data Artist, Inc. All Rights Reserved. Page6Page6Page6Page6 判別分析の流れ データの取得・生成 埼玉・金融 東京・金融 神奈川・保険 大阪・保険 購入したクリエイティブA,B,C 訓練学習 テスト Feature Generation →ユーザーの特徴を造る。県、 会社、デモグラフィック、etc。 Feature Selection →造った特徴の中から重要なもの を選択する。 Dimensional Compression →属性を掛け合わせて新しい重要な 属性を作る。人口/面積=人口密度 データの一部で訓練を行う。 どんな学習方法が良いか?? データの種類、目的に応じて。 LC TM RFSVM 残りのデータでテストを行う。 RF 答え合わせ データから学習するだけでなく そのモデルが、未知のデータを どれほど説明できるかを調べる。
  7. 7. 動かしてみよう! #今回必要なパッケージ、事前に実行してください required.packages=c("mvpart","kernlab","randomForest","scatterplot3d") install.packages(required.packages) #irisデータを学習用とテスト用に分けましょう sample.v=sort(sample(150,75)) train.iris=iris[sample.v,] test.iris=iris[-sample.v,]
  8. 8. Copyright© 2002-2013 Data Artist, Inc. All Rights Reserved. Page8Page8Page8Page8 フィッシャーの線形判別 クラス間の重心が最も離れるように 軸をとり、垂線で区切る。 クラス内の分散が最小化される ように軸をとる。 でクラス判別。0,0 22110   dd nnd ff xaxaxaaf fd fd fdはデータが二次元なら直線、三次元なら平面、4次元以上なら超平面。 変数の線形結合 うんちく:irisのデータは、フィッシャーが判別分析を行うために用意したデータだそうです。
  9. 9. Copyright© 2002-2013 Data Artist, Inc. All Rights Reserved. Page9Page9Page9Page9 線形判別を使ってみよう!! #線形判別 library(MASS) #まずは分類 iris.lda=lda(Species~.,data=train.iris) result.tab=table(test.iris[,"Species"], predict(iris.lda,test.iris[,-5])$class) sum(diag(result.tab))/sum(result.tab) library(scatterplot3d) #描画(不便) col.pallet=c("#f79646", "#9bbb59", "#4bacc6") col.v=col.pallet[test.iris[,5]] s3d=scatterplot3d(test.iris[,1:3],color=col.v,type="h", cex.symbols=1,angle=55, scale.y=0.7, pch=16, main="scatterplot3d") coef.mat=iris.lda[[4]][1:2,] coef.mat=rbind(coef.mat, -apply(iris.lda$means%*%iris.lda$scaling,2,mean)) coef.mat[,1]=coef.mat[,1]/iris.lda[[4]][3,1] coef.mat[,2]=coef.mat[,2]/iris.lda[[4]][3,2] coef.mat=-coef.mat s3d$plane3d(Intercept=coef.mat[3,1], x.coef =coef.mat[1,1], y.coef =coef.mat[2,1],lty = "dashed", lty.box = NULL,col="#93cddd") s3d$plane3d(Intercept=coef.mat[3,2], x.coef =coef.mat[1,2], y.coef=coef.mat[2,2],lty = "dashed", lty.box = NULL,col="#c3bb59") ●Linear Discriminant Analysis 3次元プロット 境界面 予測
  10. 10. Copyright© 2002-2013 Data Artist, Inc. All Rights Reserved. Page10Page10Page10Page10 樹木モデル(CART)の理論概要    c i tipGI 1 2 )|(1 No. 風 気温 海水浴 1 弱 高 行く 2 弱 低 行かない 3 弱 高 行く 4 弱 中 行く 5 弱 低 行かない 6 弱 高 行かない 7 強 高 行かない 8 強 低 行かない 9 強 中 行かない 10 強 高 行く 08.0)( 10 4 )( 10 6 )()( 375.0 4 3 4 1 1)( 5.0 6 3 6 3 1)( 22 22                                              強風弱風分岐前風で分類 強風 弱風 GIGIGIGI GI GI 起きる確率に偏りがある場合に、 値が小さくなる! 気温で分けた方がうまくいく!! “風の弱or強”で分けるのと”気温の低or高中”で分けるのでどちらが良いか? 48.0 10 6 10 4 1)( 22                      分岐前GI 137.0)( 10 4 )( 10 6 )()( 490.0 4 3 4 1 1)( 0 2 0 3 3 1)( 22 22                                              強風弱風分岐前気温で分類 高低気温 低気温 GIGIGIGI GI GI tmp=c wnd=a tmp=ab wnd=b 行かない 6/4 行かない 3/0 行く 3/4 行かない 2/1 行く 1/3 ジニ係数
  11. 11. Copyright© 2002-2013 Data Artist, Inc. All Rights Reserved. Page11Page11Page11Page11 樹木モデルを使ってみよう!! #分類木 library(mvpart) iris.rp=rpart(Species~.,data=train.iris) predict(iris.rp,test.iris[,-5]) result.tab=table(test.iris[,"Species"], predict(iris.rp,test.iris[,-5],type="class")) sum(diag(result.tab))/sum(result.tab) クラスの予測 確率の予測 Petal.Length< 2.35 Petal.Length< 4.95 Petal.Length>=2.35 Petal.Length>=4.95 versicolor 23/27/25 setosa 23/0/0 versicolor 0/27/25 versicolor 0/26/1 virginica 0/1/24 plot(iris.rp,uniform=T,branch=0.6,margin=0.05) text(iris.rp,use.n=T,all=T) ●Tree Model
  12. 12. Copyright© 2002-2013 Data Artist, Inc. All Rights Reserved. Page12Page12Page12Page12 SVM+カーネルトリックの理論概要 直線で分けれない 平面で分けれない z=xy 考える。 平面で分けれる 平面で分けれる カーネル法を使うと、空間の変換が低計算コストで行える。 次元数が増えても平気!! “[連載]フリーソフトによるデータ解析・マイニング第31 回”より抜粋 D サポートベクターとの距離=マージンを 最大化して、新規データへの分類性能が、 非常に高いマシンを造る。 カーネルトリックSVM(Support Vector Machine) log(D)∝確率
  13. 13. Copyright© 2002-2013 Data Artist, Inc. All Rights Reserved. Page13Page13Page13Page13 SVM+カーネル法を使ってみよう!! -1.5 -1.0 -0.5 0.0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5 6.0 6.5 7.0 SVM classification plot Sepal.Width Sepal.Length #SVM library(kernlab) iris.svm=ksvm(Species~.,data=train.iris) result.tab=table(test.iris[,"Species"], predict(iris.svm,test.iris[,-5])) sum(diag(result.tab))/sum(result.tab) iris.sepal=iris[1:100,-c(3,4)] iris.sepal.svm=ksvm(Species~.,data=iris.sepal) plot(iris.sepal.svm,data=iris.sepal[,-3]) iris.p.svm=ksvm(Species~.,data=train.iris,prob.mod el=T) predict(iris.p.svm,test.iris[,-5], type="probabilities") ●Support Vector Machine
  14. 14. Copyright© 2002-2013 Data Artist, Inc. All Rights Reserved. Page14Page14Page14Page14 ランダムフォレストの理論概要 変数1 変数2 変数3 変数4 変数5 クラス 個体1 1 5 5 9 5 A 個体2 2 1 8 8 6 B 個体3 5 2 5 5 2 A 個体4 1 1 4 6 1 B 個体5 3 1 2 7 4 B 個体6 8 8 7 4 7 A 個体7 4 4 9 1 5 A 個体8 7 3 6 6 6 B 個体9 8 9 5 2 9 A 個体10 5 4 8 3 8 B 個体11 2 2 7 6 7 B 個体12 2 6 4 4 4 A 個体13 3 7 2 8 5 B 個体14 6 6 3 5 6 A 変数を選択 変数を選択 データを 選択 データを 選択 …… B 個体X 変数(1,3,4,2,1) A A 個体X クラス:A!! 木がいっぱいで森になる!!→意見が偏らず未知データへの対応力が高くなる! 多数決
  15. 15. Copyright© 2002-2013 Data Artist, Inc. All Rights Reserved. Page15Page15Page15Page15 ランダムフォレストを使ってみよう!! Sepal.Width Sepal.Length Petal.Width Petal.Length 0 5 10 15 20 iris.rf MeanDecreaseGini library(randomForest) iris.rf=randomForest(Species~.,data=train.iris) varImpPlot(iris.rf) getTree(iris.rf,k=5) result.tab=table(test.iris[,"Species"], predict(iris.rf,test.iris[,-5])) sum(diag(result.tab))/sum(result.tab) 重要情報の抽出 ●Random Forrest
  16. 16. 様々なデータでの比較
  17. 17. Copyright© 2002-2013 Data Artist, Inc. All Rights Reserved. Page17Page17Page17Page17 相互作用のあるデータ x.v=rnorm(3000) y.v=rnorm(3000) class.v=as.factor(as.numeric((x.v*y.v)>0)+1) non.lin.data=data.frame(x.v,y.v,class.v) plot(non.lin.data[,1:2],col=c("#4bacc6","#f79646")[non.lin.data[,3]],pch=20) correct.ratio.lda.v1=c();correct.ratio.rp.v1=c() correct.ratio.svm.v1=c();correct.ratio.rf.v1=c() for(i in 1:5){ sample.v=sample(3000,1500) train.data=non.lin.data[sample.v,] test.data=non.lin.data[-sample.v,] #LDA learn=lda(class.v~.,data=train.data) result.tab=table(test.data[,3], predict(learn,test.data[,-3])$class) correct.ratio.lda.v1[i]=sum(diag(result.tab))/sum(result.tab) #TREE learn=rpart(class.v~.,data=train.data) result.tab=table(test.data[,3],predict(learn,test.data[,-3],type="class")) correct.ratio.rp.v1[i]=sum(diag(result.tab))/sum(result.tab) #SVM learn=ksvm(class.v~.,data=train.data) result.tab=table(test.data[,3],predict(learn,test.data[,-3])) correct.ratio.svm.v1[i]=sum(diag(result.tab))/sum(result.tab) #RF learn=randomForest(class.v~.,data=train.data) result.tab=table(test.data[,3],predict(learn,test.data[,-3])) correct.ratio.rf.v1[i]=sum(diag(result.tab))/sum(result.tab) }
  18. 18. Copyright© 2002-2013 Data Artist, Inc. All Rights Reserved. Page18Page18Page18Page18 高次元のデータ(spam) data(spam) #kernlabに入ってる SPAM=spam colnames(SPAM)[ncol(SPAM)]="class.v" correct.ratio.lda.v2=c() correct.ratio.rp.v2=c() correct.ratio.svm.v2=c() correct.ratio.rf.v2=c() for(i in 1:5){ sample.v=sample(4601,2300) train.data=SPAM[sample.v,] test.data=SPAM[-sample.v,] #LDA learn=lda(class.v~.,data=train.data) result.tab=table(test.data[,ncol(train.data)], predict(learn,test.data[,-ncol(train.data)])$class) correct.ratio.lda.v2[i]=sum(diag(result.tab))/sum(result.tab) #TREE learn=rpart(class.v~.,data=train.data) result.tab=table(test.data[,ncol(train.data)],predict(learn,test.data[,-ncol(train.data)],type="class")) correct.ratio.rp.v2[i]=sum(diag(result.tab))/sum(result.tab) #SVM learn=ksvm(class.v~.,data=train.data) result.tab=table(test.data[,ncol(train.data)],predict(learn,test.data[,-ncol(train.data)])) correct.ratio.svm.v2[i]=sum(diag(result.tab))/sum(result.tab) #RF learn=randomForest(class.v~.,data=train.data) result.tab=table(test.data[,ncol(train.data)],predict(learn,test.data[,-ncol(train.data)])) correct.ratio.rf.v2[i]=sum(diag(result.tab))/sum(result.tab) } メールにどんな単語が含まれているかと、 スパムかスパムじゃないかのデータ。
  19. 19. Copyright© 2002-2013 Data Artist, Inc. All Rights Reserved. Page19Page19Page19Page19 high.dim.mat=matrix(rnorm(30000),ncol=10) class.v=as.factor(as.numeric(apply(high.dim.mat[,1:3],1,prod)>0)+1) high.dim.mat=data.frame(high.dim.mat,class.v) names(high.dim.mat)=c(letters[1:(ncol(high.dim.mat)-1)],"class.v") scatterplot3d(high.dim.mat[,1:3],color=c("#4bacc6","#f79646")[class.v],cex.symbols=0.5, angle=55, scale.y=0.7, pch=16, main="scatterplot3d") correct.ratio.lda.v3=c();correct.ratio.rp.v3=c() correct.ratio.svm.v3=c();correct.ratio.rf.v3=c() for(i in 1:5){ sample.v=sample(3000,1500) train.data=high.dim.mat[sample.v,] test.data=high.dim.mat[-sample.v,] learn=lda(class.v~.,data=train.data) #LDA result.tab=table(test.data[,ncol(high.dim.mat)], predict(learn,test.data[,-ncol(high.dim.mat)])$class) correct.ratio.lda.v3[i]=sum(diag(result.tab))/sum(result.tab) learn=rpart(class.v~.,data=train.data) #TREE result.tab=table(test.data[,ncol(high.dim.mat)], predict(learn,test.data[,-ncol(high.dim.mat)],type="class")) correct.ratio.rp.v3[i]=sum(diag(result.tab))/sum(result.tab) learn=ksvm(class.v~.,data=train.data) #SVM result.tab=table(test.data[,ncol(high.dim.mat)],predict(learn,test.data[,-ncol(high.dim.mat)])) correct.ratio.svm.v3[i]=sum(diag(result.tab))/sum(result.tab) learn=randomForest(class.v~.,data=train.data) #RF result.tab=table(test.data[,ncol(high.dim.mat)],predict(learn,test.data[,-ncol(high.dim.mat)])) correct.ratio.rf.v3[i]=sum(diag(result.tab))/sum(result.tab) } 高次元(10次元)の相互作用のあるデータ
  20. 20. Copyright© 2002-2013 Data Artist, Inc. All Rights Reserved. Page20Page20Page20Page20 correct.ratio.lda.v1 correct.ratio.rp.v1 correct.ratio.svm.v1 correct.ratio.rf.v1 0.40.60.81.0 Intr correct.ratio.lda.v2 correct.ratio.rp.v2 correct.ratio.svm.v2 correct.ratio.rf.v2 0.890.910.930.95 Spam correct.ratio.lda.v3 correct.ratio.rp.v3 correct.ratio.svm.v3 correct.ratio.rf.v3 0.500.600.700.80 High.D.intr 各データの比較 #3種のデータの比較 par(mfrow=c(3,1)) boxplot(data.frame(correct.ratio.lda.v1, correct.ratio.rp.v1,correct.ratio.svm.v1, correct.ratio.rf.v1),main="Intr") boxplot(data.frame(correct.ratio.lda.v2, correct.ratio.rp.v2,correct.ratio.svm.v2, correct.ratio.rf.v2),main="Spam") boxplot(data.frame(correct.ratio.lda.v3, correct.ratio.rp.v3,correct.ratio.svm.v3, correct.ratio.rf.v3),main="High.D.intr") #重要な属性のみを取り出す learn=randomForest(class.v~.,data=train.data) learn$importance 高次元なデータ にはRFが強い。 正答率 2次の相互作用 スパムデータ 10次の相互作用 線形判別 < 樹木モデル < SVM < ランダムフォレスト の順に高い正答率を示しています。 どのアルゴリズムを使うかは、ベンダーによりけりです が、DSPの○○拡張は基本これまで学んできた判別分析 の技術を使います。 CV拡張の場合は、CVしたかどうかを正解不正解、どん なページを見ているかを属性データとして拡張(学習)を していきます。
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×