SlideShare uma empresa Scribd logo
1 de 36
Baixar para ler offline
再考: お買い得物件を機械学習で見つける方法
@ill-identified
2019/6/29
1
自己紹介
• Twitter: @ill_identified
• ブログ: http://ill-identified.hatenablog.com/
• LinkedIn: https:
//www.linkedin.com/in/satoshi-katagiri/
• Twitter: https://twitter.com/ill_Identified
• github: https://github.com/Gedevan-Aleksizde
• 現在の勤務先: Web 広告の会社
2
イントロダクション
• Morishita (2019) https://speakerdeck.com/
morishita/rdeomai-ide-wu-jian-wotan-se
(Tokyo.R 77 回)
• shokosaka (2017) (個人ブログ) http://www.
analyze-world.com/entry/2017/11/09/061023
• 本当に機械学習でお買い得物件を求められるのか?
3
「マサカリ」を投げに来たわけではない
Figure 1: Decapitation of Pedro I, public domain; Nicholas of Myla at the Council of
Nicaea, public domain
• 機械学習が何をしているのか, どうやったら活用できるの
かを建設的に議論したい
4
異常検知の教科書
• 今回は異常検知 (anomaly detection) のなかでも, 特に外れ
値検出 (outlier detection) 分野の話
5
そもそも何がお買い得物件?
• 家賃が高いよりも安いほうがいい
• ただし留保条件もある
• 広さはどれくらい
• トイレと風呂は, ガスコンロはあるか, 電気調理器はあるか,
• 条件を満たすもののなかで, なるべく安いものが欲しい
6
どうやって求めるか
• 冒頭の 2 人は不動産情報を特徴量に, 賃料を目的変数にし
て機械学習を適用
• それぞれランダムフォレストと XGBoost
• 賃料を目的変数 y, 物件情報による特徴量を x とおいて, 条
件付き確率を仮定
y ∼p(y | x)
• x に対する平均的な y を条件付き期待値関数
y = µ(x) :=Ey | x
• 機械学習で µ(x) を近似した予測モデル ˆy = ˆµ(x) を作り,
残差の大きいものが外れ値 = お買得物件
ri :=yi − ˆµ(x)
7
本当に?
本当に?
8
機械学習のしくみ再考
• 線形・3 次関数 + ノイズの疑似データ作成
9
単回帰と決定木で当てはめる
• 単回帰/3 次多項式回帰と決定木 (ランダムフォレスト) で
当てはめる.
• ノイズがあるのでどうやっても一致しない
• ノイズのなかのどれが外れ値なのかわからない
10
モデルが先か外れ値が先か
• 外れ値検出は正常状態を数式で正確に表せるのが前提
• 数式は機械学習でデータに当てはめて求める
• データの外れ値は機械学習の数式から判定する
• 数式は機械学習でデータに当てはめて求める
• データの外れ値は機械学習の数式から
・数式は機械学習でデータに当ては
・データの外れ値は機械学習の
・数式は機械学習でデータ
・データの外れ値は機械学
・数式は機械学習でデ
・データの外れ値は機
・数式は機械学習
・データの外れ値
11
ここまでのまとめ
• 機械学習はデータの数値に当てはめているだけ
• 単回帰でも XGBoost でも深層学習でも同じ
• 交差検証 (CV) をやるのはそのため
• 検証データにも未知の外れ値があるとどうしようもない
• 正常値・外れ値のラベルがないまま予測残差を見ても仕方
がない
• MSE・RMSE・MAE とにかく意味がない
• 比較検証が難しい
12
補足: Morishita (2019) の方法
• 訓練データは物件を見つけたい地域以外の場所
• 訓練データを標準的な物件の情報とみなしていると明記し
ている.
• 偏りによる共変量シフトを Importance Weight で補正
• 訓練データにも外れ値はある
• 地域によって重点される特徴量は違う. 共変量シフトの前
提に疑問
13
論点
• もっと正確にお買得物件を見つける方法はないか?
• 個人にとって実用的なものか?
• 不動産情報サイトにとって実用的か?
• 検証方法はどうすべきか?
14
代替手法
•「データだけドリブン」でやっても無理
• お買得物件に対する何らかの「仮説」がないと動けない
• 以下の 2 通りを考えた
1. 偏差の大きなものを外れ値と考える
2. 正常値と外れ値が異なる分布に従うと考える
15
代替手法 1: Quantile Regression Forest
• Random forest はいくつもの決定木のアンサンブル学習
• R では ranger か randomForest パッケージで可能 (前
者がおすすめ)
• 簡単な解説は自分のブログ (ここ) とか
• Meinshausen (2006) による qunatile regression forest
• 平均ではなく分位点 (中央値) に合わせる
• 分散の大きな外れ値ならこれで検知できる?
• R では ranger または quantregForest パッケージ
で可能
16
代替手法 2: Gaussian Finite Mixture Model
• ガウシアン有限混合回帰モデル
• 複数の分布の合成でモデルを表現する.
• データが K 個の分布のどれかから発生している:
y =
K∑
k=1
πkµk(y | x)
• 各個体が k のどの分布に属したかの確率を計算できる.
• おおざっぱに言うと本質的にはクラスタリングと同じ
•「無限」混合はいわゆるノンパラベイズ
• flexmix パッケージで可能
• 使い方は Leisch (2004) 参照
• 日本語なら ここ の解説が実用的でくわしい
17
どう検証するか
• 正例/負例のラベルがない
• 定量的な評価のしようがない
• 疑似データを作るか
• 生データと違う分布. 実用的ではない
• 苦肉の策
• 生データの一部を修正した疑似データを検出できるか判
定する
18
処理の流れ
• ソース: https://github.com/Gedevan-Aleksizde/
20190615_bargain_detect
1. スクレイピング: rvest で suumo.jp からスクレイピング
2. 整然化 (tidying): tidyverse で整形
3. 予測モデル作成: mlr, mlrCPO で前処理 & 学習のフロ
ー作成
3.1 quantile regression forest
3.2 gaussian mixture model
4. 疑似データを外挿して評価
19
I. 内容解説: スクレイピング (1/4)
• fetch_data.R の部分
• shokosaka, 2017 は Python なので rvest で書き直す
• robots.txt も確認
1 install.packages(
2 setdiff("pacman", installed.packages())
3 )
4 pacman::p_load(
5 tidyverse,
6 robotstxt,
7 rvest,
8 stringr
9 )
10 pacman::p_load_gh("franapoli/pbarETA")
20
I. 内容解説: スクレイピング (2/4)
• rvest は xml データ (木構造) をフィルタで抽出できる
• タグ, 属性, CSS セレクタ, XML Path などを知っていれば
簡単
• %>% も使える
• 以下の関数で tidyr, purrr も駆使して tibble に収める
1 build_wise_page_to_tb <- function(query_result){
2 # 「建物ごと表示」の結果を tibble にする. 部屋情報は入れ子
3 data_html <- query_result %>% html_nodes("div.cass
4 casset_info <- data_html %>% html_nodes("div.casse
5 casset_items <- data_html %>% html_nodes("div.cass
6 parse_items_to_tb <- function(casset_items){
7
8 }
9 tb <- tibble( 21
I. 内容解説: スクレイピング (3/4)
• これを suumo の検索結果ページから取得.
• 取得したのは, 物件名, 間取り, 専有面積, 家賃, 管理費, 階
数, 住所, 最寄り駅, 築年数など
• 物件個別ページはスクレイピングしていない
• ページ内から検索結果の全ページ数も取得
• これを 23 区それぞれの検索クエリ結果に対して実行
• 進捗がわかりづらいのでプログレスバーを使うと良い
(pbarETA がおすすめ)
22
I. 内容解説: スクレイピング (4/4)
Figure 2: スクレイピングしたデータ
Figure 3: 入れ子部分の部屋別情報
23
II. 内容解説: 整然化 - tidying (1/2)
• modeling.R の前半部分
• スクレイピングの処理で結構整形してしまったのであまり
やることがない
• 本来は分けて書くほうがのちのちの改修で楽
• 整然化というより特徴量抽出の話
• 数値は「X.X 万円」「X 階」のような文字列で表されている
ので数値を取り出す (stringi, stringr が便利)
• 階数はたまに地下 1 階とかあるので, cut() 関数で細かく
離散化
1 cut(floor_int, breaks=c(-Inf, 1, 2, 4, ..., Inf))
24
II. 内容解説: 整然化 - tidying (2/2)
• 間取りは L, D, K などそれぞれでダミー変数を立てる
• 住所などテキストは feature hashing (hash tricking) で強制
的に多次元の数値列にする (FeatureHashing が便利)
• スコア勝負じゃないのでこの辺は手抜き
25
III. 内容解説: 予測モデル作成 (1/4)
• mlr, mlrCPO を使う
• mlr の日本語の解説は以下を参照
• @nozma によるチュートリアル翻訳 + 補足説明
•『mlr パッケージチュートリアル - Quick Walkthrough 編』
•『R の機械学習パッケージ mlr のチュートリアル 3 (ベンチマ
ーク試験から可視化まで)』
• kanamichi による『mlr チュートリアルの写経(その 1)』
(2015 年)
• 『モデルを跨いでデータを見たい』(第 76 回 Tokyo.R)
26
III. 内容解説: 予測モデル作成 (2/4)
• mlr では
1. データフレームと目的変数情報をタスク (task) オブジェ
クトとして作成 tsk <- makeRegrTask( id="hoge",
data=df, target="rent_price")
2. 学習器オブジェクト (learner) を作成
(listLearners() で使用できるものを一覧できる)
3. MODEL <- train(LEARNER, TASK) で学習結果を得る.
4. predict(MODEL, [DATA/TASK]) で予測値出力
27
III. 内容解説: 予測モデル作成 (3/4)
• 登録されていないものは自作するしかない
(resgist_mlr_learners.R の部分).
• 今回は flexmix も renger (quantreg バージョン) も登録
されていなかった.
• 以下を見れば作り方はだいたいわかる (たぶん)
•『Integrating Another Learner』
• XGBoost の登録例
28
III. 内容解説: 予測モデル作成 (4/4)
• mlrCPO (Composable Preprocessing Operators for MLR)
は名前通り前処理関係の機能を強化する
• 前処理クラスは mlr にもあるけど数が少ない
• cpoScale() %>>% makeLearner() のように %>>% で
learner オブジェクトに前処理フローを付加できる
• scikit-learn の PipeLine っぽい
• ただしこちらもそこまで種類は豊富ではない tidyverse だけ
でいいんじゃね?
• 目的変数を変換して, predict() 時に逆変換する
cpoLogTrafoRegr() は便利
• さあいくぞ
29
しかしここでタイムアップ
• 結果までまとめきれませんでした…
30
敗因分析
• 単純に作業量が多い
• 未知の分野の先行研究の調査, モデリング, 検証を全部やろ
うとした
• モデリングまでの作業でどのパッケージが使いやすいか比
較しながら進めていた
• caret と mlr と tidymodels + parsnip どれが使いや
すいかとか
• これを全部 //1 ///週///間///でやろうとした
31
いかがでしたか?
• いかがでしたか? お買得物件を正確に発見する方法を調べ
てみましたが残念ながらよく分かりませんでした!
• ill_identified 先生の今後の挽回に期待ですね!
32
次は時間内に終わる手堅いテーマを選ぶので許してください.
Figure 4: Saint Peter of Verona, by Vecchietta, public domain
33
今回のまとめ
• 教師のない教師あり機械学習が行き場を見失う
• 予測モデルの適切な評価をして使おう
• tidyverse, mlr, mlrCPO あたりを組み合わせるととて
も便利
• 研究は計画的に
34
参考文献 i
Aggarwal, Charu C. (2017) Outlier Analysis, Cham: Springer
International Publishing, DOI: 10.1007/978-3-319-47578-3,
DOI: 10.1007/978-3-319-47578-3.
Chandola, Varun, Arindam Banerjee, and Vipin Kumar (2009)
“Anomaly Detection: A Survey,” ACM Computing Surveys,
Vol. 41, No. 3, pp. 1-58, July, DOI:
10.1145/1541880.1541882.
Leisch, Friedrich (2004) “FlexMix: A General Framework for
Finite Mixture Models and Latent Class Regression in R,”
Journal of Statistical Software, Vol. 11, No. 8, DOI:
10.18637/jss.v011.i08.
35
参考文献 ii
Meinshausen, Nicolai (2006) “Quantile Regression Forests,”
Journal of Machine Learning Research, Vol. 7, pp. 983-999.
Morishita, Gota (2019) 「R でお買い得物件を探せ」,4 月.
shokosaka (2017) 「機械学習を使って東京 23 区のお買い得賃
貸物件を探してみた」,11 月.
井出剛 (2015) 『入門機械学習による異常検知 - R による実践
ガイド -』,コロナ社.
36

Mais conteúdo relacionado

Semelhante a 再考: お買い得物件を機械学習で見つける方法

EmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とEmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とToru Takahashi
 
チームトポロジーから学び、 データプラットフォーム組織を考え直した話.pptx
チームトポロジーから学び、 データプラットフォーム組織を考え直した話.pptxチームトポロジーから学び、 データプラットフォーム組織を考え直した話.pptx
チームトポロジーから学び、 データプラットフォーム組織を考え直した話.pptxRakuten Commerce Tech (Rakuten Group, Inc.)
 
SageMaker Neoの可能性について - 第3回 Amazon SageMaker 事例祭り+体験ハンズオン
SageMaker Neoの可能性について- 第3回 Amazon SageMaker 事例祭り+体験ハンズオンSageMaker Neoの可能性について- 第3回 Amazon SageMaker 事例祭り+体験ハンズオン
SageMaker Neoの可能性について - 第3回 Amazon SageMaker 事例祭り+体験ハンズオンtomohiro kato
 
Hyper → Highspeed → Development
Hyper → Highspeed → DevelopmentHyper → Highspeed → Development
Hyper → Highspeed → Developmentaktsk
 
データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回Naoyuki Yamada
 
Why dont you_create_new_spark_jl
Why dont you_create_new_spark_jlWhy dont you_create_new_spark_jl
Why dont you_create_new_spark_jlShintaro Fukushima
 
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3 データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3 Hiroshi Ito
 
ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド
 ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド
ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイドEtsuji Nakai
 
Chainerで学ぶdeep learning
Chainerで学ぶdeep learningChainerで学ぶdeep learning
Chainerで学ぶdeep learningRetrieva inc.
 
この Visualization がすごい2014 〜データ世界を彩るツール6選〜
この Visualization がすごい2014 〜データ世界を彩るツール6選〜この Visualization がすごい2014 〜データ世界を彩るツール6選〜
この Visualization がすごい2014 〜データ世界を彩るツール6選〜Takahiro Inoue
 
(beta)アプリを成長させるためのログ取りとログ解析に必要なこと
(beta)アプリを成長させるためのログ取りとログ解析に必要なこと(beta)アプリを成長させるためのログ取りとログ解析に必要なこと
(beta)アプリを成長させるためのログ取りとログ解析に必要なことTakao Sumitomo
 
Django Rest Frameworkでお手軽にREST APIを作る
Django Rest Frameworkでお手軽にREST APIを作るDjango Rest Frameworkでお手軽にREST APIを作る
Django Rest Frameworkでお手軽にREST APIを作るMatsuo Keita
 
勉強会 Cvml python基礎
勉強会 Cvml python基礎勉強会 Cvml python基礎
勉強会 Cvml python基礎真哉 杉野
 
[DLHacks LT] PytorchのDataLoader -torchtextのソースコードを読んでみた-
[DLHacks LT] PytorchのDataLoader -torchtextのソースコードを読んでみた-[DLHacks LT] PytorchのDataLoader -torchtextのソースコードを読んでみた-
[DLHacks LT] PytorchのDataLoader -torchtextのソースコードを読んでみた-Deep Learning JP
 
asm.jsとWebAssemblyって実際なんなの?
asm.jsとWebAssemblyって実際なんなの?asm.jsとWebAssemblyって実際なんなの?
asm.jsとWebAssemblyって実際なんなの?Yosuke Onoue
 
scala+liftで遊ぼう
scala+liftで遊ぼうscala+liftで遊ぼう
scala+liftで遊ぼうyouku
 
JSAI's AI Tool Introduction - Deep Learning, Pylearn2 and Torch7
JSAI's AI Tool Introduction - Deep Learning, Pylearn2 and Torch7JSAI's AI Tool Introduction - Deep Learning, Pylearn2 and Torch7
JSAI's AI Tool Introduction - Deep Learning, Pylearn2 and Torch7Kotaro Nakayama
 

Semelhante a 再考: お買い得物件を機械学習で見つける方法 (20)

EmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とEmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤と
 
チームトポロジーから学び、 データプラットフォーム組織を考え直した話.pptx
チームトポロジーから学び、 データプラットフォーム組織を考え直した話.pptxチームトポロジーから学び、 データプラットフォーム組織を考え直した話.pptx
チームトポロジーから学び、 データプラットフォーム組織を考え直した話.pptx
 
SageMaker Neoの可能性について - 第3回 Amazon SageMaker 事例祭り+体験ハンズオン
SageMaker Neoの可能性について- 第3回 Amazon SageMaker 事例祭り+体験ハンズオンSageMaker Neoの可能性について- 第3回 Amazon SageMaker 事例祭り+体験ハンズオン
SageMaker Neoの可能性について - 第3回 Amazon SageMaker 事例祭り+体験ハンズオン
 
JAWS DAYS 2022
JAWS DAYS 2022JAWS DAYS 2022
JAWS DAYS 2022
 
Hyper → Highspeed → Development
Hyper → Highspeed → DevelopmentHyper → Highspeed → Development
Hyper → Highspeed → Development
 
データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回
 
Why dont you_create_new_spark_jl
Why dont you_create_new_spark_jlWhy dont you_create_new_spark_jl
Why dont you_create_new_spark_jl
 
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3 データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
 
ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド
 ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド
ソフトウェアエンジニアのための「機械学習理論」入門・ハンズオン演習ガイド
 
Chainerで学ぶdeep learning
Chainerで学ぶdeep learningChainerで学ぶdeep learning
Chainerで学ぶdeep learning
 
この Visualization がすごい2014 〜データ世界を彩るツール6選〜
この Visualization がすごい2014 〜データ世界を彩るツール6選〜この Visualization がすごい2014 〜データ世界を彩るツール6選〜
この Visualization がすごい2014 〜データ世界を彩るツール6選〜
 
(beta)アプリを成長させるためのログ取りとログ解析に必要なこと
(beta)アプリを成長させるためのログ取りとログ解析に必要なこと(beta)アプリを成長させるためのログ取りとログ解析に必要なこと
(beta)アプリを成長させるためのログ取りとログ解析に必要なこと
 
Django Rest Frameworkでお手軽にREST APIを作る
Django Rest Frameworkでお手軽にREST APIを作るDjango Rest Frameworkでお手軽にREST APIを作る
Django Rest Frameworkでお手軽にREST APIを作る
 
ゼロから作るDeepLearning 4章 輪読
ゼロから作るDeepLearning 4章 輪読ゼロから作るDeepLearning 4章 輪読
ゼロから作るDeepLearning 4章 輪読
 
勉強会 Cvml python基礎
勉強会 Cvml python基礎勉強会 Cvml python基礎
勉強会 Cvml python基礎
 
[DLHacks LT] PytorchのDataLoader -torchtextのソースコードを読んでみた-
[DLHacks LT] PytorchのDataLoader -torchtextのソースコードを読んでみた-[DLHacks LT] PytorchのDataLoader -torchtextのソースコードを読んでみた-
[DLHacks LT] PytorchのDataLoader -torchtextのソースコードを読んでみた-
 
気ままに勉強会 第30回 Google Apps Scriptやってる鰹🐟の初めてのPower Apps
気ままに勉強会 第30回 Google Apps Scriptやってる鰹🐟の初めてのPower Apps気ままに勉強会 第30回 Google Apps Scriptやってる鰹🐟の初めてのPower Apps
気ままに勉強会 第30回 Google Apps Scriptやってる鰹🐟の初めてのPower Apps
 
asm.jsとWebAssemblyって実際なんなの?
asm.jsとWebAssemblyって実際なんなの?asm.jsとWebAssemblyって実際なんなの?
asm.jsとWebAssemblyって実際なんなの?
 
scala+liftで遊ぼう
scala+liftで遊ぼうscala+liftで遊ぼう
scala+liftで遊ぼう
 
JSAI's AI Tool Introduction - Deep Learning, Pylearn2 and Torch7
JSAI's AI Tool Introduction - Deep Learning, Pylearn2 and Torch7JSAI's AI Tool Introduction - Deep Learning, Pylearn2 and Torch7
JSAI's AI Tool Introduction - Deep Learning, Pylearn2 and Torch7
 

再考: お買い得物件を機械学習で見つける方法

  • 2. 自己紹介 • Twitter: @ill_identified • ブログ: http://ill-identified.hatenablog.com/ • LinkedIn: https: //www.linkedin.com/in/satoshi-katagiri/ • Twitter: https://twitter.com/ill_Identified • github: https://github.com/Gedevan-Aleksizde • 現在の勤務先: Web 広告の会社 2
  • 3. イントロダクション • Morishita (2019) https://speakerdeck.com/ morishita/rdeomai-ide-wu-jian-wotan-se (Tokyo.R 77 回) • shokosaka (2017) (個人ブログ) http://www. analyze-world.com/entry/2017/11/09/061023 • 本当に機械学習でお買い得物件を求められるのか? 3
  • 4. 「マサカリ」を投げに来たわけではない Figure 1: Decapitation of Pedro I, public domain; Nicholas of Myla at the Council of Nicaea, public domain • 機械学習が何をしているのか, どうやったら活用できるの かを建設的に議論したい 4
  • 5. 異常検知の教科書 • 今回は異常検知 (anomaly detection) のなかでも, 特に外れ 値検出 (outlier detection) 分野の話 5
  • 6. そもそも何がお買い得物件? • 家賃が高いよりも安いほうがいい • ただし留保条件もある • 広さはどれくらい • トイレと風呂は, ガスコンロはあるか, 電気調理器はあるか, • 条件を満たすもののなかで, なるべく安いものが欲しい 6
  • 7. どうやって求めるか • 冒頭の 2 人は不動産情報を特徴量に, 賃料を目的変数にし て機械学習を適用 • それぞれランダムフォレストと XGBoost • 賃料を目的変数 y, 物件情報による特徴量を x とおいて, 条 件付き確率を仮定 y ∼p(y | x) • x に対する平均的な y を条件付き期待値関数 y = µ(x) :=Ey | x • 機械学習で µ(x) を近似した予測モデル ˆy = ˆµ(x) を作り, 残差の大きいものが外れ値 = お買得物件 ri :=yi − ˆµ(x) 7
  • 9. 機械学習のしくみ再考 • 線形・3 次関数 + ノイズの疑似データ作成 9
  • 10. 単回帰と決定木で当てはめる • 単回帰/3 次多項式回帰と決定木 (ランダムフォレスト) で 当てはめる. • ノイズがあるのでどうやっても一致しない • ノイズのなかのどれが外れ値なのかわからない 10
  • 11. モデルが先か外れ値が先か • 外れ値検出は正常状態を数式で正確に表せるのが前提 • 数式は機械学習でデータに当てはめて求める • データの外れ値は機械学習の数式から判定する • 数式は機械学習でデータに当てはめて求める • データの外れ値は機械学習の数式から ・数式は機械学習でデータに当ては ・データの外れ値は機械学習の ・数式は機械学習でデータ ・データの外れ値は機械学 ・数式は機械学習でデ ・データの外れ値は機 ・数式は機械学習 ・データの外れ値 11
  • 12. ここまでのまとめ • 機械学習はデータの数値に当てはめているだけ • 単回帰でも XGBoost でも深層学習でも同じ • 交差検証 (CV) をやるのはそのため • 検証データにも未知の外れ値があるとどうしようもない • 正常値・外れ値のラベルがないまま予測残差を見ても仕方 がない • MSE・RMSE・MAE とにかく意味がない • 比較検証が難しい 12
  • 13. 補足: Morishita (2019) の方法 • 訓練データは物件を見つけたい地域以外の場所 • 訓練データを標準的な物件の情報とみなしていると明記し ている. • 偏りによる共変量シフトを Importance Weight で補正 • 訓練データにも外れ値はある • 地域によって重点される特徴量は違う. 共変量シフトの前 提に疑問 13
  • 14. 論点 • もっと正確にお買得物件を見つける方法はないか? • 個人にとって実用的なものか? • 不動産情報サイトにとって実用的か? • 検証方法はどうすべきか? 14
  • 15. 代替手法 •「データだけドリブン」でやっても無理 • お買得物件に対する何らかの「仮説」がないと動けない • 以下の 2 通りを考えた 1. 偏差の大きなものを外れ値と考える 2. 正常値と外れ値が異なる分布に従うと考える 15
  • 16. 代替手法 1: Quantile Regression Forest • Random forest はいくつもの決定木のアンサンブル学習 • R では ranger か randomForest パッケージで可能 (前 者がおすすめ) • 簡単な解説は自分のブログ (ここ) とか • Meinshausen (2006) による qunatile regression forest • 平均ではなく分位点 (中央値) に合わせる • 分散の大きな外れ値ならこれで検知できる? • R では ranger または quantregForest パッケージ で可能 16
  • 17. 代替手法 2: Gaussian Finite Mixture Model • ガウシアン有限混合回帰モデル • 複数の分布の合成でモデルを表現する. • データが K 個の分布のどれかから発生している: y = K∑ k=1 πkµk(y | x) • 各個体が k のどの分布に属したかの確率を計算できる. • おおざっぱに言うと本質的にはクラスタリングと同じ •「無限」混合はいわゆるノンパラベイズ • flexmix パッケージで可能 • 使い方は Leisch (2004) 参照 • 日本語なら ここ の解説が実用的でくわしい 17
  • 18. どう検証するか • 正例/負例のラベルがない • 定量的な評価のしようがない • 疑似データを作るか • 生データと違う分布. 実用的ではない • 苦肉の策 • 生データの一部を修正した疑似データを検出できるか判 定する 18
  • 19. 処理の流れ • ソース: https://github.com/Gedevan-Aleksizde/ 20190615_bargain_detect 1. スクレイピング: rvest で suumo.jp からスクレイピング 2. 整然化 (tidying): tidyverse で整形 3. 予測モデル作成: mlr, mlrCPO で前処理 & 学習のフロ ー作成 3.1 quantile regression forest 3.2 gaussian mixture model 4. 疑似データを外挿して評価 19
  • 20. I. 内容解説: スクレイピング (1/4) • fetch_data.R の部分 • shokosaka, 2017 は Python なので rvest で書き直す • robots.txt も確認 1 install.packages( 2 setdiff("pacman", installed.packages()) 3 ) 4 pacman::p_load( 5 tidyverse, 6 robotstxt, 7 rvest, 8 stringr 9 ) 10 pacman::p_load_gh("franapoli/pbarETA") 20
  • 21. I. 内容解説: スクレイピング (2/4) • rvest は xml データ (木構造) をフィルタで抽出できる • タグ, 属性, CSS セレクタ, XML Path などを知っていれば 簡単 • %>% も使える • 以下の関数で tidyr, purrr も駆使して tibble に収める 1 build_wise_page_to_tb <- function(query_result){ 2 # 「建物ごと表示」の結果を tibble にする. 部屋情報は入れ子 3 data_html <- query_result %>% html_nodes("div.cass 4 casset_info <- data_html %>% html_nodes("div.casse 5 casset_items <- data_html %>% html_nodes("div.cass 6 parse_items_to_tb <- function(casset_items){ 7 8 } 9 tb <- tibble( 21
  • 22. I. 内容解説: スクレイピング (3/4) • これを suumo の検索結果ページから取得. • 取得したのは, 物件名, 間取り, 専有面積, 家賃, 管理費, 階 数, 住所, 最寄り駅, 築年数など • 物件個別ページはスクレイピングしていない • ページ内から検索結果の全ページ数も取得 • これを 23 区それぞれの検索クエリ結果に対して実行 • 進捗がわかりづらいのでプログレスバーを使うと良い (pbarETA がおすすめ) 22
  • 23. I. 内容解説: スクレイピング (4/4) Figure 2: スクレイピングしたデータ Figure 3: 入れ子部分の部屋別情報 23
  • 24. II. 内容解説: 整然化 - tidying (1/2) • modeling.R の前半部分 • スクレイピングの処理で結構整形してしまったのであまり やることがない • 本来は分けて書くほうがのちのちの改修で楽 • 整然化というより特徴量抽出の話 • 数値は「X.X 万円」「X 階」のような文字列で表されている ので数値を取り出す (stringi, stringr が便利) • 階数はたまに地下 1 階とかあるので, cut() 関数で細かく 離散化 1 cut(floor_int, breaks=c(-Inf, 1, 2, 4, ..., Inf)) 24
  • 25. II. 内容解説: 整然化 - tidying (2/2) • 間取りは L, D, K などそれぞれでダミー変数を立てる • 住所などテキストは feature hashing (hash tricking) で強制 的に多次元の数値列にする (FeatureHashing が便利) • スコア勝負じゃないのでこの辺は手抜き 25
  • 26. III. 内容解説: 予測モデル作成 (1/4) • mlr, mlrCPO を使う • mlr の日本語の解説は以下を参照 • @nozma によるチュートリアル翻訳 + 補足説明 •『mlr パッケージチュートリアル - Quick Walkthrough 編』 •『R の機械学習パッケージ mlr のチュートリアル 3 (ベンチマ ーク試験から可視化まで)』 • kanamichi による『mlr チュートリアルの写経(その 1)』 (2015 年) • 『モデルを跨いでデータを見たい』(第 76 回 Tokyo.R) 26
  • 27. III. 内容解説: 予測モデル作成 (2/4) • mlr では 1. データフレームと目的変数情報をタスク (task) オブジェ クトとして作成 tsk <- makeRegrTask( id="hoge", data=df, target="rent_price") 2. 学習器オブジェクト (learner) を作成 (listLearners() で使用できるものを一覧できる) 3. MODEL <- train(LEARNER, TASK) で学習結果を得る. 4. predict(MODEL, [DATA/TASK]) で予測値出力 27
  • 28. III. 内容解説: 予測モデル作成 (3/4) • 登録されていないものは自作するしかない (resgist_mlr_learners.R の部分). • 今回は flexmix も renger (quantreg バージョン) も登録 されていなかった. • 以下を見れば作り方はだいたいわかる (たぶん) •『Integrating Another Learner』 • XGBoost の登録例 28
  • 29. III. 内容解説: 予測モデル作成 (4/4) • mlrCPO (Composable Preprocessing Operators for MLR) は名前通り前処理関係の機能を強化する • 前処理クラスは mlr にもあるけど数が少ない • cpoScale() %>>% makeLearner() のように %>>% で learner オブジェクトに前処理フローを付加できる • scikit-learn の PipeLine っぽい • ただしこちらもそこまで種類は豊富ではない tidyverse だけ でいいんじゃね? • 目的変数を変換して, predict() 時に逆変換する cpoLogTrafoRegr() は便利 • さあいくぞ 29
  • 31. 敗因分析 • 単純に作業量が多い • 未知の分野の先行研究の調査, モデリング, 検証を全部やろ うとした • モデリングまでの作業でどのパッケージが使いやすいか比 較しながら進めていた • caret と mlr と tidymodels + parsnip どれが使いや すいかとか • これを全部 //1 ///週///間///でやろうとした 31
  • 34. 今回のまとめ • 教師のない教師あり機械学習が行き場を見失う • 予測モデルの適切な評価をして使おう • tidyverse, mlr, mlrCPO あたりを組み合わせるととて も便利 • 研究は計画的に 34
  • 35. 参考文献 i Aggarwal, Charu C. (2017) Outlier Analysis, Cham: Springer International Publishing, DOI: 10.1007/978-3-319-47578-3, DOI: 10.1007/978-3-319-47578-3. Chandola, Varun, Arindam Banerjee, and Vipin Kumar (2009) “Anomaly Detection: A Survey,” ACM Computing Surveys, Vol. 41, No. 3, pp. 1-58, July, DOI: 10.1145/1541880.1541882. Leisch, Friedrich (2004) “FlexMix: A General Framework for Finite Mixture Models and Latent Class Regression in R,” Journal of Statistical Software, Vol. 11, No. 8, DOI: 10.18637/jss.v011.i08. 35
  • 36. 参考文献 ii Meinshausen, Nicolai (2006) “Quantile Regression Forests,” Journal of Machine Learning Research, Vol. 7, pp. 983-999. Morishita, Gota (2019) 「R でお買い得物件を探せ」,4 月. shokosaka (2017) 「機械学習を使って東京 23 区のお買い得賃 貸物件を探してみた」,11 月. 井出剛 (2015) 『入門機械学習による異常検知 - R による実践 ガイド -』,コロナ社. 36