No.23 Drawing the Decision Boundary of Logistic Regression.
少し必要(?)に迫られ、ロジスティック回帰の決定境界(Decision Boundary)をRで描いてみました。
その時の備忘も兼ねて、整理しておきたいと思います。
以前のエントリ(No.18)で、courseraの「Machine Learning」コースを受講しました~を書きましたが、第3週は、ロジスティック回帰を扱っています。
今回は、その演習に出てくるサンプルデータを利用して、「決定境界」を書いていきます。
サンプルデータをプロットすると、こんな感じになります。(Octaveで描画)
このコースでは、原則、Octaveで演習を実施します。
Octaveは、MATLABのオープンソース版といえる、行列演算に強い数値計算ソフトです。
で、これをRで一応、書いてみると、、
# サンプルデータは、ex2data1でインポート。 cols=as.numeric(ex2data1$admit) pchs=as.numeric(ex2data1$admit) plot(ex2data1[,-3], col=cols, pch=pchs, xlim=c(30,100), ylim=c(30,100))
このサンプルデータは、2つの試験結果とそれらに基づく合否状態を表したものです。
気になる方は、実際に、courseraのMachine Learningを受講してみてください。
このデータを使って、ロジスティック回帰モデルを作成し、合否の(判別を予測する)決定境界を描こうというわけです。
早速、ロジスティック回帰のモデル推定を行います。
ex2data1$admit <- as.factor(ex2data1$admit) admit.glm <- glm(admit ~., family = binomial, data = ex2data1) summary(admit.glm)
さて、いよいよ決定境界をズバッと描いてみましょう!(笑)
# グリッドの指定。 g.x <- seq(30,100,6) g.y <- seq(30,100,6) xy.grid <- expand.grid(g.x,g.y) names(xy.pgrid) <- c("exam1","exam2") # 作成したモデルから合否の確率を算出 predict.glm <- predict(admit.glm, newdata=xy.grid, type="response") # 等高線を利用して、合否確率(の閾値)が0.5の決定境界(線)を描画 par(new=T) contour(g.x,g.y,array(predict.glm,dim=c(length(g.x),length(g.y))),xlim=c(30,100),ylim=c(30,100),col="purple",lwd=2,drawlabels=T, levels=0.5)
ちなみに、合否判定の予測精度(適合率)を上げた決定境界を描く場合は、contour関数のlevelsを0.5より大きくします。幾つかのパターンを描いたものは、以下の通りです。
# プロット画面を2×2で分割 par(mfrow=c(2, 2)) # 上記と同じようにプロットを描き、levelsを変えて、決定境界(線)を描画 # plot→par(new=T)→contourを順に呼び出す
実務では、2変数のみのデータを扱うことは、ほとんどないでしょうが、知っておくと便利かな、と。。
数値だけではなく、プロットできるものなら、視覚的にも結果が見えると良いですよね?!
今回は、2次元上のデータにおける決定境界を描いたわけですが、次回は、ロジスティック回帰のモデル式をトレースして、その意味を追っていきたいと思います。(次回の予定..は未定ww)
参考
ここまで書いておいて何ですが、以下のエントリを参照したほうが詳しいかと思います。苦笑
あくまで、本エントリは、備忘録ということで、ご了承をm(_ _)m
パッケージユーザーのための機械学習(2):ロジスティック回帰 - 銀座で働くData Scientistのブログ
ロジスティック回帰 - 人工知能に関する断創録