SlideShare uma empresa Scribd logo
1 de 45
K-最近傍法 資料
第1班
1
1班 資料
目次 15min
2
1.特徴量の削除 5min
2.データの整形 3min
3.マルチクラス分類 4min
4.最適なk 3min
塚本 特徴量の説明・ggplot2による
相関性 5分
3
1班 資料
1-1.特徴量の説明
<難しいフィーチャー一覧>
・Workclass:自営業、法人・非法人など職業形態
・fnlwgt:最終重量?(よくわからない)
・marital-status:結婚の状況
・relationship:その人の家族のなかでの役割(関係)
・the label:給与が50000ドルを超えるか超えないか。
4
これからこれらの特徴量の中からいらないもの
を削除する。
1班 資料
1-2特徴量を消す理由
<特徴量を消す理由>
・特徴量が多いと過学習が起こってしまう
・特徴量が多いと「次元の呪い」が起こってしまう
過学習とは…学習器がデータに過度に適合してしまうこ
と
次元の呪い…特徴量(次元の数)が増えると
指数関数的に必要なデータが増え、必要な計
算時間も増えてしまう
5
1班 資料
(参考)次元
の呪い画像
6
1班 資料
(参考)過学習の例1
7
(日常的な例)あるアルバイトだけを長年
続けてきた人はそのアルバイトの特定の仕
事やほかの従業員への接し方、挨拶の仕方
などに過度に適応した結果、バイト先を変
えたときに業種が違ったり社員の雰囲気が
違ったりすると適応しずらくなる。
1班 資料
(参考)過学習の例2
(機械学習的例)明日の天気を予測する分類器を訓練する。
8
明日の天気 (今日の)天
気
風向 湿度 県内のコロ
ナ感染者の
数
1 晴れ 晴れ 南 45% 1455
2 雨 雨 東 63% 1235
3 晴れ 晴れ 南 55% 1402
4 晴れ 晴れ 北 70% 1395
5 雨 晴れ 東 65% 1249
6 曇り 雨 西 70% 194
1班 資料
(参考)過学習の例2(続き)
この例だと分類器は次のようになる
・今日の天気:晴れ 風向:南もしくは北 湿度:45%、55%、70%
コロナ感染者:1395,1402,1455に近いインスタンス
→「晴れ」に分類
・今日の天気:晴れもしくは雨 風向:東 湿度:63%もしくは65%
コロナ感染者:1235,1249に近いインスタンス
→「雨」に分類
・今日の天気:雨 風向:西 湿度:70% コロナ感染者:194に近いイ
ンスタンス
→「曇り」に分類
9
※太文字部分は過学習の疑いがあるところ
1班 資料
1-3 特徴量を消す
具体的に消す特徴量は以下
・relationship
・capital-gain
・capital-loss
・fnlwgt
10
1班 資料
1-3.1 relationshipの削除
☆relationshipの削除
Salaryの列においてmarital.statusという特徴量とrelationshipの1対1の関係だから
(e.g.husband->married,Own-child->Never-married)冗長。
特徴量を無理に増やすと最初に述べた「次元の呪い」、「過学習」という点でよくない
ので消す。
11
1班 資料
1-3.1 relationshipの削除
12
> tapply(salary$marital.status, salary$relationship, table)
$Husband
Married-AF-spouse Married-civ-spouse
12 17737
$`Not-in-family`
Divorced Married-civ-spouse Married-spouse-absent
3267 21 296
Never-married Separated Widowed
6400 567 770
$`Own-child`
Divorced Married-AF-spouse Married-civ-spouse
409 1 129
Married-spouse-absent Never-married Separated Widowed
58 6089 126 24
# などなど
1班 資料
1-3.2 capital-gain・
capital-loss
☆capital-gain・capital-lossの
削除
Capital-gain・capital-lossの
データには0のデータが多いので
いらないデータ。
13
1班 資料
1-3.3 fnlwgtの削除
☆fnlwgtの削除
ネットでいろいろ探したが
Fnlwgt(final-weight)という最終重量
というなにかの重みづけのフィー
チャーということしかわからなかった。
グラフの縦軸は確率密度を表しており、
どのfnlwgtの値に対しても5万ドル以
上:½、5万ドルより少ない:1/2
たとえるならばコイン投げ。→あって
もなくてもいい特徴量だから消す。
14
1班 資料
特徴量の削除
15
salary.c <- salary[,-c(3, 8, 11, 12)]
#fnlwgtとrelationshipとcapital.gain capital.lossを削除
遠藤 データの整形 3分
16
1班 資料
データの整形
17
カテゴリ 数値ではないのでこのままだと距離が出せない
空白
視覚的にはどんな空白かわからない
・””
・” ”
どちらもありうる。(次へ)
1班 資料
データの整形
18
空白
levelsで表示するとどんな空白かわかる
ついでにNAなど変なデータがないかも確認
(ちなみに今回のデータはsum(is.na(データ))で0となった))
1班 資料
マルチクラス分類
黒板で説明
19
category <- c(2,3,5,6,7,8,10)
for(i in category){
for(j in levels(salary.c[, i])[-1]){
salary.c[, paste(colnames(salary.c)[i], j, sep = "-")] <- salary.c[, i] == j
}
}
salary.c <- salary.c[,-category]
塚本 マルチクラス分類 2分
20
1班 資料
マルチクラス問題の疑問
マルチクラス分類について一つ問題がある。
特徴量に男性、中性、女性があり、マルチクラス分類するとそれ
ぞれのクラス同士の距離が等しくなっていない
21
√2
√2
√2
男性
女性
中性
男性
女性
1
1
√2
中性
参照クラス
1班 資料
マルチクラス問題の疑問
右の図だと男性、女性、中性の距離が等しくない
男性は中性に近いが女性から遠いというようなへんなバイアスを
かけてしまっている
左図だとそれがなくそれぞれが一定の距離にある
Q.どちらが正しいのか?
22
久保田 最適なkと処理の高速化
3分
23
1班 資料
最適なKを選ぶ
目的
最適なkは、 𝑵でいいのか。
24
1班 資料
最適なKを選ぶ
• 問題点
• 時間がかかりすぎる問題
• knn(k = all)
• 理論時間
• 54.64*32,968
• =1,801,371sec
• =500時間 (21日)
(※ノートPCなら916時間-38日)
25
1班 資料
使用するマシン
OS: Windows 10
CPU: 3.60GHz
Intel Core i7 – 9700K (8コア 8スレット)
SSD: 4TB
HHD: 2TB
GPU: RTX2070 SUPER
( Intel UHD Graphics 630 )
メモリ: 32GB
26
1班 資料
KNNの高速化
インデックスを距離が近い
順に並べたdata.frame
を作成する
test_1 test_2 test_3
3070 4012 5011
27 15 27
15 10721 15
1678 98 4021
13 2012 307
5612 37 21
10720 10989 13
… … …
予測と実際を見比べて
評価関数のグラフ
を作成する
kを作業可能な量で無作為
抽出して、多数決表
を作成する(全探索はしない)
test_1 test_2 test_3
3070 4012 5011
27 15 27
15 10721 15
1678 98 4021
13 2012 307
5612 37 21
10720 10989 13
… … …
K = 6を使用
K = {6,13, 29, 93, 107...
1班 資料
①距離計算の高速化
28
インデックスを距離が近い
順に並べたdata.frame
を作成する
test_1 test_2 test_3
3070 4012 5011
27 15 27
15 10721 15
1678 98 4021
13 2012 307
5612 37 21
10720 10989 13
… … …
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))
}
tic()
knn.calc(salary.test[1:10, ], salary.train)
toc() #desk 1.85sec
forやlapplyなどの繰り返し関数を使う場合
理論値
1.85*10989 = 2033sec
→33分かかる計算になる
1班 資料
①距離計算の高速化
29
インデックスを距離が近い
順に並べたdata.frame
を作成する
test_1 test_2 test_3
3070 4012 5011
27 15 27
15 10721 15
1678 98 4021
13 2012 307
5612 37 21
10720 10989 13
… … …
tic()
knn.db <- lapply(1:test.len, function(i)
sqrt(rowSums((train.mat - t(matrix(test.mat[i, ], nrow =
dim(salary.train)[2] , ncol = train.len)))^2))
)
knn.db <- lapply(knn.db, function(x) order(x))
knn.db <- data.frame(knn.db)
toc() #desk 311.99sec, note 798.52sec
改良の余地はあるが、マトリックス計算をすることで、それぞれの計算時間を
定数時間化 𝑇 𝑁 = 𝑂(1)とすることが可能になり、時間が6倍加速した。
実際には、𝑇 𝑖 ∗ 𝑗 = 𝑂 𝑖 ∗ 𝑗 → 𝑇 𝑖 ∗ 𝑗 = 𝑂 𝑖 (𝑖はtest. data, jは𝑡𝑟𝑎𝑖𝑛. 𝑑𝑎𝑡𝑎)
実質値
311.99sec
→5分 < 33分
しかし、knnが54secであるため、さらにあと6倍程度加速する必要があるようだ。
1班 資料
マトリックス計算
30
1班 資料
マトリックス計算
31
1班 資料
32
1班 資料
R(プログラム修正)とは、
マトリックス計算のこと
Rとは、for関数を使った
計算のこと
78倍の高速化を実現
33
1班 資料
マトリックス計算
34
1班 資料
②Kによる処理を高速化
35
kを作業可能な量で無作為
抽出して、多数決表
を作成する
test_1 test_2 test_3
3070 4012 5011
27 15 27
15 10721 15
1678 98 4021
13 2012 307
5612 37 21
10720 10989 13
… … …
K = 6を使用
K = {6,13, 29, 93, 107...
k.vec <- 1:dim(salary.train)[1]
stu <- round(1 + log2(dim(salary.train)[1]))
k.dat <- data.frame(matrix(k.vec[1:(round(dim(salary.train)[1]/stu)*stu)],
nrow = stu))
k.ran <- sapply(k.dat, function(x) x[sample(1:stu, 1)])
最適なKを探す前に、すべてのKで試行すれば、到底終わらない。
→そこで、Kを無作為抽出することとする。
評価関数を正規分布と仮定したとき、スタージェスの公式からKベクトルの
幅が16のときが最もきれいに書けると算出れたので、16ずつ無作為抽出し
ていくこととする。
1班 資料
Kベクトル
36
16の幅でベクトル化
32968より多いが、
ベクトル化するた
め、便宜上追加
1班 資料
Kベクトル
37
1班 資料
②K処理の高速化
38
knn.own <- function(data, test.labels, k, dev){
#warning
if(sum(k == 1) > 0) {
warning("you must not use 1 in k !")
return(NA)
}
if(length(k) %% dev > 0) {
warning("you must use a numeric which k can be devided evenly by in dev !")
return(NA)
}
#preparation
bin <- ifelse(data == "undr_50k", 1, 0)
bin.dev <- lapply(1:(dev-1), function(x) colSums(data.frame(bin[1:(k[length(k)/dev*x]-1), ])))
label <- matrix(ifelse(test.labels == "undr_50k", 1, 0), nrow = length(test.labels), ncol = length(k)/dev )
#k
f.round <- lapply(1:dev, function(x) data.frame(lapply((k)[(length(k)/dev*(x-1)+1):(length(k)/dev*x)] ,
function(y){ if(x == 1){round(colSums(bin[1:y, ]) / y)}
else {round((bin.dev[[x-1]] + colSums(bin[((k)[length(k)/dev*(x-1)]):y, ]))/y)}})))
#evaluation
f.output <- c()
for(i in 1:dev){
f.output <- c(f.output, colSums(f.round[[i]] == label) / dim(label)[1] )
}
names(f.output) <- paste("k = ",k , sep="")
#result
f.output
}
1班 資料
メモ化
39
1班 資料
②K処理の高速化
40
tic()
output <- knn.own(knn.labels, salary.test.labels, k = k.ran, dev = 10)
toc() #desk 113.91sec
一般的なKNN()関数で実行した場合、
理論値
31時間
knn.oun()関数で実行した場合、
実質値
131.91 + 311.99 = 443.9sec
112558.4/443.9 = 254倍加速した
1班 資料
knn.ownの処理の仕組み
41
過去を記憶してくれるので早い
1班 資料
knn.ownの処理の仕組み
42
1班 資料
③評価関数
tic()
output <- knn.own(knn.labels,
salary.test.labels, k = k.ran, dev
= 10)
toc() #desk 113.91sec
plot(x = k.ran, y = output,
type = "l")
names(output)[max(sapply(
output, function(x) x)) ==
as.numeric(output)]
#[1] "k = 170"
43
1班 資料
③評価関数
44
tic()
output2 <- knn.own(knn.labels,
salary.test.labels, k = 2:1000, dev =
3)
toc() #desk 16.86sec
plot(x = 2:1000, y =
output2, type = "l")
names(output2)[max(sapply
(output2, function(x) x)) ==
as.numeric(output2)]
#[1] "k = 166" "k = 170" "k = 172"
1班 資料
④最適なK
45
> names(output2)[max(sapply(output2, function(x) x)) ==
as.numeric(output2)]
[1] "k = 166" "k = 170" "k = 172“
> round(sqrt(dim(salary.train)[1]))
[1] 182
結果
1.大して変わらないので、K = N でもよい。
2.マトリックス処理は早い
3.工夫をこらせばより早くなる

Mais conteúdo relacionado

Mais procurados

第2回R勉強会1
第2回R勉強会1第2回R勉強会1
第2回R勉強会1
Paweł Rusin
 
不均衡データのクラス分類
不均衡データのクラス分類不均衡データのクラス分類
不均衡データのクラス分類
Shintaro Fukushima
 
Rで学ぶデータマイニングI 第8章〜第13章
Rで学ぶデータマイニングI 第8章〜第13章Rで学ぶデータマイニングI 第8章〜第13章
Rで学ぶデータマイニングI 第8章〜第13章
Prunus 1350
 

Mais procurados (20)

PATTERN RECOGNITION AND MACHINE LEARNING (1.1)
PATTERN RECOGNITION AND MACHINE LEARNING (1.1)PATTERN RECOGNITION AND MACHINE LEARNING (1.1)
PATTERN RECOGNITION AND MACHINE LEARNING (1.1)
 
実践多クラス分類 Kaggle Ottoから学んだこと
実践多クラス分類 Kaggle Ottoから学んだこと実践多クラス分類 Kaggle Ottoから学んだこと
実践多クラス分類 Kaggle Ottoから学んだこと
 
第2回R勉強会1
第2回R勉強会1第2回R勉強会1
第2回R勉強会1
 
SGDによるDeepLearningの学習
SGDによるDeepLearningの学習SGDによるDeepLearningの学習
SGDによるDeepLearningの学習
 
不均衡データのクラス分類
不均衡データのクラス分類不均衡データのクラス分類
不均衡データのクラス分類
 
Ssaw08 1125
Ssaw08 1125Ssaw08 1125
Ssaw08 1125
 
PRML復々習レーン#7 前回までのあらすじ
PRML復々習レーン#7 前回までのあらすじPRML復々習レーン#7 前回までのあらすじ
PRML復々習レーン#7 前回までのあらすじ
 
Rによるデータサイエンス:12章「時系列」
Rによるデータサイエンス:12章「時系列」Rによるデータサイエンス:12章「時系列」
Rによるデータサイエンス:12章「時系列」
 
Learning Continuous Control Policies by Stochastic Value Gradients
Learning Continuous Control Policies by Stochastic Value GradientsLearning Continuous Control Policies by Stochastic Value Gradients
Learning Continuous Control Policies by Stochastic Value Gradients
 
SGD+α: 確率的勾配降下法の現在と未来
SGD+α: 確率的勾配降下法の現在と未来SGD+α: 確率的勾配降下法の現在と未来
SGD+α: 確率的勾配降下法の現在と未来
 
Rによるlm関数を使わない回帰と梃子比・cookの距離
Rによるlm関数を使わない回帰と梃子比・cookの距離 Rによるlm関数を使わない回帰と梃子比・cookの距離
Rによるlm関数を使わない回帰と梃子比・cookの距離
 
[Dl輪読会]introduction of reinforcement learning
[Dl輪読会]introduction of reinforcement learning[Dl輪読会]introduction of reinforcement learning
[Dl輪読会]introduction of reinforcement learning
 
Random Forest による分類
Random Forest による分類Random Forest による分類
Random Forest による分類
 
Sparse estimation tutorial 2014
Sparse estimation tutorial 2014Sparse estimation tutorial 2014
Sparse estimation tutorial 2014
 
PRML復々習レーン#9 前回までのあらすじ
PRML復々習レーン#9 前回までのあらすじPRML復々習レーン#9 前回までのあらすじ
PRML復々習レーン#9 前回までのあらすじ
 
Rで学ぶデータマイニングI 第8章〜第13章
Rで学ぶデータマイニングI 第8章〜第13章Rで学ぶデータマイニングI 第8章〜第13章
Rで学ぶデータマイニングI 第8章〜第13章
 
Feature Selection with R / in JP
Feature Selection with R / in JPFeature Selection with R / in JP
Feature Selection with R / in JP
 
最近傍探索と直積量子化(Nearest neighbor search and Product Quantization)
最近傍探索と直積量子化(Nearest neighbor search and Product Quantization)最近傍探索と直積量子化(Nearest neighbor search and Product Quantization)
最近傍探索と直積量子化(Nearest neighbor search and Product Quantization)
 
RBMを応用した事前学習とDNN学習
RBMを応用した事前学習とDNN学習RBMを応用した事前学習とDNN学習
RBMを応用した事前学習とDNN学習
 
PRML4.3.3
PRML4.3.3PRML4.3.3
PRML4.3.3
 

Semelhante a Knn発表資料(R)

パターン認識 08 09 k-近傍法 lvq
パターン認識 08 09 k-近傍法 lvqパターン認識 08 09 k-近傍法 lvq
パターン認識 08 09 k-近傍法 lvq
sleipnir002
 
パターン認識第9章 学習ベクトル量子化
パターン認識第9章 学習ベクトル量子化パターン認識第9章 学習ベクトル量子化
パターン認識第9章 学習ベクトル量子化
Miyoshi Yuya
 

Semelhante a Knn発表資料(R) (20)

第9回 大規模データを用いたデータフレーム操作実習(3)
第9回 大規模データを用いたデータフレーム操作実習(3)第9回 大規模データを用いたデータフレーム操作実習(3)
第9回 大規模データを用いたデータフレーム操作実習(3)
 
[機械学習]文章のクラス分類
[機械学習]文章のクラス分類[機械学習]文章のクラス分類
[機械学習]文章のクラス分類
 
PostgreSQL SQLチューニング入門 実践編(pgcon14j)
PostgreSQL SQLチューニング入門 実践編(pgcon14j)PostgreSQL SQLチューニング入門 実践編(pgcon14j)
PostgreSQL SQLチューニング入門 実践編(pgcon14j)
 
Rによる繰り返しの並列処理
Rによる繰り返しの並列処理Rによる繰り返しの並列処理
Rによる繰り返しの並列処理
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
 
パターン認識 08 09 k-近傍法 lvq
パターン認識 08 09 k-近傍法 lvqパターン認識 08 09 k-近傍法 lvq
パターン認識 08 09 k-近傍法 lvq
 
東京都市大学 データ解析入門 10 ニューラルネットワークと深層学習 1
東京都市大学 データ解析入門 10 ニューラルネットワークと深層学習 1東京都市大学 データ解析入門 10 ニューラルネットワークと深層学習 1
東京都市大学 データ解析入門 10 ニューラルネットワークと深層学習 1
 
凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜
凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜
凸最適化 〜 双対定理とソルバーCVXPYの紹介 〜
 
各言語の k-means 比較
各言語の k-means 比較各言語の k-means 比較
各言語の k-means 比較
 
東京都市大学 データ解析入門 6 回帰分析とモデル選択 1
東京都市大学 データ解析入門 6 回帰分析とモデル選択 1東京都市大学 データ解析入門 6 回帰分析とモデル選択 1
東京都市大学 データ解析入門 6 回帰分析とモデル選択 1
 
20190625 OpenACC 講習会 第3部
20190625 OpenACC 講習会 第3部20190625 OpenACC 講習会 第3部
20190625 OpenACC 講習会 第3部
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2
 
機械学習 / Deep Learning 大全 (2) Deep Learning 基礎編
機械学習 / Deep Learning 大全 (2) Deep Learning 基礎編機械学習 / Deep Learning 大全 (2) Deep Learning 基礎編
機械学習 / Deep Learning 大全 (2) Deep Learning 基礎編
 
パターン認識第9章 学習ベクトル量子化
パターン認識第9章 学習ベクトル量子化パターン認識第9章 学習ベクトル量子化
パターン認識第9章 学習ベクトル量子化
 
Casual learning machine learning with_excel_no5
Casual learning machine learning with_excel_no5Casual learning machine learning with_excel_no5
Casual learning machine learning with_excel_no5
 
PRML 4.1 Discriminant Function
PRML 4.1 Discriminant FunctionPRML 4.1 Discriminant Function
PRML 4.1 Discriminant Function
 
10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!10のJava9で変わるJava8の嫌なとこ!
10のJava9で変わるJava8の嫌なとこ!
 
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
 
機械学習
機械学習機械学習
機械学習
 
TensorflowとKerasによる深層学習のプログラム実装実践講座
TensorflowとKerasによる深層学習のプログラム実装実践講座TensorflowとKerasによる深層学習のプログラム実装実践講座
TensorflowとKerasによる深層学習のプログラム実装実践講座
 

Knn発表資料(R)