Upgrade to Pro — share decks privately, control downloads, hide ads and more …

再考: お買い得物件を機械学習で見つける方法 / Rethink: Method to Fin...

再考: お買い得物件を機械学習で見つける方法 / Rethink: Method to Find Cheap Rental Houses by Machine Learning

Tokyo.R 78 回 応用セッション発表スライド
発表後修正版
ハイパーリンク多めなのでダウンロードして閲覧してください

発表時バージョン
https://www.slideshare.net/SatoshiKatagiri2/ss-152578475

S-Katagiri

June 29, 2019
Tweet

More Decks by S-Katagiri

Other Decks in Programming

Transcript

  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
  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
  3. 「マサカリ」を投げに来たわけではない Figure 1: Decapitation of Pedro I, public domain; Nicholas

    of Myla at the Council of Nicaea, public domain • 機械学習が何をしているのか, どうやったら活用できるの かを建設的に議論したい 4
  4. どうやって求めるか • shokosaka (2017), Morishita (2019) は不動産情報を特徴量 に, 賃料を目的変数にして機械学習を適用 •

    それぞれランダムフォレストと XGBoost • 賃料を目的変数 y, 物件情報による特徴量を x とおいて, 条 件付き確率を仮定 y ∼p(y | x) • x に対する平均的な y を条件付き期待値関数 y = µ(x) :=Ey | x • 機械学習で µ(x) を近似した予測モデル ˆ y = ˆ µ(x) を作り, 残差の大きいものが外れ値 = お買得物件 ri :=yi − ˆ µ(x) 7
  5. モデルが先か外れ値が先か • 外れ値検出は正常状態を数式で正確に表せるのが前提 • 数式は機械学習でデータに当てはめて求める • データの外れ値は機械学習の数式から判定する • 数式は機械学習でデータに当てはめて求める •

    データの外れ値は機械学習の数式から ・数式は機械学習でデータに当ては ・データの外れ値は機械学習の ・数式は機械学習でデータ ・データの外れ値は機械学 ・数式は機械学習でデ ・データの外れ値は機 ・数式は機械学習 ・データの外れ値 11
  6. ここまでのまとめ • 機械学習はデータの数値に当てはめているだけ • 単回帰でも XGBoost でも深層学習でも同じ • 交差検証 (CV)

    をやるのはそのため • 検証データにも未知の外れ値があるとどうしようもない • 正常値・外れ値のラベルがないまま予測残差を見ても仕方 がない • MSE・RMSE・MAE とにかく意味がない • 比較検証が難しい 12
  7. 補足: Morishita (2019) の方法 • 訓練データは物件を見つけたい地域以外の場所 • 訓練データを標準的な物件の情報とみなしていると明記し ている. •

    偏りによる共変量シフトを Importance Weight で補正 • 訓練データにも外れ値はある • 地域によって重点される特徴量は違う. 共変量シフトの前 提に疑問 13
  8. 代替手法 1: Quantile Regression Forest • Random forest はいくつもの決定木のアンサンブル学習 •

    R では ranger か randomForest パッケージで可能 (前者が おすすめ) • 簡単な解説は自分のブログ (ここ) とか • Meinshausen (2006) による qunatile regression forest • 平均ではなく分位点 (中央値) に合わせる • 分散の大きな外れ値ならこれで検知できる? • R では ranger または quantregForest パッケージで可能 16
  9. 代替手法 2: Gaussian Finite Mixture Model • ガウシアン有限混合回帰モデル • 複数の分布の合成でモデルを表現する.

    • データが K 個の分布のどれかから発生している: y = K ∑ k=1 πkµk(y | x) • 各個体が k のどの分布に属したかの確率を計算できる. • おおざっぱに言うと本質的にはクラスタリングと同じ •「無限」混合はいわゆるノンパラベイズ • flexmix パッケージで可能 • 使い方は Leisch (2004) 参照 • 日本語なら ここ の解説が実用的でくわしい 17
  10. 処理の流れ • ソース: 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
  11. I. 内容解説: スクレイピング (1/4) • fetch_data.R の部分 • shokosaka (2017)

    は Python なので rvest で書き直す • スクレイピングマナーや知財権には注意する. 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
  12. I. 内容解説: スクレイピング (2/4) • rvest は xml データ (木構造)

    をフィルタで抽出できる • タグ, 属性, CSS セレクタ, XML Path などを知っていれば 簡単 • %>% も使える • 以下の関数で tidyr, purrr も駆使して tibble に収める 1 build_wise_page_to_tb <- function(query_result){ 2 data_html <- query_result %>% html_nodes("div.cassetteitem") 3 casset_info <- data_html %>% html_nodes("div.cassetteitem-de 4 casset_items <- data_html %>% html_nodes("div.cassetteitem-i 5 tb <- tibble( 6 title=casset_info %>% 7 html_node("div.cassetteitem_content-title") %>% html_tex 8 rent_category=casset_info %>% 21
  13. I. 内容解説: スクレイピング (3/4) • これを suumo の検索結果ページから取得. • 取得したのは,

    物件名, 間取り, 専有面積, 家賃, 管理費, 階 数, 住所, 最寄り駅, 築年数など • 物件個別ページはスクレイピングしていない • ページ内から検索結果の全ページ数も取得 • これを 23 区それぞれの検索クエリ結果に対して実行 • 進捗がわかりづらいのでプログレスバーを使うと良い (pbarETA がおすすめ) 22
  14. 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
  15. II. 内容解説: 整然化 - tidying (2/2) • 間取りは L, D,

    K などそれぞれでダミー変数を立てる • 住所などテキストは feature hashing (hash tricking) で強制 的に多次元の数値列にする (FeatureHashing が便利) • スコア勝負じゃないのでこの辺は手抜き 25
  16. III. 内容解説: 予測モデル作成 (1/4) • mlr, mlrCPO を使う • mlr

    の日本語の解説は以下を参照 • @nozma によるチュートリアル翻訳 + 補足説明 •『mlr パッケージチュートリアル - Quick Walkthrough 編』 •『R の機械学習パッケージ mlr のチュートリアル 3 (ベンチマ ーク試験から可視化まで)』 • kanamichi による『mlr チュートリアルの写経(その 1) 』 (2015 年) • 『モデルを跨いでデータを見たい』(第 76 回 Tokyo.R) 26
  17. 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
  18. III. 内容解説: 予測モデル作成 (3/4) • 登録されていないものは自作するしかない (resgist_mlr_learners.R の部分). • 今回は

    flexmix も renger (quantreg バージョン) も登録さ れていなかった. • 以下を見れば作り方はだいたいわかる (たぶん) •『Integrating Another Learner』 • XGBoost の登録例 28
  19. III. 内容解説: 予測モデル作成 (4/4) • mlrCPO (Composable Preprocessing Operators for

    MLR) は 名前通り前処理関係の機能を強化する • 前処理クラスは mlr にもあるけど数が少ない • cpoScale() %>>% makeLearner() のように %>>% で learner オブジェクトに前処理フローを付加できる • scikit-learn の PipeLine っぽい • ただしこちらもそこまで種類は豊富ではない tidyverse だけ でいいんじゃね? • 目的変数を変換して, predict() 時に逆変換する cpoLogTrafoRegr() は便利 • さあいくぞ 29
  20. 敗因分析 • 単純に作業量が多い • 未知の分野の先行研究の調査, モデリング, 検証を全部やろ うとした • モデリングまでの作業でどのパッケージが使いやすいか比

    較しながら進めていた • caret と mlr と tidymodels + parsnip どれが使いやすいか とか • これを全部 // 1 /// 週/// 間/// でやろうとした 31
  21. 参考文献 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
  22. 参考文献 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 による実践 ガイド -』 ,コロナ社. 井出剛・杉山将 (2015) 『異常検知と変化検知』 ,講談社. 36