More Related Content
More from Satoru Yamamoto (18)
判別分析
- 2. Copyright© 2002-2013 Data Artist, Inc. All Rights Reserved. Page2Page2Page2Page2
アジェンダ
①判別分析の概要
②線形判別・樹木モデル・
SVM・ランダムフォレストを動かしてみよう!
③様々なデータでの比較
各手法の概念の理解と、
どのような特徴があるかを体感しよう!!
- 4. Copyright© 2002-2013 Data Artist, Inc. All Rights Reserved. Page4Page4Page4Page4
データマイニング
解析(微積)・線形代数・統計・プログラミング
土台
正解が
無い
ある
正解が
数値
クラス
regression
回帰分析
判別分析
クラスター
分析
classification
clustering
最大・最小を
調べる。
多変量を
あつかう。
不確かな
事象を扱う。
マーケティング
次元圧縮
メタヒューリスティクス
時系列データ
テキストデータ
ネットワークデータ
※”Rによるデータサイエンス 森北出版”で理論的解説が割愛されているところは、本講義でも割愛。
- 5. Copyright© 2002-2013 Data Artist, Inc. All Rights Reserved. Page5Page5Page5Page5
判別分析概要
※ちなみにt検定は100年以上も前に開発されました。
時代19951930 1960 2001
性能
線形分離 分類木 SVM ランダムフォレスト
分類機能 低 中 高 高
計算速度 高 中 低 中
可読性 中 高 低 中
知名度 高 高 高 低
線形判別
理解のため大切
1本の直線 2本以上の直線 曲線
樹木モデル
SVM
+
カーネル
トリック
ランダム
フォレスト
(集団学習)
良く使う
- 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
答え合わせ
データから学習するだけでなく
そのモデルが、未知のデータを
どれほど説明できるかを調べる。
- 8. Copyright© 2002-2013 Data Artist, Inc. All Rights Reserved. Page8Page8Page8Page8
フィッシャーの線形判別
クラス間の重心が最も離れるように
軸をとり、垂線で区切る。
クラス内の分散が最小化される
ように軸をとる。
でクラス判別。0,0
22110
dd
nnd
ff
xaxaxaaf
fd
fd
fdはデータが二次元なら直線、三次元なら平面、4次元以上なら超平面。
変数の線形結合
うんちく:irisのデータは、フィッシャーが判別分析を行うために用意したデータだそうです。
- 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. 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. 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. Copyright© 2002-2013 Data Artist, Inc. All Rights Reserved. Page12Page12Page12Page12
SVM+カーネルトリックの理論概要
直線で分けれない
平面で分けれない
z=xy
考える。
平面で分けれる
平面で分けれる
カーネル法を使うと、空間の変換が低計算コストで行える。
次元数が増えても平気!!
“[連載]フリーソフトによるデータ解析・マイニング第31 回”より抜粋
D
サポートベクターとの距離=マージンを
最大化して、新規データへの分類性能が、
非常に高いマシンを造る。
カーネルトリックSVM(Support Vector Machine)
log(D)∝確率
- 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. 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. 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
- 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. 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. 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. 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したかどうかを正解不正解、どん
なページを見ているかを属性データとして拡張(学習)を
していきます。