目次
課題2
今回のお題
- 予測精度はまだ気にせずに,3種類の学習機械(線形,加法,ロジスティック加法)を比較する
- レポートの送付先 mailto:data.mining.finale@gmail.com
- レポートファイルの名前の先頭に,半角で学籍番号を付けること.例:0000000_データマイニング_2.doc
- 期限は来週の1限
Rのための準備
今回はgamパッケージとMASSパッケージという二つのパッケージの中の関数を用いるので,それらをインストールしておく. 下記の一行で実行できる.
install.packages(c("gam", "MASS"), dependencies = TRUE)
これが実行できない場合には,プロキシの設定を試してみるといい. その1の方が簡単なので,そちらから試すことをお勧めする.
データファイルの読み込み
このファイルをダウンロードし,中の「ticdata2000-with-headers.csv」というファイルを保存すること.
- Windowsの場合には,保存先のフォルダは「ドキュメント」あるいは「マイドキュメント」がお勧め.
- MacとLinuxの場合には,保存先フォルダは「ホームディレクトリ」がお勧め.
まずR上で
dummy <- rnorm(10, mean=0, sd=1) dump("dummy")
の2行を実行してから,Windows,Mac,あるいはLinuxで「dumpdata.R」というファイルを探してみると良い.そのファイルが見つかった場所が,Rにとっての「ホームフォルダ」であり,そこに上のファイルを置けば,読み込みは完了する.
うまく保存されれば,次の1行がエラー表示なしに実行完了できる.
# データの読み込み tic <- read.table("ticdata2000-with-headers.csv", header=T, sep=",")
上の一行の実行時にエラーが表示されるのは,例えば
- ファイルの保存時に,ブラウザで一度表示させ,ファイルメニューの保存を実行して保存すると,拡張子が“.txt”となり,アイコンがメモ帳のそれになることがある.(Excelがインストールされていれば,正しく保存するとExcelのアイコンになるし,Excelがインストールされていなければ,アプリケーションに関連づけられていないファイルのアイコンになるはず)
- ファイルの置き場所か,ファイルの置き場所の指定が誤っている
などの状況が考えられる.フォルダを指定して読み込む場合,Windowsでも
tic <- read.table("c:/Users/DMB/ticdata2000-with-headers.csv", header=T, sep=",")
などと,フォルダ名の区切り文字を「¥」ではなく「/」を用いること.
事前加工
今回の課題には,このデータから13個のフィールドのみを用いる.以下の3行で,上のデータから部分データを切り出す. レコード数は全レコードを用いる.
# 13 個の変数のみ切り出す tic.sub <- matrix(c(tic$V86, tic$V04, tic$V44, tic$V47, tic$V57, tic$V58, tic$V59, tic$V76, tic$V78, tic$V79, tic$V80, tic$V81, tic$V82), ncol=13) colnames(tic.sub) <- c("V86", "V04", "V44", "V47", "V57", "V58", "V59", "V76", "V78", "V79", "V80", "V81", "V82") tic.sub <- data.frame(tic.sub)
フィールド数とレコード数の確認.
dim(tic.sub)
事前解析
# 契約成功例を見る table(tic.sub$V86) hist(tic$V86) # 成功割合を出す mean(tic$V86)
# その他の変数について, 各変数ごとの平均を算出する( 小数点3 桁まで) round(apply(tic.sub, 2, mean),3) # 散布図行列を描く pairs(tic.sub) # 相関係数行列も計算する( 小数点2 桁まで) round(cor(tic.sub),2)
重回帰分析による線形判別関数の学習
# 重回帰分析による線形判別関数の学習 tic.lm <- lm(V86~., data=tic.sub) # 学習結果のパラメータを見る summary(tic.lm) # 元の学習用のV86 と学習結果に基づく予測結果とを、比較するために散布図とヒストグラムを描く plot(tic.sub$V86, predict(tic.lm)) hist(predict(tic.lm)[tic.sub$V86==0]) hist(predict(tic.lm)[tic.sub$V86==1]) # 学習用データにおける誤判別数、誤判別率を検討するために、クロス集計も行う。 table(tic.sub$V86, 1*(predict(tic.lm)>0.5))
summary(tic.lm)の出力の読み方
Call: lm(formula = V86 ~ ., data = tic.sub) Residuals: Min 1Q Median 3Q Max -0.58156 -0.08172 -0.05578 -0.00842 0.99657 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -0.001566 0.012368 -0.127 0.899216 V04 0.002496 0.003737 0.668 0.504115 V44 0.013748 0.003783 3.634 0.000282 *** V47 0.010471 0.001069 9.797 < 2e-16 *** V57 0.216507 0.079359 2.728 0.006387 ** V58 0.062955 0.025554 2.464 0.013783 * V59 0.013284 0.003304 4.021 5.86e-05 *** V76 0.006850 0.008227 0.833 0.405118 V78 -0.447549 0.189817 -2.358 0.018417 * V79 -0.234240 0.124002 -1.889 0.058941 . V80 -0.026739 0.011248 -2.377 0.017473 * V81 0.174599 0.134497 1.298 0.194284 V82 0.287817 0.037417 7.692 1.69e-14 *** --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 Residual standard error: 0.2319 on 5809 degrees of freedom Multiple R-squared: 0.04554, Adjusted R-squared: 0.04357 F-statistic: 23.1 on 12 and 5809 DF, p-value: < 2.2e-16
Call | lm関数の呼び出され方 |
Residuals | 残差:最小値(Min),下側25%値(1Q),中央値(Median),上側25%点(3Q),最大値(Max) |
Coefficients | 学習機械のパラメータ |
Estimate | 推定値(学習結果) |
Std. Error | 標準誤差(このパラメータの推定精度) |
t value | t値(このパラメータが0という帰無仮説の検定統計量) |
Pr(>.t.) | P値(t値による検定の結果,0.05以下なら5%有意) |
Residual standard error | 残差の標準偏差 |
degrees of freedom | 自由度 |
Multiple R-squared | 決定係数(重相関係数) |
Adjusted R-squared | 自由度調整済み決定係数(重相関係数) |
F-statistic | F統計量(モデルのパラメータがすべて0かどうかの検定統計量) |
p-value | F検定のP値(この数値が0.05以下なら,モデルは5%有意) |
ロジスティック判別による線形判別関数の学習
# ロジスティック判別による線形判別関数の学習 tic.glm <- glm(V86~., data=tic.sub, family="binomial") # 学習結果のパラメータを見る summary(tic.glm) # 元の学習用のV86と学習結果に基づく予測結果とを、比較するために散布図とヒストグラムを描く plot(tic.sub$V86, predict(tic.glm)) hist(predict(tic.glm)[tic.sub$V86==0]) hist(predict(tic.glm)[tic.sub$V86==1]) # 学習用データにおける誤判別数、誤判別率を検討するために、クロス集計も行う。 table(tic.sub$V86, 1*(predict(tic.glm)>0))
Call: glm(formula = V86 ~ ., family = "binomial", data = tic.sub) Deviance Residuals: Min 1Q Median 3Q Max -1.2943 -0.3842 -0.2873 -0.1897 2.8694 Coefficients: Estimate Std. Error z value Pr(>|z|) (Intercept) -4.19384 0.25711 -16.311 < 2e-16 *** V04 0.04677 0.07068 0.662 0.508154 V44 0.25313 0.07146 3.542 0.000397 *** V47 0.22086 0.02391 9.236 < 2e-16 *** V57 1.48875 0.96677 1.540 0.123579 V58 0.80334 0.56350 1.426 0.153972 V59 0.21470 0.06186 3.471 0.000519 *** V76 0.04504 0.11491 0.392 0.695051 V78 -3.17157 2.55699 -1.240 0.214845 V79 -3.43632 3.29457 -1.043 0.296936 V80 -0.47634 0.24686 -1.930 0.053657 . V81 1.37207 1.36816 1.003 0.315928 V82 1.99639 0.36271 5.504 3.71e-08 *** --- Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 (Dispersion parameter for binomial family taken to be 1) Null deviance: 2635.5 on 5821 degrees of freedom Residual deviance: 2408.5 on 5809 degrees of freedom AIC: 2434.5 Number of Fisher Scoring iterations: 6
ほとんど結果の読み方は一緒.違うのは
Null deviance | Nullデビアンス |
Residual deviance | 残差のデビアンス |
AIC | 赤池情報量基準 |
の3つで,最初の二つは
anova(tic.glm) aov(tic.glm)
などのように,分散分析を行う際に用いる. AICは,この数値が一番小さくなるように,変数の組み合わせを選ぶのに用いる.
今回は今の変数セットのまま,進む.
フィッシャーの線形判別分析による線形判別関数の学習
# フィッシャーの線形判別分析による線形判別関数の学習 # MASSパッケージを読み込ませる library(MASS) tic.lda <- lda(V86~., data=tic.sub) # 学習結果のパラメータを見る tic.lda # 元の学習用のV86と学習結果に基づく予測結果とを、比較するために散布図とヒストグラムを描く plot(tic.sub$V86, predict(tic.lda)$x) plot(tic.lda) # 学習用データにおける誤判別数、誤判別率を検討するために、クロス集計も行う。 table(tic.sub$V86, 1*(predict(tic.lda)$x>0))
結果の読み方
Call: lda(V86 ~ ., data = tic.sub) Prior probabilities of groups: 0 1 0.94022673 0.05977327 Group means: V04 V44 V47 V57 V58 V59 V76 V78 0 2.990318 0.7478992 2.859335 0.01333577 0.02064304 1.782974 0.07307271 0.005845817 1 3.005747 1.1379310 4.718391 0.04597701 0.06896552 2.531609 0.13218391 0.017241379 V79 V80 V81 V82 0 0.004201681 0.5613811 0.0003653635 0.003836317 1 0.011494253 0.7068966 0.0028735632 0.040229885 Coefficients of linear discriminants: LD1 V04 0.05050244 V44 0.27811236 V47 0.21182486 V57 4.37978016 V58 1.27352740 V59 0.26873381 V76 0.13856260 V78 -9.05361744 V79 -4.73850831 V80 -0.54091586 V81 3.53202496 V82 5.82235211
Prior probabilities of groups | 各群の事前の出現確率(指定していなければ学習用データ中の比率) |
Group means | 各フィールドの群別の平均 |
Coefficients of linear discriminants | 線形判別関数のパラメータ |
一般化加法モデル(正規分布)による学習
# gamパッケージを読み込ませる library(gam) tic.am <- gam(V86~s(V04)+s(V44)+s(V47)+s(V57)+s(V58)+s(V59)+s(V76)+s(V78)+s(V79)+s(V80)+s(V81)+s(V82), data=tic.sub, family="gaussian")
これでは次のようなエラーが表示される.
Error in gam.match(data) : A smoothing variable encountered with 3 or less unique values; at least 4 needed
散布図行列を参考に,V57,V78,V79,V81,V82などからs()という関数を取り除く必要がある.
tic.am <- gam(V86~s(V04)+s(V44)+s(V47)+V57+s(V58)+s(V59)+s(V76)+V78+V79+s(V80)+V81+V82, data=tic.sub, family="gaussian")
学習結果は
summary(tic.am)
と
win.graph() par(mfrow=c(3,4)) plot(tic.am)
とで表示できる.
一般化加法モデル(ロジスティック回帰)による学習
library(gam) tic.gam <- gam(V86~s(V04)+s(V44)+s(V47)+s(V57)+s(V58)+s(V59)+s(V76)+s(V78)+s(V79)+s(V80)+s(V81)+s(V82), data=tic.sub, family="binomial")
こちらもエラーが表示されるので,
散布図行列を参考に,V57,V78,V79,V81,V82などからs()という関数を取り除く必要がある.
tic.gam <- gam(V86~s(V04)+s(V44)+s(V47)+V57+s(V58)+s(V59)+s(V76)+V78+V79+s(V80)+V81+V82, data=tic.sub, family="binomial")
学習結果は
summary(tic.am)
と
win.graph() par(mfrow=c(3,4)) plot(tic.am)
とで表示できる.