==== 第3週 ==== === 実験の流れ === - まずはタイタニック号のデータを用いて、各種学習機械の使い方と学習結果の読み方を学ぶ。 - 次に前回と同じ保険のデータを3種類の学習機械を用いて分析し、保険の営業方針を立案する。 === 準備 === Sys.setenv("http_proxy"="http://130.153.8.66:8080/") install.packages(c("mvpart", "kernlab", "), dependencies=TRUE) これでエラーが出る場合には、[[https://appl.stat.inf.uec.ac.jp/doku.php?id=r:how_to:internet_proxy|プロキシの設定]]を試みると良い。 library(mvpart) library(MASS) library(kernlab) 以上の3つのライブラリを、この課題では使う可能性がある。 == 緊急パッチ == mvpartのインストールについて。 * まず{{:mselab:2012:stat:mvpart_1.6-0.zip|mvpart_1.6-0.zip}}をダウンロードして、どこかに保存する。(デスクトップ推奨) * Rのメニューで〔パッケージ〕→〔ローカルにあるzipファイルからのパッケージのインストール〕を選ぶ。 * 「Select files」という子ウィンドウが出てくるので、保存したmvpart_1.6-0.zipというファイルを指定して、〔開く(O)〕をクリックする。 で対応して欲しい。同様のことを、{{:mselab:2012:stat:kernlab_0.9-14.zip|kernlab_0.9-14.zip}}についても行う。 データ読み込みはできても、CRANにも接続できないなんて。 == データの読み込み == tic.learn <- read.table("http://kdd.ics.uci.edu/databases/tic/ticdata2000.txt") tic.eval <- read.table("http://kdd.ics.uci.edu/databases/tic/ticeval2000.txt") tic.test <- read.table("http://kdd.ics.uci.edu/databases/tic/tictgts2000.txt") tic.eval <- cbind(tic.eval, tic.test) colnames(tic.eval)[86] <- "V86" rm(tic.test) == 少し加工する == 以下の6行は、実行しない方がいい場合もある。 tic.learn$V1 <- as.factor(tic.learn$V1) tic.learn$V5 <- as.factor(tic.learn$V5) tic.learn$V86 <- as.factor(tic.learn$V86) tic.eval$V1 <- as.factor(tic.eval$V1) tic.eval$V5 <- as.factor(tic.eval$V5) tic.eval$V86 <- as.factor(tic.eval$V86) 回帰分析とロジスティック回帰分析は、上の6行を実行しないtic.learnとtic.evalを用いるのがよい。 決定木では上の6行を実行した後のtic.learnとtic.evalを用いるのがよい。 また決定木に関しては、実行した場合と実行しない場合とで結果を比較すると良いかもしれない。 ==== 練習課題 ==== === タイタニック号 === タイタニック号の乗客の生死のデータがある。Rで Titanic と実行すると、表示される。 これを個別のレコードに展開し、更に救出の優先順位を高く設定された女性もしくは子供と、低めに設定された成人男性という変数も加える。 data("Titanic", package = "datasets") titanic <- as.data.frame(Titanic) titanic <- titanic[rep(1:nrow(titanic), titanic$Freq), 1:4] names(titanic)[2] <- "Gender" titanic <- transform(titanic, Treatment = factor( Gender == "Female" | Age == "Child", levels = c(FALSE, TRUE), labels = c("Normal\n(Male&Adult)", "Preferential\n(Female|Child)") )) さらに、数値に変換したデータも用意する。これは、線形学習機械とロジスティック学習機械のために用いる。 titanic.2 <- data.frame(Gender=(titanic$Gender=="Female")*1, Age=(titanic$Age=="Child")*1, Survived=(titanic$Survived=="Yes")*1, Class=(titanic$Class=="Crew")*1+(titanic$Class=="3rd")*2+(titanic$Class=="2nd")*3+(titanic$Class=="1st")*4) |変数|数値化情報| |性別(Gender)|女性(Female)=1, 男性(Male)=0| |年齢(Age)|子供(Child)=1, 大人(Adult)=0| |客室等級(Class)|1等(1st)=4,2等(2nd)=3,3等(3rd)=2,乗組員(Crew)=1| |生存(Survived)|生存(Yes)=1,死亡(No)=0| === 先週の課題と同等の課題 === 先週の課題は、タイタニック号で、生存率が高くなる条件を求めよ、という問題と同等。 まず titanic というデータに含まれる変数の一覧を names(titanic) で取り出す。すると [1] "Class" "Gender" "Age" "Survived" "Treatment" のように5個の変数があることが分かる。 これを用いて、生存(Survived)についての集計を、客室等級(Class)、性別(Gender)、年齢層(Age)の組み合わせで行うには、次の1行を実行する。 「$」の前がデータ名、「$」の後ろに変数名(フィールド名)を付ける。 ftable(titanic$Gender,titanic$Age,titanic$Class, titanic$Survived) すると No Yes Male Child 1st 0 5 2nd 0 11 3rd 35 13 Crew 0 0 Adult 1st 118 57 2nd 154 14 3rd 387 75 Crew 670 192 Female Child 1st 0 1 2nd 0 13 3rd 17 14 Crew 0 0 Adult 1st 4 140 2nd 13 80 3rd 89 76 Crew 3 20 と出力されるのを、各自確認せよ。 同じことは、数値化したデータを用いても得られる。 ftable(titanic.2$Gender,titanic.2$Age,titanic.2$Class, titanic.2$Survived) 上の出力と下の出力を見比べて、各変数の値の数値化を確認せよ。 0 1 0 0 1 670 192 2 387 75 3 154 14 4 118 57 1 1 0 0 2 35 13 3 0 11 4 0 5 1 0 1 3 20 2 89 76 3 13 80 4 4 140 1 1 0 0 2 17 14 3 0 13 4 0 1 === 線形学習機械 === 上のデータ(titanic.2)に対して lm(Survived~., data=titanic.2) を実行すると、全変数を用いた線形学習機械が最小二乗法により、学習される。学習結果のみなら、この一行で Call: lm(formula = Survived ~ ., data = titanic.2) Coefficients: (Intercept) Gender Age Class 0.11725 0.46493 0.09655 0.05029 と出力される。 この結果に、統計的推測の結果を付与するなら summary(lm(Survived~., data=titanic.2)) を実行すればよい。summary()の出力は次のように得られる。 Call: lm(formula = Survived ~ ., data = titanic.2) Residuals (残差の分布): Min 1Q Median 3Q Max -0.7833 -0.2178 -0.1675 0.2207 0.8325 Coefficients (回帰係数): Estimate Std. Error t value Pr(>|t|) 推定値 標準誤差 t値 P値 (Intercept) 0.117252 0.019113 6.135 1.01e-09 *** 切片 Gender 0.464930 0.023325 19.933 < 2e-16 *** Age 0.096553 0.040856 2.363 0.0182 * Class 0.050289 0.008989 5.594 2.49e-08 *** --- Signif. codes (有意水準の表示法): 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Residual standard error (残差の標準偏差): 0.4131 on 2197 degrees of freedom Multiple R-squared (決定係数): 0.2209, Adjusted R-squared (自由度調整済み決定係数): 0.2198 F-statistic (F統計量、分散分析の結果): 207.7 on 3 and 2197 DF, p-value: < 2.2e-16 == 線形学習機械のチューニング == AICを用いた説明変数の選択を行うのであれば、 library(MASS) とMASSパッケージを読み込んでから使える関数stepAIC()を用いて、 stepAIC(lm(Survived~., data=titanic.2)) を実行する。 Start: AIC=-3887.24 Survived ~ Gender + Age + Class Df Sum of Sq RSS AIC 374.99 -3887.2 - Age 1 0.953 375.95 -3883.7 - Class 1 5.342 380.33 -3858.1 - Gender 1 67.815 442.81 -3523.4 Call: lm(formula = Survived ~ Gender + Age + Class, data = titanic.2) Coefficients: (Intercept) Gender Age Class 0.11725 0.46493 0.09655 0.05029 これはAICを変数増減法で最適化する関数であり、最終的に採用するモデルを出力してくれる便利な関数である。 == 関係するグラフ == titanic.lm <- lm(Survived~., data=titanic.2) par(mfrow=c(2,2)) plot(titanic.lm) par(mfrow=c(1,1)) == 学習結果の解釈 == 上の回帰分析から Survived = 0.11725 + 0.46493 * Gender + 0.09655 * Age + 0.05029 * Class という学習結果が得られた。Survivedを大きくする(=生存する)ために、Genderが0よりは1の方が良いことは、回帰係数 0.46493 を見れば分かる。 同様に Age も0よりは1の方が良く、Classも1よりは4の方が良い。 そしてどの変数も有意であることから、生存するためには、 * 男性よりは女性 * 大人よりは子供 * 客室等級は高めの部屋を選ぶ のが好条件となることが分かる。 === ロジスティック線形学習機械 === 生存確率をpとして log(p/1-p) を与える学習機械が、ロジスティック回帰モデルである。Rではglm()という関数を用いて glm(Survived~., data=titanic.2, family="binomial") で、ロジスティック回帰モデルを最尤推定で学習させることができる。 結果は Call: glm(formula = Survived ~ ., family = "binomial", data = titanic.2) Coefficients: (Intercept) Gender Age Class -1.8622 2.0580 0.5115 0.2783 Degrees of Freedom: 2200 Total (i.e. Null); 2197 Residual Null Deviance: 2769 Residual Deviance: 2299 AIC: 2307 と、lm()と似た出力を得る。 これもsummary()を加えて summary(glm(Survived~., data=titanic.2, family="binomial")) を実行すると、 Call: glm(formula = Survived ~ ., family = "binomial", data = titanic.2) Deviance Residuals: Min 1Q Median 3Q Max -1.7597 -0.6926 -0.6109 0.7055 1.8818 Coefficients: Estimate Std. Error z value Pr(>|z|) (Intercept) -1.86224 0.11615 -16.033 < 2e-16 *** Gender 2.05802 0.12604 16.328 < 2e-16 *** Age 0.51147 0.22292 2.294 0.0218 * Class 0.27834 0.05047 5.515 3.48e-08 *** --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 (Dispersion parameter for binomial family taken to be 1) Null deviance: 2769.5 on 2200 degrees of freedom Residual deviance: 2299.2 on 2197 degrees of freedom AIC: 2307.2 Number of Fisher Scoring iterations: 4 と、種々の検定統計量が一緒に出力される。 == ロジスティック学習機械のチューニング == AICを用いた説明変数の選択を行うのであれば、 library(MASS) とMASSパッケージを読み込んでから使える関数stepAIC()を用いて、 stepAIC(glm(Survived~., data=titanic.2, family="binomial")) を実行する。 Start: AIC=2307.21 Survived ~ Gender + Age + Class Df Deviance AIC 2299.2 2307.2 - Age 1 2304.4 2310.4 - Class 1 2329.1 2335.1 - Gender 1 2595.5 2601.5 Call: glm(formula = Survived ~ Gender + Age + Class, family = "binomial", data = titanic.2) Coefficients: (Intercept) Gender Age Class -1.8622 2.0580 0.5115 0.2783 Degrees of Freedom: 2200 Total (i.e. Null); 2197 Residual Null Deviance: 2769 Residual Deviance: 2299 AIC: 2307 これはAICを変数増減法で最適化する関数であり、最終的に採用するモデルを出力してくれる便利な関数である。 == 関係するグラフ == titanic.glm <- glm(Survived~., data=titanic.2, family="binomial") par(mfrow=c(2,2)) plot(titanic.glm) par(mfrow=c(1,1)) == 学習結果の解釈 == 上の回帰分析から log(Pr[Survived]/(1-Pr[Survived])) = -1.86224 + 2.050802 * Gender + 0.51147 * Age + 0.27834 * Class という学習結果が得られた。Pr[Survived](生存する確率)を大きくするために、Genderが0よりは1の方が良いことは、回帰係数 2.050802 を見れば分かる。 同様に Age も0よりは1の方が良く、Classも1よりは4の方が良い。 そしてどの変数も有意であることから、生存するためには、 * 男性よりは女性 * 大人よりは子供 * 客室等級は高めの部屋を選ぶ のが好条件となることが分かる。 === 決定木 === 決定木は生存確率pの高低を際立たせるような、データの分割を表現するモデルである。Rではrpartパッケージの中のrpart()、もしくはmvpartパッケージの中のmvpart()という関数を用いて library(mvpart) rpart(Survived~.,data=titanic) で、決定木を学習させることができる。 結果は n= 2201 node), split, n, loss, yval, (yprob) * denotes terminal node 1) root 2201 711 No (0.6769650 0.3230350) 2) Gender=Male 1731 367 No (0.7879838 0.2120162) 4) Age=Adult 1667 338 No (0.7972406 0.2027594) * 5) Age=Child 64 29 No (0.5468750 0.4531250) 10) Class=3rd 48 13 No (0.7291667 0.2708333) * 11) Class=1st,2nd 16 0 Yes (0.0000000 1.0000000) * 3) Gender=Female 470 126 Yes (0.2680851 0.7319149) 6) Class=3rd 196 90 No (0.5408163 0.4591837) * 7) Class=1st,2nd,Crew 274 20 Yes (0.0729927 0.9270073) * と、これまでとは違ったものになる。各行はノードと呼ばれる分割単位を表し、 たとえば 1) root 2201 711 No (0.6769650 0.3230350) は、 * データ全体(root)はレコード数が2201 * このノードの代表値(一番多い値)はNo * 2201のうち711はNoでない * YesとNoの比は0.6769650:0.3230350 を意味する。これを性別で分割すると 2) Gender=Male 1731 367 No (0.7879838 0.2120162) 3) Gender=Female 470 126 Yes (0.2680851 0.7319149) を得た、とある。これは * データ全体を性別で分割すると、生存確率がもっとも差が開く * 男性の代表値はNo(死亡)、0.7879838は死亡確率を意味するので、生存確率は0.2120162 * 女性の代表値はYes(生存)、0.7319149は生存確率 と読み取ることができる。 生存確率の高いノードを探すと 7) Class=1st,2nd,Crew 274 20 Yes (0.0729927 0.9270073) * が目に付く。これは、 - Gender=Female - Class=1st,2nd,Crew と条件がふたつついたノードであり、「女性かつ1等客室の乗客、2等客室の乗客、または乗組員」となる。 この属性を持つ人々は、生存確率が0.9270073と最も高い。 逆に最も生存確率が低いのは 10) Class=3rd 48 13 No (0.7291667 0.2708333) * であり、このノードまでを - Gender=Male - Age=Adult - Class=3rd と辿れることから、「男性で成人で3等客室の乗客」は生存確率が0.2708333と最も低かったことが分かる。 これもsummary()を加えて summary(rpart(Survived~.,data=titanic)) を実行すると、 Call: rpart(formula = Survived ~ ., data = titanic) n= 2201 CP nsplit rel error xerror xstd 1 0.30661041 0 1.0000000 1.0000000 0.03085662 2 0.02250352 1 0.6933896 0.7102672 0.02774463 3 0.01125176 2 0.6708861 0.6947961 0.02752965 4 0.01000000 4 0.6483826 0.6877637 0.02743006 Node number 1: 2201 observations, complexity param=0.3066104 predicted class=No expected loss=0.323035 class counts: 1490 711 probabilities: 0.677 0.323 left son=2 (1731 obs) right son=3 (470 obs) Primary splits: Gender splits as LR, improve=199.821600, (0 missing) Treatment splits as LR, improve=198.792000, (0 missing) Class splits as RRLL, improve= 69.684100, (0 missing) Age splits as RL, improve= 9.165241, (0 missing) Surrogate splits: Treatment splits as LR, agree=0.971, adj=0.864, (0 split) Node number 2: 1731 observations, complexity param=0.01125176 predicted class=No expected loss=0.2120162 class counts: 1364 367 probabilities: 0.788 0.212 left son=4 (1667 obs) right son=5 (64 obs) Primary splits: Age splits as RL, improve=7.726764, (0 missing) Treatment splits as LR, improve=7.726764, (0 missing) Class splits as RLLL, improve=7.046106, (0 missing) Surrogate splits: Treatment splits as LR, agree=1, adj=1, (0 split) Node number 3: 470 observations, complexity param=0.02250352 predicted class=Yes expected loss=0.2680851 class counts: 126 344 probabilities: 0.268 0.732 left son=6 (196 obs) right son=7 (274 obs) Primary splits: Class splits as RRLR, improve=50.015320, (0 missing) Age splits as LR, improve= 1.197586, (0 missing) Surrogate splits: Age splits as LR, agree=0.619, adj=0.087, (0 split) Node number 4: 1667 observations predicted class=No expected loss=0.2027594 class counts: 1329 338 probabilities: 0.797 0.203 Node number 5: 64 observations, complexity param=0.01125176 predicted class=No expected loss=0.453125 class counts: 35 29 probabilities: 0.547 0.453 left son=10 (48 obs) right son=11 (16 obs) Primary splits: Class splits as RRL-, improve=12.76042, (0 missing) Node number 6: 196 observations predicted class=No expected loss=0.4591837 class counts: 106 90 probabilities: 0.541 0.459 Node number 7: 274 observations predicted class=Yes expected loss=0.0729927 class counts: 20 254 probabilities: 0.073 0.927 Node number 10: 48 observations predicted class=No expected loss=0.2708333 class counts: 35 13 probabilities: 0.729 0.271 Node number 11: 16 observations predicted class=Yes expected loss=0 class counts: 0 16 probabilities: 0.000 1.000 と、分割の経緯が一緒に出力される。 == 決定木のチューニング == 上のsummary()の出力の中に「complexity param」という項目が見られる。 rpart()では、この値の下限を指定することで、生成する決定木の深さを選択できる。 次の3行による学習結果の違いを観察してみよ。 print(rpart(Survived~.,data=titanic, control=c(cp=0.5))) print(rpart(Survived~.,data=titanic, control=c(cp=0.05))) print(rpart(Survived~.,data=titanic, control=c(cp=0.005))) == 関係するグラフ == titanic.rpart <- rpart(Survived~., data=titanic) plot(titanic.rpart) text(titanic.rpart) == 学習結果の解釈 == 上の決定木の結果から、生存確率が高い条件は - 1等・2等客室の女性乗客、または女性の乗組員 - 1等・2等客室の子供乗客 であり、生存確率が特に低いのは - 3等客室の男性乗客 であったことが分かる。 === 練習課題についての課題 === * 3つの分析手法を適用せよ。(時間内課題) * 3つの分析手法の結果をまとめ、比較検討せよ。(レポート課題) * これら以外に、Rで2値判別を行う手法を探し、適用して、比較に加えてみよ。(課外課題) ==== 本課題 ==== === TIC2000 (第2週と同じデータ) === [[http://kdd.ics.uci.edu/databases/tic/tic.data.html|tic.data.txt]]からの要約。 * CoIL 2000 Challengeで用いられた保険会社の顧客に関するデータ。86個の変数は、契約状況(V44-V85)と社会人口統計学的な変数(V1-V43)を含んでいる。この調査は "Can you predict who would be interested in buying a caravan insurance policy and give an explanation why?" という問いに答えるように集められた。 * このデータはオランダのデータマイニング会社Sentinent Machine Researchから提供され、現実のビジネスの問題に基づいている。学習用データ(ticdata2000.txt)は5000レコードでcaravan insurance policyの契約の有無(V86)を含んでおり、検証用データ(ticeval2000.txt)は4000レコードで契約の有無(V86)は含んでいない。検証用データの正解は、CoIL 2000 Challengeの開催時には公開されていなかったが、現在はテストデータ(tictest2000.txt)として公開されている。 * V1-V43のうち、コード化が指定されていない変数はすべて、郵便番号の一桁目のエリアを指している。たとえばV30が9ならばその顧客は郵便番号が9で始まるエリアに家を借りていることを、V31が5ならば郵便番号が5のエリアに持ち家があることを意味する。職業、社会層などもすべて、該当するエリアの箇所が郵便番号の一桁目で埋まっている。 == 概要 == * 先週は学籍番号に応じて、営業をかける保険商品を選んだが、今回はV86を扱う問題とせよ。その際に生じる幾つかの困難を乗り越えよ。 * CoIL 2000では、訪問する800人を選べ、という課題になっていたが、この課題では訪問する人数も各自で決めて良い。 === 考えたルールに基づく対象限定 === 各変数に閾値を設けてルールを生成したとする。 たとえば、「V47が5.5以上かつV44が1未満」または「V47が5.5以上かつV1が{1,3,6,8,12,20}のどれか」、というルールは 次のように記す。 (tic.eval$V47>5.5 & tic.eval$V44<1) | (tic.eval$V47>5.5 & (tic.eval$V1==1 |tic.eval$V1==3 | tic.eval$V1==6 | tic.eval$V1==8 | tic.eval$V1==12 | tic.eval$V1==20) ) 「&」が「かつ(AND)」、「|」が「または(OR)」である。 このルールを検証用データに適用するには、 tic.eval.visit <- (tic.eval$V47>5.5 & tic.eval$V44<1) | (tic.eval$V47>5.5 & (tic.eval$V1==1 |tic.eval$V1==3 | tic.eval$V1==6 | tic.eval$V1==8 | tic.eval$V1==12 | tic.eval$V1==20) ) と、訪問するか否かを二値(TRUE, FALSE)で表すオブジェクトを生成する。 このモデルに予測に基づいた訪問の成果を検証するには、訪問対象のリストtic.visitと検証用データの正解V86のクロス集計を行えばよい。 table(tic.eval.visit) FALSE TRUE 3029 971 table(tic.eval.visit, tic.eval$V86) tic.eval.visit 0 1 FALSE 2878 151 TRUE 884 87 ここでは、訪問対象に884+87=971人を選定し、そのうちの87人が実際に契約してくれる人だったことになる。 契約率は87/971=8.96%。また誤判別率は (884+151)/4000 で25.9%となる。 === モデルに基づく対象限定 === 学習したモデルに基づいて、訪問対象を狭めるには、predict()という関数を用いて、訪問対象か否かというリストを作成する。 まず、設定まで調整したモデルを、学習用データ(tic.learn)から得る。 tic.rpart <- rpart(V86~., data=tic.learn, control=c(cp=0.005)) 次に、このモデル(ここではtic.rpart)を検証用データ(tic.eval)に適用して、契約してくれるか否かの予測を行う。 この際、0.05という閾値も調整の必要がある。 tic.eval.visit <- predict(tic.rpart, newdata=tic.eval)[,2]>0.05 このモデルに予測に基づいた訪問の成果を検証するには、訪問対象のリストtic.visitと検証用データの正解V86のクロス集計を行えばよい。 table(tic.eval.visit) tic.eval.visit FALSE TRUE 2389 1611 table(tic.eval.visit, tic.eval$V86) tic.eval.visit 0 1 FALSE 2310 79 TRUE 1452 159 ここでは、訪問対象に1452+159=1611人を選定し、そのうちの159人が実際に契約してくれる人だったことになる。契約率は159/1452=11.0%。 また誤判別率は (79+1452)/4000 で38.275%となる。 === 想定される困難 === 次の1行を実行すると、かなり時間がかかってエラーになる。 tic.glm.step <- step(glm(V86~., family="binomial", data=tic.learn) 次の4行、いずれもエラーになる。変数間の関係が悪すぎるよう。変数の意味を考えて、追加しないといけないかも。 tic.glm <- glm(V86~V1+V2+V3+V4+V5+V6+V7+V8+ V10+ V11+V12+ V14+ V16+V17+ V19+V20+ V21+V22+V23+ V25+V26+V27+V28+ V30+ V33+V34+V35+ V37+V38+V39+V40+ V42+V43+V44+V45+V46+V47+V48+V49+V50+ V51+V52+V53+V54+V55+V56+V57+V58+V59+V60+ V61+V62+V63+V64+V65+V66+V67+V68+V69+V70+ V71+V72+V73+V74+V75+V76+V77+V78+V79+V80+ V81+V82+V83+V84+V85, family="binomial", data=tic.learn) table(predict(tic.glm, newdata=tic.eval)>0.5) tic.glm <- glm(V86~ V2+V3+V4+ V6+V7+V8+ V10+ V11+V12+ V14+ V16+V17+ V19+V20+ V21+V22+V23+ V25+V26+V27+V28+ V30+ V33+V34+V35+ V37+V38+V39+V40+ V42+V43+V44+V45+V46+V47+V48+V49+V50+ V51+V52+V53+V54+V55+V56+V57+V58+V59+V60+ V61+V62+V63+V64+V65+V66+V67+V68+V69+V70+ V71+V72+V73+V74+V75+V76+V77+V78+V79+V80+ V81+V82+V83+V84+V85, family="binomial", data=tic.learn) tic.glm <- glm(V86~V44+V45+V46+V47+V48+V49+V50+ V51+V52+V53+V54+V55+V56+V57+V58+V59+V60+ V61+V62+V63+V64+V65+V66+V67+V68+V69+V70+ V71+V72+V73+V74+V75+V76+V77+V78+V79+V80+ V81+V82+V83+V84+V85, family="binomial", data=tic.learn) tic.glm <- glm(V86~V44+V45+V46+V47+V48+V49+V50+ V51+V52+V53+V54+V55+V56+V57+V58+V59+V60+ V61+V62+V63+V64, family="binomial", data=tic.learn) 次の1行を実行すると、不契約ばかり。 tic.rpart <- rpart(V86~., data=tic.learn) === おまけ === AdaBoostを適用するには、adaパッケージをインストールする。 install.packages(c("ada"), dependencies=TRUE) 決定木を弱学習機械として用いるには例えば、 tic.ada <- ada(V86~., data=tic.learn, iter=100, control=rpart.control(maxdepth=1, cp=-1, minsplit=0)) とする。rpart.controlの中身は、 * maxdepth=1が1回だけ分岐せよ * cp=-1は不純度によらず必ず分岐せよ * minsplit=0は親ノードのレコード数が幾つでも必ず分岐せよ と、必ず1段の決定木を学習で得ること、と指定されている。 これでiterとmaxdepthを変えると、もしかして良い訪問案が学習できるかもしれない? ただしこの二つのパラメータを大きくすると、計算時間が増大するので要注意。 iterに比例し、2のmaxdepth乗にも比例して、増えていく。 === レポート作成上の注意 === * Rのコードの掲載は不要 * 指定したパラメータや学習に用いたモデルの記述は必要 * グラフも載せること