SlideShare a Scribd company logo
2
Most read
4
Most read
6
Most read
第3章 遅延学習—最近傍法を使った分類
市東 亘
2022 年 7 月 7 日
1 概観
目 次
1 概観 1
2 最近傍法とは? 1
3 遅延学習 2
4 k 近傍法の長所 2
5 k 近傍法の短所 2
6 乳がんデータの入手 3
6.1 オリジナルデータの場合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
6.2 書籍サポートファイルの場合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
7 R での分析例 5
7.1 データの正規化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
7.2 トレーニング・データとテスト・データの分割 . . . . . . . . . . . . . . . . . . . . 5
7.3 分類学習 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
7.4 分類予測 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
7.5 予測の評価 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
8 class パッケージを使用した例 7
9 オリジナル実装ソース・コード 8
10 データの異なる正規化 9
2 最近傍法とは?
• 目的: データをカテゴリに分類したい.
• トレーニングデータの中で
、
 
似
、
 
て
、
 
い
、
 
る Feature のデータと同じカテゴリに分類.
1
第 3 章 遅延学習—最近傍法を使った分類
• 「似ている」= feature の値の「近さ」
(ユークリッド距離)
• k-近傍法は「近い」データを k 個抽出し,それらの相対多数のカテゴリに分類する.
• k-近傍法: k-Nearest Neighbor(k-NN)
.
「最も近いお隣さん k 個」を使った分類方法.
3 遅延学習
• 遅延学習 =Lazy Learning
• 全てのトレーニングデータをそのまま保持し,そこから neighbor を選び出す.
• 何の学習もしていない!入力と出力の関係を抽象化したモデルもない!
• 学習器としてはとっても Lazy.
• モデルがないため予測をするには全てのトレーニングデータを走査し,neighbor を探さない
といけないので時間がかかる.
4 k 近傍法の長所
• 単純で効果的.
• 土台となるデータの分布について前提条件を設けない.
• 高速に訓練できる.
学習フェーズが無いので実際にはトレーニングは何も行っていない!
5 k 近傍法の短所
• モデルを作らないので,feature が各分類とどの様に繋がりを持つのか理解するには限界が
ある.
• 適切な k を選択しなければならない.
⇒ 試行錯誤して選択するが一般には
√
N から始めるとよい.
• 分類フェーズが遅い.
• フィーチャ間で距離を比較可能にするために値の正規化が必要.
• カテゴリカル変数や欠損値(missing variables)に対し別の処理が必要になる.
西南学院大学 演習 I 2 担当 市東 亘
第 3 章 遅延学習—最近傍法を使った分類
6 乳がんデータの入手
6.1 オリジナルデータの場合
Breast Cancer Wisconsin(http://archive.ics.uci.edu/ml)
• wdbc.data: CSV ファイル.data/wdbc.csv として保存.
• wdbc.names: 符号ファイル
6.1.1 データの読み込み
テキストとの相違点.
• csv ファイルには列名が設定されていないので header=FALSE で読み込む.
• stringsAsFactors=FALSE は付けず,文字列は factor として読み込む.
wdbc <- read.csv("data/wdbc.csv", header=FALSE)
str(wdbc)
## ’data.frame’: 569 obs. of 32 variables:
## $ V1 : int 842302 842517 84300903 84348301 84358402 843786 844359 84458202 844981 84501001 ...
## $ V2 : chr "M" "M" "M" "M" ...
## $ V3 : num 18 20.6 19.7 11.4 20.3 ...
## $ V4 : num 10.4 17.8 21.2 20.4 14.3 ...
## $ V5 : num 122.8 132.9 130 77.6 135.1 ...
## $ V6 : num 1001 1326 1203 386 1297 ...
## $ V7 : num 0.1184 0.0847 0.1096 0.1425 0.1003 ...
## $ V8 : num 0.2776 0.0786 0.1599 0.2839 0.1328 ...
## $ V9 : num 0.3001 0.0869 0.1974 0.2414 0.198 ...
## $ V10: num 0.1471 0.0702 0.1279 0.1052 0.1043 ...
## $ V11: num 0.242 0.181 0.207 0.26 0.181 ...
## $ V12: num 0.0787 0.0567 0.06 0.0974 0.0588 ...
## $ V13: num 1.095 0.543 0.746 0.496 0.757 ...
## $ V14: num 0.905 0.734 0.787 1.156 0.781 ...
## $ V15: num 8.59 3.4 4.58 3.44 5.44 ...
## $ V16: num 153.4 74.1 94 27.2 94.4 ...
## $ V17: num 0.0064 0.00522 0.00615 0.00911 0.01149 ...
## $ V18: num 0.049 0.0131 0.0401 0.0746 0.0246 ...
## $ V19: num 0.0537 0.0186 0.0383 0.0566 0.0569 ...
## $ V20: num 0.0159 0.0134 0.0206 0.0187 0.0188 ...
## $ V21: num 0.03 0.0139 0.0225 0.0596 0.0176 ...
## $ V22: num 0.00619 0.00353 0.00457 0.00921 0.00511 ...
## $ V23: num 25.4 25 23.6 14.9 22.5 ...
西南学院大学 演習 I 3 担当 市東 亘
6.2 書籍サポートファイルの場合 第 3 章 遅延学習—最近傍法を使った分類
## $ V24: num 17.3 23.4 25.5 26.5 16.7 ...
## $ V25: num 184.6 158.8 152.5 98.9 152.2 ...
## $ V26: num 2019 1956 1709 568 1575 ...
## $ V27: num 0.162 0.124 0.144 0.21 0.137 ...
## $ V28: num 0.666 0.187 0.424 0.866 0.205 ...
## $ V29: num 0.712 0.242 0.45 0.687 0.4 ...
## $ V30: num 0.265 0.186 0.243 0.258 0.163 ...
## $ V31: num 0.46 0.275 0.361 0.664 0.236 ...
## $ V32: num 0.1189 0.089 0.0876 0.173 0.0768 ...
6.1.2 データの確認
テキストには ID: 87139402 のデータが表示されているので,同じデータをチェ
ック.
wdbc[wdbc$V1==87139402,]
## V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11
## 171 87139402 B 12.32 12.39 78.85 464.1 0.1028 0.06981 0.03987 0.037 0.1959
## V12 V13 V14 V15 V16 V17 V18 V19 V20 V21
## 171 0.05955 0.236 0.6656 1.67 17.43 0.008045 0.0118 0.01683 0.01241 0.01924
## V22 V23 V24 V25 V26 V27 V28 V29 V30 V31 V32
## 171 0.002248 13.5 15.64 86.97 549.1 0.1385 0.1266 0.1242 0.09391 0.2827 0.06771
6.1.3 符号表を参考に列名を設定
ft <- c("radius", "texture", "perimeter", "area",
"smoothness", "compactness", "concavity",
"concave.points", "symmetry", "fractal.dimension")
# ft の各要素 x に paste(x, c("mean", "se", "worst"), sep=".") を apply
three.ft <- unlist(lapply(ft, paste, c("mean", "se", "worst"), sep="."))
colnames(wdbc) <- c("id", "diagnosis", three.ft)
wdbc[1:2, 1:10]
## id diagnosis radius.mean radius.se radius.worst texture.mean texture.se
## 1 842302 M 17.99 10.38 122.8 1001 0.11840
## 2 842517 M 20.57 17.77 132.9 1326 0.08474
## texture.worst perimeter.mean perimeter.se
## 1 0.27760 0.3001 0.14710
## 2 0.07864 0.0869 0.07017
6.2 書籍サポートファイルの場合
GitHub: https://github.com/dataspelunking/MLwR/
• 「Machine Learning with R (2nd Ed.) → Chapter 03」から wisc_bc_data.csv を選択し
表示.
• 「Raw」ボタンを押し,ブラウザで別名保存する.
data/wisc_bc_data.csv として保存.
西南学院大学 演習 I 4 担当 市東 亘
第 3 章 遅延学習—最近傍法を使った分類
6.2.1 データの読み込み
# 文字列は factor として読み込む.
wdbc.book <- read.csv("data/wisc_bc_data.csv")
7 R での分析例
オリジナルデータを使って分析例を示す.
分析手順
(1) データの正規化(normalization)
(2) トレーニング・データとテスト・データの分割
(3) テスト・データを分類(予測)
• トレーニング・データによる学習はなく,各テスト・データと全トレーニング・データ
との「距離」を計算し,Nearest Neighbor k 個を抽出.
• k-NN から相対多数のカテゴリに分類する.
7.1 データの正規化
Feature 間で距離を比較できるよう 0∼1 にリスケールする.
normalize <- function(x) {
((x - min(x)) / (max(x) - min(x)))
}
# 実行例
normalize(-10:10)
## [1] 0.00 0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70
## [16] 0.75 0.80 0.85 0.90 0.95 1.00
# 全数値 feature(3 列目以降)に normalize を適用
wdbc.normal <- as.data.frame(lapply(wdbc[, 3:ncol(wdbc)], normalize))
# ID と診断結果の 2 列を結合
wdbc.normal <- cbind(wdbc[, 1:2], wdbc.normal)
# 結果の一部を表示
wdbc.normal[1:3, 1:6]
## id diagnosis radius.mean radius.se radius.worst texture.mean
## 1 842302 M 0.5210374 0.0226581 0.5459885 0.3637328
## 2 842517 M 0.6431445 0.2725736 0.6157833 0.5015907
## 3 84300903 M 0.6014956 0.3902604 0.5957432 0.4494168
7.2 トレーニング・データとテスト・データの分割
トレーニング・データは母集団を反映させるためにランダム抽出する.ここではデータの 7 割を
トレーニング・データに使用し,残りをテスト・データとする.
西南学院大学 演習 I 5 担当 市東 亘
7.3 分類学習 第 3 章 遅延学習—最近傍法を使った分類
# データの行番号の 7 割をランダム抽出する.
train.index <- sample(1:nrow(wdbc.normal), size=round(0.7*nrow(wdbc.normal)))
test.index <- setdiff(1:nrow(wdbc.normal), train.index)
# データを分割
train.data <- wdbc.normal[train.index, ]
test.data <- wdbc.normal[test.index, ]
7.3 分類学習
実際にはパラメータ学習はないが,各テストデータから全トレーニングデータまでの距離を計算
し,近い順に並べたデータを準備する.
# 2 つのベクトルの距離を計算する関数を定義.
distance <- function(x, y) {
sqrt(sum((x - y)^2))
}
# 1 つのテストデータと全トレーニングデータとの距離を計算し
# train データフレームの近い順インデックスを返す.
rank.dist <- function(x, train) {
order(apply(train, MARGIN=1, distance, x))
}
# 全てのテストデータに rank.dist を適用.
knn.calc <- function(test, train) {
as.data.frame(apply(test, MARGIN=1, rank.dist, train))
}
# knn.db リストの i 番目要素に格納されたベクトルには
# i 番目のテストデータから近い順にトレーニングデータの
# インデックスが格納されている
knn.db <- knn.calc(test.data[, -1:-2], train.data[, -1:-2])
7.4 分類予測
いよいよ分類予測.分類学習で近い順に並べたトレーニングデータから,k 近傍を使って相対多
数の分類を決める.
# knn.db にもとづき k 個の近傍から分類を決定し
# test データの分類ベクトルを返す.
knn.pred <- function(knn.db, train.label, k) {
as.factor(
sapply(knn.db,
function(knn.index) {
knn <- train.label[knn.index[1:k]]
tbl <- table(knn)
names(tbl[which.max(tbl)])
}))
}
predicted <- knn.pred(knn.db, train.label=train.data[, 2], k=3)
7.5 予測の評価
if(!require(gmodels)) {
install.packages("gmodels", repos="https://cran.ism.ac.jp")
library(gmodels)
}
西南学院大学 演習 I 6 担当 市東 亘
第 3 章 遅延学習—最近傍法を使った分類
## 要求されたパッケージ gmodels をロード中です
CrossTable(x=test.data[,2], y=predicted, prop.chisq=FALSE)
##
##
## Cell Contents
## |-------------------------|
## | N |
## | N / Row Total |
## | N / Col Total |
## | N / Table Total |
## |-------------------------|
##
##
## Total Observations in Table: 171
##
##
## | predicted
## test.data[, 2] | B | M | Row Total |
## ---------------|-----------|-----------|-----------|
## B | 112 | 1 | 113 |
## | 0.991 | 0.009 | 0.661 |
## | 0.974 | 0.018 | |
## | 0.655 | 0.006 | |
## ---------------|-----------|-----------|-----------|
## M | 3 | 55 | 58 |
## | 0.052 | 0.948 | 0.339 |
## | 0.026 | 0.982 | |
## | 0.018 | 0.322 | |
## ---------------|-----------|-----------|-----------|
## Column Total | 115 | 56 | 171 |
## | 0.673 | 0.327 | |
## ---------------|-----------|-----------|-----------|
##
##
8 class パッケージを使用した例
if(!require(class)) {
install.packages("class", repos="https://cran.ism.ac.jp")
library(class)
}
## 要求されたパッケージ class をロード中です
predicted.class <- knn(train=train.data[,-1:-2],
test=test.data[,-1:-2],
cl=train.data[,2], k=3)
CrossTable(x=test.data[,2], y=predicted.class, prop.chisq=FALSE)
##
##
## Cell Contents
## |-------------------------|
## | N |
## | N / Row Total |
## | N / Col Total |
## | N / Table Total |
## |-------------------------|
##
##
西南学院大学 演習 I 7 担当 市東 亘
第 3 章 遅延学習—最近傍法を使った分類
## Total Observations in Table: 171
##
##
## | predicted.class
## test.data[, 2] | B | M | Row Total |
## ---------------|-----------|-----------|-----------|
## B | 112 | 1 | 113 |
## | 0.991 | 0.009 | 0.661 |
## | 0.974 | 0.018 | |
## | 0.655 | 0.006 | |
## ---------------|-----------|-----------|-----------|
## M | 3 | 55 | 58 |
## | 0.052 | 0.948 | 0.339 |
## | 0.026 | 0.982 | |
## | 0.018 | 0.322 | |
## ---------------|-----------|-----------|-----------|
## Column Total | 115 | 56 | 171 |
## | 0.673 | 0.327 | |
## ---------------|-----------|-----------|-----------|
##
##
9 オリジナル実装ソース・コード
knn.calc <- function(test, train) {
distance <- function(x, y) {
sqrt(sum((x - y)^2))
}
rank.dist <- function(x, train) {
order(apply(train, MARGIN=1, distance, x))
}
as.data.frame(apply(test, MARGIN=1, rank.dist, train))
}
knn.pred <- function(knn.db, train.label, k) {
as.factor(
sapply(knn.db,
function(knn.index) {
knn <- train.label[knn.index[1:k]]
tbl <- table(knn)
names(tbl[which.max(tbl)])
}))
}
使い方
knn.db <- knn.calc(test.data[, -1:-2], train.data[, -1:-2])
predicted <- knn.pred(knn.db, train.label=train.data[, 2], k=3)
評価方法
CrossTable(x=test.data[,2], y=predicted, prop.chisq=FALSE)
##
##
## Cell Contents
## |-------------------------|
## | N |
## | N / Row Total |
## | N / Col Total |
## | N / Table Total |
## |-------------------------|
##
西南学院大学 演習 I 8 担当 市東 亘
第 3 章 遅延学習—最近傍法を使った分類
##
## Total Observations in Table: 171
##
##
## | predicted
## test.data[, 2] | B | M | Row Total |
## ---------------|-----------|-----------|-----------|
## B | 112 | 1 | 113 |
## | 0.991 | 0.009 | 0.661 |
## | 0.974 | 0.018 | |
## | 0.655 | 0.006 | |
## ---------------|-----------|-----------|-----------|
## M | 3 | 55 | 58 |
## | 0.052 | 0.948 | 0.339 |
## | 0.026 | 0.982 | |
## | 0.018 | 0.322 | |
## ---------------|-----------|-----------|-----------|
## Column Total | 115 | 56 | 171 |
## | 0.673 | 0.327 | |
## ---------------|-----------|-----------|-----------|
##
##
10 データの異なる正規化
標準正規化を行い同じ条件で分類してみる.
# 全数値 feature(3 列目以降)に scale() を適用
wdbc.z <- as.data.frame(scale(wdbc[, 3:ncol(wdbc)]))
# ID と診断結果の 2 列を結合
wdbc.z <- cbind(wdbc[, 1:2], wdbc.z)
# 先程と同じインデックスでデータを分割
train.data <- wdbc.z[train.index, ]
test.data <- wdbc.z[test.index, ]
# 学習と分類予測
knn.db <- knn.calc(test.data[, -1:-2], train.data[, -1:-2])
predicted <- knn.pred(knn.db, train.label=train.data[, 2], k=3)
# 結果の表示
CrossTable(x=test.data[,2], y=predicted, prop.chisq=FALSE)
##
##
## Cell Contents
## |-------------------------|
## | N |
## | N / Row Total |
## | N / Col Total |
## | N / Table Total |
## |-------------------------|
##
##
## Total Observations in Table: 171
##
##
## | predicted
## test.data[, 2] | B | M | Row Total |
## ---------------|-----------|-----------|-----------|
## B | 113 | 0 | 113 |
## | 1.000 | 0.000 | 0.661 |
## | 0.966 | 0.000 | |
西南学院大学 演習 I 9 担当 市東 亘
第 3 章 遅延学習—最近傍法を使った分類
## | 0.661 | 0.000 | |
## ---------------|-----------|-----------|-----------|
## M | 4 | 54 | 58 |
## | 0.069 | 0.931 | 0.339 |
## | 0.034 | 1.000 | |
## | 0.023 | 0.316 | |
## ---------------|-----------|-----------|-----------|
## Column Total | 117 | 54 | 171 |
## | 0.684 | 0.316 | |
## ---------------|-----------|-----------|-----------|
##
##
西南学院大学 演習 I 10 担当 市東 亘

More Related Content

PDF
第4章 確率的学習---単純ベイズを使った分類
PDF
第1回 Rプログラミングを始めよう
PDF
第2回 基本演算,データ型の基礎,ベクトルの操作方法
PDF
第5回 様々なファイル形式の読み込みとデータの書き出し
PDF
第1回 Rプログラミングを始めよう(解答付き)
PDF
第3回 データフレームの基本操作 その1
PDF
第7回 大規模データを用いたデータフレーム操作実習(1)
PDF
パターン認識と機械学習 §6.2 カーネル関数の構成
第4章 確率的学習---単純ベイズを使った分類
第1回 Rプログラミングを始めよう
第2回 基本演算,データ型の基礎,ベクトルの操作方法
第5回 様々なファイル形式の読み込みとデータの書き出し
第1回 Rプログラミングを始めよう(解答付き)
第3回 データフレームの基本操作 その1
第7回 大規模データを用いたデータフレーム操作実習(1)
パターン認識と機械学習 §6.2 カーネル関数の構成

More from Wataru Shito (20)

PDF
統計的推定の基礎 2 -- 分散の推定
PDF
統計的推定の基礎 1 -- 期待値の推定
PDF
演習II.第1章 ベイズ推論の考え方 Part 3.講義ノート
PDF
演習II.第1章 ベイズ推論の考え方 Part 3.スライド
PDF
演習II.第1章 ベイズ推論の考え方 Part 2.講義ノート
PDF
演習II.第1章 ベイズ推論の考え方 Part 2.スライド
PDF
演習II.第1章 ベイズ推論の考え方 Part 1.講義ノート
PDF
マクロ経済学I 「第8章 総需要・総供給分析(AD-AS分析)」
PDF
経済数学II 「第9章 最適化(Optimization)」
PDF
マクロ経済学I 「第10章 総需要 II.IS-LM分析とAD曲線」
PDF
第9回 大規模データを用いたデータフレーム操作実習(3)
PDF
第8回 大規模データを用いたデータフレーム操作実習(2)
PDF
経済数学II 「第12章 制約つき最適化」
PDF
マクロ経済学I 「第9章 総需要 I」
PDF
経済数学II 「第11章 選択変数が2個以上の場合の最適化」
PDF
マクロ経済学I 「第6章 開放経済の長期分析」
PDF
経済数学II 「第8章 一般関数型モデルの比較静学」
PDF
マクロ経済学I 「第4,5章 貨幣とインフレーション」
PDF
マクロ経済学I 「第3章 長期閉鎖経済モデル」
PDF
経済数学II 「第7章 微分法とその比較静学への応用」
統計的推定の基礎 2 -- 分散の推定
統計的推定の基礎 1 -- 期待値の推定
演習II.第1章 ベイズ推論の考え方 Part 3.講義ノート
演習II.第1章 ベイズ推論の考え方 Part 3.スライド
演習II.第1章 ベイズ推論の考え方 Part 2.講義ノート
演習II.第1章 ベイズ推論の考え方 Part 2.スライド
演習II.第1章 ベイズ推論の考え方 Part 1.講義ノート
マクロ経済学I 「第8章 総需要・総供給分析(AD-AS分析)」
経済数学II 「第9章 最適化(Optimization)」
マクロ経済学I 「第10章 総需要 II.IS-LM分析とAD曲線」
第9回 大規模データを用いたデータフレーム操作実習(3)
第8回 大規模データを用いたデータフレーム操作実習(2)
経済数学II 「第12章 制約つき最適化」
マクロ経済学I 「第9章 総需要 I」
経済数学II 「第11章 選択変数が2個以上の場合の最適化」
マクロ経済学I 「第6章 開放経済の長期分析」
経済数学II 「第8章 一般関数型モデルの比較静学」
マクロ経済学I 「第4,5章 貨幣とインフレーション」
マクロ経済学I 「第3章 長期閉鎖経済モデル」
経済数学II 「第7章 微分法とその比較静学への応用」
Ad

第3章 遅延学習---最近傍法を使った分類

  • 1. 第3章 遅延学習—最近傍法を使った分類 市東 亘 2022 年 7 月 7 日 1 概観 目 次 1 概観 1 2 最近傍法とは? 1 3 遅延学習 2 4 k 近傍法の長所 2 5 k 近傍法の短所 2 6 乳がんデータの入手 3 6.1 オリジナルデータの場合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 6.2 書籍サポートファイルの場合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 7 R での分析例 5 7.1 データの正規化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 7.2 トレーニング・データとテスト・データの分割 . . . . . . . . . . . . . . . . . . . . 5 7.3 分類学習 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 7.4 分類予測 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 7.5 予測の評価 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 8 class パッケージを使用した例 7 9 オリジナル実装ソース・コード 8 10 データの異なる正規化 9 2 最近傍法とは? • 目的: データをカテゴリに分類したい. • トレーニングデータの中で 、   似 、   て 、   い 、   る Feature のデータと同じカテゴリに分類. 1
  • 2. 第 3 章 遅延学習—最近傍法を使った分類 • 「似ている」= feature の値の「近さ」 (ユークリッド距離) • k-近傍法は「近い」データを k 個抽出し,それらの相対多数のカテゴリに分類する. • k-近傍法: k-Nearest Neighbor(k-NN) . 「最も近いお隣さん k 個」を使った分類方法. 3 遅延学習 • 遅延学習 =Lazy Learning • 全てのトレーニングデータをそのまま保持し,そこから neighbor を選び出す. • 何の学習もしていない!入力と出力の関係を抽象化したモデルもない! • 学習器としてはとっても Lazy. • モデルがないため予測をするには全てのトレーニングデータを走査し,neighbor を探さない といけないので時間がかかる. 4 k 近傍法の長所 • 単純で効果的. • 土台となるデータの分布について前提条件を設けない. • 高速に訓練できる. 学習フェーズが無いので実際にはトレーニングは何も行っていない! 5 k 近傍法の短所 • モデルを作らないので,feature が各分類とどの様に繋がりを持つのか理解するには限界が ある. • 適切な k を選択しなければならない. ⇒ 試行錯誤して選択するが一般には √ N から始めるとよい. • 分類フェーズが遅い. • フィーチャ間で距離を比較可能にするために値の正規化が必要. • カテゴリカル変数や欠損値(missing variables)に対し別の処理が必要になる. 西南学院大学 演習 I 2 担当 市東 亘
  • 3. 第 3 章 遅延学習—最近傍法を使った分類 6 乳がんデータの入手 6.1 オリジナルデータの場合 Breast Cancer Wisconsin(http://archive.ics.uci.edu/ml) • wdbc.data: CSV ファイル.data/wdbc.csv として保存. • wdbc.names: 符号ファイル 6.1.1 データの読み込み テキストとの相違点. • csv ファイルには列名が設定されていないので header=FALSE で読み込む. • stringsAsFactors=FALSE は付けず,文字列は factor として読み込む. wdbc <- read.csv("data/wdbc.csv", header=FALSE) str(wdbc) ## ’data.frame’: 569 obs. of 32 variables: ## $ V1 : int 842302 842517 84300903 84348301 84358402 843786 844359 84458202 844981 84501001 ... ## $ V2 : chr "M" "M" "M" "M" ... ## $ V3 : num 18 20.6 19.7 11.4 20.3 ... ## $ V4 : num 10.4 17.8 21.2 20.4 14.3 ... ## $ V5 : num 122.8 132.9 130 77.6 135.1 ... ## $ V6 : num 1001 1326 1203 386 1297 ... ## $ V7 : num 0.1184 0.0847 0.1096 0.1425 0.1003 ... ## $ V8 : num 0.2776 0.0786 0.1599 0.2839 0.1328 ... ## $ V9 : num 0.3001 0.0869 0.1974 0.2414 0.198 ... ## $ V10: num 0.1471 0.0702 0.1279 0.1052 0.1043 ... ## $ V11: num 0.242 0.181 0.207 0.26 0.181 ... ## $ V12: num 0.0787 0.0567 0.06 0.0974 0.0588 ... ## $ V13: num 1.095 0.543 0.746 0.496 0.757 ... ## $ V14: num 0.905 0.734 0.787 1.156 0.781 ... ## $ V15: num 8.59 3.4 4.58 3.44 5.44 ... ## $ V16: num 153.4 74.1 94 27.2 94.4 ... ## $ V17: num 0.0064 0.00522 0.00615 0.00911 0.01149 ... ## $ V18: num 0.049 0.0131 0.0401 0.0746 0.0246 ... ## $ V19: num 0.0537 0.0186 0.0383 0.0566 0.0569 ... ## $ V20: num 0.0159 0.0134 0.0206 0.0187 0.0188 ... ## $ V21: num 0.03 0.0139 0.0225 0.0596 0.0176 ... ## $ V22: num 0.00619 0.00353 0.00457 0.00921 0.00511 ... ## $ V23: num 25.4 25 23.6 14.9 22.5 ... 西南学院大学 演習 I 3 担当 市東 亘
  • 4. 6.2 書籍サポートファイルの場合 第 3 章 遅延学習—最近傍法を使った分類 ## $ V24: num 17.3 23.4 25.5 26.5 16.7 ... ## $ V25: num 184.6 158.8 152.5 98.9 152.2 ... ## $ V26: num 2019 1956 1709 568 1575 ... ## $ V27: num 0.162 0.124 0.144 0.21 0.137 ... ## $ V28: num 0.666 0.187 0.424 0.866 0.205 ... ## $ V29: num 0.712 0.242 0.45 0.687 0.4 ... ## $ V30: num 0.265 0.186 0.243 0.258 0.163 ... ## $ V31: num 0.46 0.275 0.361 0.664 0.236 ... ## $ V32: num 0.1189 0.089 0.0876 0.173 0.0768 ... 6.1.2 データの確認 テキストには ID: 87139402 のデータが表示されているので,同じデータをチェ ック. wdbc[wdbc$V1==87139402,] ## V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 ## 171 87139402 B 12.32 12.39 78.85 464.1 0.1028 0.06981 0.03987 0.037 0.1959 ## V12 V13 V14 V15 V16 V17 V18 V19 V20 V21 ## 171 0.05955 0.236 0.6656 1.67 17.43 0.008045 0.0118 0.01683 0.01241 0.01924 ## V22 V23 V24 V25 V26 V27 V28 V29 V30 V31 V32 ## 171 0.002248 13.5 15.64 86.97 549.1 0.1385 0.1266 0.1242 0.09391 0.2827 0.06771 6.1.3 符号表を参考に列名を設定 ft <- c("radius", "texture", "perimeter", "area", "smoothness", "compactness", "concavity", "concave.points", "symmetry", "fractal.dimension") # ft の各要素 x に paste(x, c("mean", "se", "worst"), sep=".") を apply three.ft <- unlist(lapply(ft, paste, c("mean", "se", "worst"), sep=".")) colnames(wdbc) <- c("id", "diagnosis", three.ft) wdbc[1:2, 1:10] ## id diagnosis radius.mean radius.se radius.worst texture.mean texture.se ## 1 842302 M 17.99 10.38 122.8 1001 0.11840 ## 2 842517 M 20.57 17.77 132.9 1326 0.08474 ## texture.worst perimeter.mean perimeter.se ## 1 0.27760 0.3001 0.14710 ## 2 0.07864 0.0869 0.07017 6.2 書籍サポートファイルの場合 GitHub: https://github.com/dataspelunking/MLwR/ • 「Machine Learning with R (2nd Ed.) → Chapter 03」から wisc_bc_data.csv を選択し 表示. • 「Raw」ボタンを押し,ブラウザで別名保存する. data/wisc_bc_data.csv として保存. 西南学院大学 演習 I 4 担当 市東 亘
  • 5. 第 3 章 遅延学習—最近傍法を使った分類 6.2.1 データの読み込み # 文字列は factor として読み込む. wdbc.book <- read.csv("data/wisc_bc_data.csv") 7 R での分析例 オリジナルデータを使って分析例を示す. 分析手順 (1) データの正規化(normalization) (2) トレーニング・データとテスト・データの分割 (3) テスト・データを分類(予測) • トレーニング・データによる学習はなく,各テスト・データと全トレーニング・データ との「距離」を計算し,Nearest Neighbor k 個を抽出. • k-NN から相対多数のカテゴリに分類する. 7.1 データの正規化 Feature 間で距離を比較できるよう 0∼1 にリスケールする. normalize <- function(x) { ((x - min(x)) / (max(x) - min(x))) } # 実行例 normalize(-10:10) ## [1] 0.00 0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45 0.50 0.55 0.60 0.65 0.70 ## [16] 0.75 0.80 0.85 0.90 0.95 1.00 # 全数値 feature(3 列目以降)に normalize を適用 wdbc.normal <- as.data.frame(lapply(wdbc[, 3:ncol(wdbc)], normalize)) # ID と診断結果の 2 列を結合 wdbc.normal <- cbind(wdbc[, 1:2], wdbc.normal) # 結果の一部を表示 wdbc.normal[1:3, 1:6] ## id diagnosis radius.mean radius.se radius.worst texture.mean ## 1 842302 M 0.5210374 0.0226581 0.5459885 0.3637328 ## 2 842517 M 0.6431445 0.2725736 0.6157833 0.5015907 ## 3 84300903 M 0.6014956 0.3902604 0.5957432 0.4494168 7.2 トレーニング・データとテスト・データの分割 トレーニング・データは母集団を反映させるためにランダム抽出する.ここではデータの 7 割を トレーニング・データに使用し,残りをテスト・データとする. 西南学院大学 演習 I 5 担当 市東 亘
  • 6. 7.3 分類学習 第 3 章 遅延学習—最近傍法を使った分類 # データの行番号の 7 割をランダム抽出する. train.index <- sample(1:nrow(wdbc.normal), size=round(0.7*nrow(wdbc.normal))) test.index <- setdiff(1:nrow(wdbc.normal), train.index) # データを分割 train.data <- wdbc.normal[train.index, ] test.data <- wdbc.normal[test.index, ] 7.3 分類学習 実際にはパラメータ学習はないが,各テストデータから全トレーニングデータまでの距離を計算 し,近い順に並べたデータを準備する. # 2 つのベクトルの距離を計算する関数を定義. distance <- function(x, y) { sqrt(sum((x - y)^2)) } # 1 つのテストデータと全トレーニングデータとの距離を計算し # train データフレームの近い順インデックスを返す. rank.dist <- function(x, train) { order(apply(train, MARGIN=1, distance, x)) } # 全てのテストデータに rank.dist を適用. knn.calc <- function(test, train) { as.data.frame(apply(test, MARGIN=1, rank.dist, train)) } # knn.db リストの i 番目要素に格納されたベクトルには # i 番目のテストデータから近い順にトレーニングデータの # インデックスが格納されている knn.db <- knn.calc(test.data[, -1:-2], train.data[, -1:-2]) 7.4 分類予測 いよいよ分類予測.分類学習で近い順に並べたトレーニングデータから,k 近傍を使って相対多 数の分類を決める. # knn.db にもとづき k 個の近傍から分類を決定し # test データの分類ベクトルを返す. knn.pred <- function(knn.db, train.label, k) { as.factor( sapply(knn.db, function(knn.index) { knn <- train.label[knn.index[1:k]] tbl <- table(knn) names(tbl[which.max(tbl)]) })) } predicted <- knn.pred(knn.db, train.label=train.data[, 2], k=3) 7.5 予測の評価 if(!require(gmodels)) { install.packages("gmodels", repos="https://cran.ism.ac.jp") library(gmodels) } 西南学院大学 演習 I 6 担当 市東 亘
  • 7. 第 3 章 遅延学習—最近傍法を使った分類 ## 要求されたパッケージ gmodels をロード中です CrossTable(x=test.data[,2], y=predicted, prop.chisq=FALSE) ## ## ## Cell Contents ## |-------------------------| ## | N | ## | N / Row Total | ## | N / Col Total | ## | N / Table Total | ## |-------------------------| ## ## ## Total Observations in Table: 171 ## ## ## | predicted ## test.data[, 2] | B | M | Row Total | ## ---------------|-----------|-----------|-----------| ## B | 112 | 1 | 113 | ## | 0.991 | 0.009 | 0.661 | ## | 0.974 | 0.018 | | ## | 0.655 | 0.006 | | ## ---------------|-----------|-----------|-----------| ## M | 3 | 55 | 58 | ## | 0.052 | 0.948 | 0.339 | ## | 0.026 | 0.982 | | ## | 0.018 | 0.322 | | ## ---------------|-----------|-----------|-----------| ## Column Total | 115 | 56 | 171 | ## | 0.673 | 0.327 | | ## ---------------|-----------|-----------|-----------| ## ## 8 class パッケージを使用した例 if(!require(class)) { install.packages("class", repos="https://cran.ism.ac.jp") library(class) } ## 要求されたパッケージ class をロード中です predicted.class <- knn(train=train.data[,-1:-2], test=test.data[,-1:-2], cl=train.data[,2], k=3) CrossTable(x=test.data[,2], y=predicted.class, prop.chisq=FALSE) ## ## ## Cell Contents ## |-------------------------| ## | N | ## | N / Row Total | ## | N / Col Total | ## | N / Table Total | ## |-------------------------| ## ## 西南学院大学 演習 I 7 担当 市東 亘
  • 8. 第 3 章 遅延学習—最近傍法を使った分類 ## Total Observations in Table: 171 ## ## ## | predicted.class ## test.data[, 2] | B | M | Row Total | ## ---------------|-----------|-----------|-----------| ## B | 112 | 1 | 113 | ## | 0.991 | 0.009 | 0.661 | ## | 0.974 | 0.018 | | ## | 0.655 | 0.006 | | ## ---------------|-----------|-----------|-----------| ## M | 3 | 55 | 58 | ## | 0.052 | 0.948 | 0.339 | ## | 0.026 | 0.982 | | ## | 0.018 | 0.322 | | ## ---------------|-----------|-----------|-----------| ## Column Total | 115 | 56 | 171 | ## | 0.673 | 0.327 | | ## ---------------|-----------|-----------|-----------| ## ## 9 オリジナル実装ソース・コード knn.calc <- function(test, train) { distance <- function(x, y) { sqrt(sum((x - y)^2)) } rank.dist <- function(x, train) { order(apply(train, MARGIN=1, distance, x)) } as.data.frame(apply(test, MARGIN=1, rank.dist, train)) } knn.pred <- function(knn.db, train.label, k) { as.factor( sapply(knn.db, function(knn.index) { knn <- train.label[knn.index[1:k]] tbl <- table(knn) names(tbl[which.max(tbl)]) })) } 使い方 knn.db <- knn.calc(test.data[, -1:-2], train.data[, -1:-2]) predicted <- knn.pred(knn.db, train.label=train.data[, 2], k=3) 評価方法 CrossTable(x=test.data[,2], y=predicted, prop.chisq=FALSE) ## ## ## Cell Contents ## |-------------------------| ## | N | ## | N / Row Total | ## | N / Col Total | ## | N / Table Total | ## |-------------------------| ## 西南学院大学 演習 I 8 担当 市東 亘
  • 9. 第 3 章 遅延学習—最近傍法を使った分類 ## ## Total Observations in Table: 171 ## ## ## | predicted ## test.data[, 2] | B | M | Row Total | ## ---------------|-----------|-----------|-----------| ## B | 112 | 1 | 113 | ## | 0.991 | 0.009 | 0.661 | ## | 0.974 | 0.018 | | ## | 0.655 | 0.006 | | ## ---------------|-----------|-----------|-----------| ## M | 3 | 55 | 58 | ## | 0.052 | 0.948 | 0.339 | ## | 0.026 | 0.982 | | ## | 0.018 | 0.322 | | ## ---------------|-----------|-----------|-----------| ## Column Total | 115 | 56 | 171 | ## | 0.673 | 0.327 | | ## ---------------|-----------|-----------|-----------| ## ## 10 データの異なる正規化 標準正規化を行い同じ条件で分類してみる. # 全数値 feature(3 列目以降)に scale() を適用 wdbc.z <- as.data.frame(scale(wdbc[, 3:ncol(wdbc)])) # ID と診断結果の 2 列を結合 wdbc.z <- cbind(wdbc[, 1:2], wdbc.z) # 先程と同じインデックスでデータを分割 train.data <- wdbc.z[train.index, ] test.data <- wdbc.z[test.index, ] # 学習と分類予測 knn.db <- knn.calc(test.data[, -1:-2], train.data[, -1:-2]) predicted <- knn.pred(knn.db, train.label=train.data[, 2], k=3) # 結果の表示 CrossTable(x=test.data[,2], y=predicted, prop.chisq=FALSE) ## ## ## Cell Contents ## |-------------------------| ## | N | ## | N / Row Total | ## | N / Col Total | ## | N / Table Total | ## |-------------------------| ## ## ## Total Observations in Table: 171 ## ## ## | predicted ## test.data[, 2] | B | M | Row Total | ## ---------------|-----------|-----------|-----------| ## B | 113 | 0 | 113 | ## | 1.000 | 0.000 | 0.661 | ## | 0.966 | 0.000 | | 西南学院大学 演習 I 9 担当 市東 亘
  • 10. 第 3 章 遅延学習—最近傍法を使った分類 ## | 0.661 | 0.000 | | ## ---------------|-----------|-----------|-----------| ## M | 4 | 54 | 58 | ## | 0.069 | 0.931 | 0.339 | ## | 0.034 | 1.000 | | ## | 0.023 | 0.316 | | ## ---------------|-----------|-----------|-----------| ## Column Total | 117 | 54 | 171 | ## | 0.684 | 0.316 | | ## ---------------|-----------|-----------|-----------| ## ## 西南学院大学 演習 I 10 担当 市東 亘