Study Log

とある大学院生の勉強記録。

『Rによる統計的学習入門』解答(4.7 演習問題)

『Rによる統計的学習入門』の解答例・解答上のポイントを載せます。

 

解答の目次、他の方の解答は以下の記事にまとめてあります。 

intrinsic-motivation.hatenablog.com

 

4.7 演習問題

理論編

(1)式(4.2)を変形して式(4.3)にします。

※記述が面倒なので、便宜上、式4.3の右辺をZと置きます。

 

式(4.2)を変形すると

     P(X) = Z/(1+Z)

 ⇔ P(X)(1+Z) = Z

 ⇔P(X)+P(X)Z = Z

 ⇔            P(X)=(1-P(X))Z

 ⇔             Z=P(X)/(1-P(X))  式(4.3)

となり、同値であることが示された。

 

(2)〜(4)上記リンク先の参考サイト参照

計算問題が多く基本的に解が1つなので、手抜きします笑。

 

(5)

(a)訓練データの場合:QDA

 テストデータの場合:LDA

一般に、訓練データに対しては複雑なモデル(ここではQDA)の方が当てはまりが良い。

しかし、テストデータに対しては過学習を起こしやすい為、LDAの方が精度が高くなる。

 

(b)訓練データの場合:QDA

 テストデータの場合:非線形の度合い、データ量による

非線形である場合、訓練データで予測するなら基本的にはQDAの方が精度が高い。

 テストデータの場合は、非線形の度合いが高ければQDAだが、低ければLDAの方が精度が高くなる。

※ただ、非線形の度合いによることを言うとキリがないので、QDAと考えておく方が無難かもしれません

 

(c)予測精度は向上する

 QDAはLDAより柔軟性が高く、nが大きければバイアスが小さくなる為。

 

(d)偽(ただし、データの大きさによる)

一般に、QDAはLDAよりも複雑なモデルであり、バイアスが小さくなる。

その為データが大きければ予測の精度が高くなる。

しかし、データが少ない時にはQDAの場合過学習が起きやすい為、予測の精度が下がる。

 

(6)〜(7)上記リンク先の参考サイト参照

 

(8)ロジスティック回帰分析を用いる方が良い。

理由:ロジスティック回帰分析の方がテスト誤分類率が低いと考えられる為。

 

与えられた条件を整理すると以下のようになる。

1.ロジスティック回帰分析の場合
 訓練データの誤分類率 :20%

 テストデータの誤分類率:30%


2.K最近傍法(K=1)の場合

 訓練データとテストデータを合わせた誤分類率:18%


K最近傍法(K=1)の場合、訓練データの誤分類率は0%となる。(※日本語版p38〜39参照)

その為、テストデータを合わせた全体データの誤分類率が18%という事は、テストデータの誤分類率は36%という事である。(少なくとも、30%を超えている)

すなわち、テストデータの誤分類率が低いロジスティック回帰分析を用いるべきだと考えられる。

 

(※)この理由についてですが、いろいろ調べた結果、それっぽい解が得られたので説明を書きます。

K最近傍法(K=1)ではあるデータ(x0)の近隣1個の訓練データのクラスが、そのままx0のクラスと分類されます。

 例えば赤と青のデータを2つのクラスに分類するとして、

 あるデータ(赤)、近隣1個のデータ(赤)→あるデータを赤に分類(真)

 あるデータ(赤)、近隣1個のデータ(青)→あるデータを青に分類(偽)

 と考えると普通に誤分類しているような気がしていたのですが、以下のサイトで解決。

 

どうやら、K=1の場合は近隣1個の別のデータではなく、自分自身を見て分類しているようです。それなら100%正しく分類され、誤分類率は0%です。

stats.stackexchange.com

 

8/8追記:上記の理由より、もっとしっくりくる理由が見つかったので書いておきます。

※長くなります。

------------------------------------------------------------------------------------

①KNNの訓練とは

KNNの訓練は、元々の観測データを訓練データ(教師データ)として、格子点に対してKNNを適用する事だと解釈できます。(僕はこの格子点という概念を抜かして考えていたのですが、これがあると理解しやすくなりました)

 

例えば日本語版p37の図2.14における右側の図の場合、青とオレンジの◯が訓練データとなります。まず、この図にたくさん格子点を打ちます。図中の小さな(・)がそれに相当します。この格子点は、後にテストデータが当てはまる可能性のある全ての場所で、そのうちの一つは図2.14の左側の図の×印です。

f:id:intrinsic_motivation:20190809001936p:plain

図2.14

さて、それぞれの格子点に対して、例えばK=3でKNNを適用すると、格子点の近隣3つの訓練データ(◯)の色によって、格子点をオレンジか青のどちらかに分類できます。図では格子点が分類された色で着色されています。

 

これを全ての格子点に適用する事で、後にテストデータを投入した際、オレンジ/青に分類される領域を決める事ができます。この、領域を決定する事(=決定境界を得る事)が、KNNにおける訓練と考える事ができます。

 

そして、KNNの訓練誤分類率は、訓練データに対する誤分類率である為、元々存在する訓練データ(◯)が果たして正しく分類されていたのか、という意味だと考えられます。

 

例えば図2.14の右側の図では、一番下の訓練データ(青の◯)が、オレンジ色の領域の中に混じっています。この時、訓練データに対する誤分類が起こっているというわけです。

 

②KNNのテストとは

KNNのテストは、①によって決定された領域に、新しいデータ(◯)を投入してみて、分類の正誤を測定する事です。

 

①でオレンジ色で塗られた格子点の並んだ領域は、新たにテストデータが入れば、きっとそのデータもオレンジである確率が高いと予測される領域です。ここに入ったテストデータが実際にオレンジであれば、予測が正しいと評価されるわけです。

 

③K=1の場合

さてK=1の場合ですが、やはり自分自身というより、近隣1個の点を見て訓練していると解釈できます。これは格子点が十分に細かく並んでいれば、「近隣1個の訓練データ」は「格子点とほぼ重なる位置にある」と考えられる為です。

 

例えば訓練において、ある格子点の真上にオレンジの訓練データがある時、その格子点はオレンジ色の領域になります。逆に言えばオレンジ色の訓練データの真下は必ずオレンジの領域と見なされる為、訓練データの誤分類は起き得ません。

 

図2.6の左側の図がK=1のKNNですが、K最近傍決定境界(黒実線)を見ると、オレンジの領域の中に紛れた青い◯の周囲に、小さな境界ができています。図では格子点がある程度の距離をもって並んでいるのでいびつな境界となっていますが、格子点がより細かく並んでいれば、◯とぴったり重なる境界が出来上がるはずです。この図でも境界の中の格子点に目をやると、実際に青い◯の最近傍の格子点は青く着色されており、訓練誤分類率は0%になっているのが分かります。

f:id:intrinsic_motivation:20190809003730p:plain

 

前に「K=1の場合は近隣1個の別のデータではなく、自分自身を見て分類しているようです」と書きましたが、K=1の時だけ特別扱いする事に違和感がありました。

 

しかし、そもそも訓練データ自体にではなく十分に細かく並んだ格子点に対してKNNを適用すると考え、K=1の時は「格子点と訓練データが重なる程近い距離にある為、結果的に自分自身を見ているのと同じ状態になっている」と解釈する方が、より一貫性のある説明になるのではないでしょうか。

 

長くなりましたが以上です。

------------------------------------------------------------------------------------

 

 

(9)上記リンク先の参考サイト参照

 

応用編

(10)上記リンク先の参考サイト参照

 

(11)上記リンク先の参考サイト参照

(g)の問題については、Rで以下のようなfor文を書いて、Kが1〜20のどの場合に誤分類率が最も低いのか、求めてみると面白いかもしれません。

library(class)
train.X <- matrix(Auto01training$displacement)
test.X <- matrix(Auto01test$displacement)
train.Direction <- Auto01training$mpg01
answer <- rep(0, 20)
for(i in 1:20){
  knn.pred <- knn(train.X, test.X, train.Direction, k=i)
  aaa<- table(knn.pred, Auto01test$mpg01)
  answer[i] <- 1-((aaa[1,1]+aaa[2,2])/196)
}
answer

 

(12)(13)上記リンク先の参考サイト参照

 

 

ふぅ…K=1の場合のK最近傍法は何かまだ引っかかる部分があるので新情報があれば追記します。

あと、今度コードの綺麗な貼り方ググって修正します。

 

以上