文書の過去の版を表示しています。


目次

第2週

今週の配付資料。グラフと表のみによるデータ解析と比較的単純な学習機械によるデータ解析に続いて、今回は次の2つの課題に取り組んでもらう。

  1. より柔軟な学習機械と単純な学習機械との比較
  2. キャンペーンの提案書の作成
学習機械の予測精度の評価

学習機械は予測精度が高くて初めて、有用性が認められる。そのためには「学習に用いなかったデータ」に関して予測を行い、精度を評価する必要がある。

例えば線形判別分析(lda)に学習用データ(tic.learn)を学習させるとする。

lda(V86~.,data=tic.learn)

その学習結果は次のようにオブジェクトに収めることができる。

tic.lda <- lda(V86~.,data=tic.learn)

これを用いて、評価用データ(lda.eval)に関するCARAVAN(V86)の予測を行うには、

predict(tic.lda,newdata=tic.eval)

を実行すれば良い。この結果もまたオブジェクトの中に収めることができる。

v86.lda <- predict(tic.lda,newdata=tic.eval)

v86.ldaは「リスト」と呼ばれるオブジェクトであり、

is.list(v86.lda)

を実行して、リストかどうかを尋ねるとTRUEが返ってくる。

リストの中身を見るにはnames関数を用いる。

names(v86.lda)

画面には次のように表示される。

> names(v86.lda)
[1] "class"     "posterior" "x"      

これはv86.ldaの中には次の3つが入っていることを意味する。

オブジェクト名中身
classクラス
posterior事後確率
x判別関数の値

この内訳は、学習に使用したアルゴリズム毎に異なる。

ここからが少し、問題。学習機械に基づく予測結果は

v86.lda$class

に収められている。ただしこれは因子(factor)オブジェクトであり、加減乗除ができない。

v86.lda$class+1

はエラーになる。そこで、正答率を出すには

table(v86.lda$class, tic.eval$V86)

のようにクロス集計を実行して、予測結果(v86.lda$class)と実際(tic.eval$V86)を比較する。

他の学習機械についても同様に

tic.qda <- qda(V86~.,data=tic.learn)
v86.qda <- predict(tic.qda,newdata=tic.eval)
table(v86.qda$class, tic.eval$V86)

などと、予測性能の評価が可能になる。ただし二次判別分析(qda)はエラーを表示して実行できない。この時は、エラーの内容から

tic.qda <- qda(V86~V1,data=tic.learn)
tic.qda <- qda(V86~V1+V2,data=tic.learn)
tic.qda <- qda(V86~V1+V2+V3,data=tic.learn)
tic.qda <- qda(V86~V1+V2+V3+V4,data=tic.learn)
tic.qda <- qda(V86~V1+V2+V3+V4+V5,data=tic.learn)
tic.qda <- qda(V86~V1+V2+V3+V4+V5+V6,data=tic.learn)

などと、ひとつひとつ増やしていってみるか、例えば

tic.qda <- qda(V86~V1,data=tic.learn[,c(1:30,86)])

のように最初の30変数を使って86番目を予測する、とするなどの工夫が必要になる。

再帰的分割(rpart)を用いる場合は、次のようなデータの変換が必要になる。

tic.learn.2 <- tic.learn
tic.learn.2$V86 <- as.factor(tic.learn$V86)

V86を因子オブジェクト(factor)に変換すると、rpartが分類木を学習する。この変換をしないと、回帰木を学習してしまう。

tic.rpart <- rpart(V86~.,data=tic.learn.2)
v86.rpart <- predict(tic.rpart,nedata=tic.eval,type="class")
table(v86.rpart$class, tic.eval$V86)

謝判別率(誤った予測をした割合)などを算出してみよ。

柔軟な学習機械を使ってみる

ひとつ目の課題は、より柔軟な学習機械を適用してもらい、先週までの方法との違いを検討してもらう。こちらについては今回も、同志社大学の金(じん)先生が公開されてらっしゃる

を参考に、進めて欲しい。

サポートベクターマシン(ksvm)はkernlabパッケージに、バギング(bagging)はipredパッケージに、ブースト(ada)はadaパッケージに、ランダムフォレスト(randomForest)はrandomForestパッケージに、それぞれ含まれているので、まずは必要なパッケージをインストールする。

bank <- read.table("c:¥¥Users¥¥Student¥¥bank-full.csv", 
                   header=TRUE, 
                   sep=";")
Sys.setenv("http_proxy"="http://130.153.8.19:8080/")
install.packages("kernlab", dependencies=TRUE)
library(kernlab)
install.packages("ipred", dependencies=TRUE)
library(ipred)
install.packages("ada", dependencies=TRUE)
library(ada)
install.packages("randomForest", dependencies=TRUE)
library(randomForest)

サポートベクターマシンに学習させる実行例:

bank.svm <- ksvm(y~., data=bank, 
                 kernel="rbfdot",
                 kpar=list(sigma=0.01))
bank.svm.p<-predict(bank.svm) 
table(bank.svm.p, bank$y)

バギングに学習させる実行例:

bank.bag<-bagging(y~., data=bank,
                  nbagg=40) 
bank.bag.p <- predict(bank.bag,type= "class") 
table(bank.bag.p, bank$y)

Adaブーストに学習させる実行例:

bank.ada <- ada(y~., data=bank,
                iter=20) 
bank.ada.p <- predict(bank.ada,type= "vector") 
table(bank.ada.p, bank$y)

ランダムフォレストに学習させる実行例:

bank.rf <- randomForest(y~., data=bank) 
bank.rf.p <- predict(bank.rf) 
table(bank.rf.p, bank$y)

以上は「弱い学習機械」の指定と、個々の学習機械の設定パラメータが、デフォルトのままであることとは注意しておく。パラメータのチューニングが必要なはずである。

なお、この課題では「過学習」について言及していないが、過学習は大事な問題であるので、各自、少し調べて気にすることを進める。

提案書

2つ目の課題は、前回までのレポートの考察として、どのような顧客層に重点的にキャンペーンを展開するのがよいか、提案書を起草してもらう。「提案書」という書類の形式については、成書を参照するのがよいが、参考までに幾つかのウェブサイトへのリンクを掲げておく。

なおレポートには、訪問リストを生成するための手順を記述しておけばよく、訪問リストそのものの添付は不要である。また、最終的な提案に機械学習の結果を用いる場合は、以下の点に留意されたい。

  • 決定木や判別機械を学習させた結果を用いて訪問リストを作るとき、それらの学習に用いた設定や、学習結果は説明してほしい。
  • サポートベクターマシンを学習させた結果を用いて訪問リストを作るとき、その訪問リストの傾向は検討してほしい。アンサンブル学習を用いた場合も同様。
    • 例えば「サポートベクターマシンによって選ばれた顧客リスト1000名に営業をかけるのが効果的です」と宣言したら、「サポートベクターマシンって何かね」「柔軟な学習機械です」「どう柔軟なんだね」「非常に柔軟です」「・・・」というバッドエンドなコミュニケーションは可能な限り回避するのがいい。
    • 「サポートベクターマシンによって、例えば以下のような傾向を持つ顧客が対象に選ばれました。それぞれの傾向は、契約獲得の可能性を高めることが予想されています。」として選ばれた顧客と選ばれなかった顧客を、集団同士として比較するような分析を加えた方が、説得力は増す。