class: center, middle, inverse, title-slide # データ分割 ## Part of 📖Data Preprocessing Cookbook 👨🍳 ### Uryu Shinya ###
uribo
u_ribo
### 2019-06-30 (updated: 2019-06-30) --- # 概要 - 予測モデルの性能を評価、過学習を防ぐためにデータ分割の処理が必要となる - データセットをモデル構築用と評価用のデータに分ける - データセットの大きさ、特性(クラスやグループが存在するか、時系列かどうか)に応じてリサンプリングの方法を変える - モデル構築用のデータに評価用のデータの情報が漏洩してはいけない(過学習へと繋がる) - リサンプリングのたびにデータセットへの操作を行う --- # データ分割 - 手元のデータからモデルの性能を評価するためのアプローチ - **モデル構築**と**性能評価**のためのデータに分割 - 分割の方法、比率についての一定の基準はない - ランダムサンプリングが基本 - データの特性に偏りがないことを保証するように留意する - 正当な理由がある場合においてはランダムでないサンプリングも有効 --- # 訓練データとテストデータ - 訓練データ... モデルと特徴量を開発するために利用される - パラメータの推定、モデルの比較、最終的なモデルに到るまでに必要な作業は分析セットで行う - テストデータ... 構築されたモデルの性能を見積もるために使用する ## データ分割時の注意 - 訓練データの中にテストデータの情報が含まれていてはいけない - 手元の評価では良いモデルができるが、未知データに対する精度が低下する - 時系列データでは「未来」のデータは必ずテストデータに与える (後述) --- # Hold-out検証 .pull-left[ - データを訓練データとテストデータに分割 - 訓練・テストデータへの割付は**ランダム** ] .pull-right[ ```r set.seed(123) *lp_split <- initial_split(df_lp_kanto, prop = 3/4) lp_split # 訓練テストデータの件数/テストデータの件数/データ全体の件数 ``` ``` ## <6357/2119/8476> ``` ```r *lp_train <- training(lp_split) *lp_test <- testing(lp_split) ``` ] ![](images/hold-out.png) --- # 再標本化法 (リサンプリング resampling) - リサンプリングされたデータを分析セット (analysis set) と 評価セット (assesment set) に分割する <sup>*</sup> - 分析セット... 学習データと同様、モデル構築のために利用する - 評価セット... テストデータ同じ機能(モデルの性能評価に使う) - データを複製する方法、分析・評価セットへの割り当て方法の違いが様々 - ブートストラップ法 - 交差検証法 - Leave One Out (LOO)... データセットの1点をテストに使用する。少数のデータセットでは有効だが現在ではほぼ使われない .footnote[再標本化法後に分割したデータに対してもデータ分割と同じ「訓練」「テスト」が使われるのが一般的だが、1) 再標本化法は訓練データセットを対象に行われる、2) 複製されたサンプル間で役割が異なるデータを参照することから、用語の混乱を避けるためにここでは「分析」と「評価」を使う] --- # 交差検証 - モデルの過学習を防ぐために**複数のfold**を用意 - foldには分析セットと評価セットが含まれる - foldごとに用意される評価セットでの汎化性能を算出、平均することでモデルの出来を判断 - Hold-out検証で生じうる偏り(訓練とテストデータの分割が1度きり)に対する懸念を弱める - データがクラスやグループ(同一ユーザの複数のデータなど)を持つ場合でも対応可能 - 以下、代表的なものを紹介 --- # k分割交差検証 - データセットをk個に分割したfoldをkの回数分複製する - kは5~10に設定するのが一般的 - データセットが巨大な場合、計算時間が長くなる - k-1を分析用、kを評価用に使用する - 評価セットはfoldごとに変わる(評価セットはfold間で相互に排他的) - **データセットの順番に従って分割** ```r set.seed(124) *lp_folds <- vfold_cv(df_lp_kanto, v = 4) lp_folds ``` ``` ## # 4-fold cross-validation ## # A tibble: 4 x 2 ## splits id ## <named list> <chr> ## 1 <split [6.4K/2.1K]> Fold1 ## 2 <split [6.4K/2.1K]> Fold2 ## 3 <split [6.4K/2.1K]> Fold3 ## 4 <split [6.4K/2.1K]> Fold4 ``` ```r nrow(df_lp_kanto) / 5 ``` ``` ## [1] 1695 ``` --- # k分割交差検証 ![](images/k-fold.png) --- # 層化k分割交差検証 .pull-left[ - クラスごとの出現確率を維持した状態でデータを分析・評価セットに分割 ] .pull-right[ ```r *vfold_cv(df_lp_kanto, v = 4,strata = ".prefecture") ``` ] ![](images/stratified-k-fold.png) --- # グループk分割交差検証 - 共通のユーザやサイトから観測されたデータをグループの大きさに応じて分割 ```r *group_vfold_cv(df_hazard_kys, group = "meshCode", v = 4) ``` ![](images/group-k-fold.png) --- # モンテカルロ交差検証 - リサンプリングしたデータ間での、学習・テストデータへの割付に対する重複を許す - 各リサンプリングの結果を独立して扱える ```r *mc_cv(df_lp_kanto, times = 4) ``` ![](images/monte-carto-cv.png) --- # 時系列データの分割 - 🆖 ランダム、データ順での分割では学習データに将来のデータが含まれることになり、データ漏洩となる - **最新の期間をテストデータ**として扱うようにデータを分割 .pull-left[ ```r beer_split <- * initial_time_split(df_beer2018q2, prop = 3/4) beer_train <- training(beer_split) beer_test <- testing(beer_split) ``` ```r beer_train %>% mutate(type = "train") %>% bind_rows(beer_test %>% mutate(type = "test")) %>% mutate(type = forcats::fct_inorder(type)) %>% ggplot() + geom_point(aes(date, expense, color = type), size = 0.4) + scale_color_ds() + scale_x_date(date_breaks = "month") + theme(axis.text.x = element_text(angle = 40, hjust = 1), legend.position = "top") ``` ] .pull-right[ <img src="data-split_files/figure-html/plot_time_split-1.png" style="display: block; margin: auto;" /> ] --- # Rolling Origin Forescast .pull-left[ - 時系列データにおいて単純な交差検証は有効ではない - 時間軸に対し、スライドさせながらリサンプリング - リサンプリングされたデータ間での重複が多くなる ```r *beer_roll_split <- rolling_origin(df_beer2018q2, * initial = 14, * assess = 7) # initialの件数だけrolling analysis(beer_roll_split$splits[[1]]) ``` ``` ## # A tibble: 14 x 3 ## date expense precipitation_sum_mm ## <date> <dbl> <dbl> ## 1 2018-07-01 58.0 0 ## 2 2018-07-02 42.8 0 ## 3 2018-07-03 23.9 0 ## 4 2018-07-04 28.6 0 ## 5 2018-07-05 35.4 2 ## 6 2018-07-06 29.1 28.5 ## 7 2018-07-07 53.9 0 ## 8 2018-07-08 61.6 0 ## 9 2018-07-09 38.4 3.5 ## 10 2018-07-10 33.1 0 ## 11 2018-07-11 30.6 0 ## 12 2018-07-12 28.2 3.5 ## 13 2018-07-13 33.7 0 ## 14 2018-07-14 55.6 0 ``` ] .pull-right[ ```r assessment(beer_roll_split$splits[[1]]) ``` ``` ## # A tibble: 7 x 3 ## date expense precipitation_sum_mm ## <date> <dbl> <dbl> ## 1 2018-07-15 68.9 0 ## 2 2018-07-16 51.0 0 ## 3 2018-07-17 32.8 0 ## 4 2018-07-18 29.5 0 ## 5 2018-07-19 31.7 0 ## 6 2018-07-20 39.3 0 ## 7 2018-07-21 58.7 0 ``` ] --- # Rolling Origin Forescast ![](images/rolling-origin-forecast-cv.png) --- # Rolling Origin Forescast .pull-left[ - 時系列に並べたデータをスライドさせずに累積していく方法 ```r *beer_roll_split <- rolling_origin(df_beer2018q2, * initial = 14, * assess = 7, * cumulative = TRUE) ``` ```r analysis(beer_roll_split$splits[[2]]) ``` ``` ## # A tibble: 15 x 3 ## date expense precipitation_sum_mm ## <date> <dbl> <dbl> ## 1 2018-07-01 58.0 0 ## 2 2018-07-02 42.8 0 ## 3 2018-07-03 23.9 0 ## 4 2018-07-04 28.6 0 ## 5 2018-07-05 35.4 2 ## 6 2018-07-06 29.1 28.5 ## 7 2018-07-07 53.9 0 ## 8 2018-07-08 61.6 0 ## 9 2018-07-09 38.4 3.5 ## 10 2018-07-10 33.1 0 ## 11 2018-07-11 30.6 0 ## 12 2018-07-12 28.2 3.5 ## 13 2018-07-13 33.7 0 ## 14 2018-07-14 55.6 0 ## 15 2018-07-15 68.9 0 ``` ] .pull-right[ ```r assessment(beer_roll_split$splits[[2]]) ``` ``` ## # A tibble: 7 x 3 ## date expense precipitation_sum_mm ## <date> <dbl> <dbl> ## 1 2018-07-16 51.0 0 ## 2 2018-07-17 32.8 0 ## 3 2018-07-18 29.5 0 ## 4 2018-07-19 31.7 0 ## 5 2018-07-20 39.3 0 ## 6 2018-07-21 58.7 0 ## 7 2018-07-22 50.9 0 ``` ] --- # Rolling Origin Forescast ![](images/rolling-origin-forecast-cv-cumulative.png) --- # Session info .scroll-output[ ``` ## ─ Session info ────────────────────────────────────────────────────────── ## setting value ## version R version 3.6.0 (2019-04-26) ## os Debian GNU/Linux 9 (stretch) ## system x86_64, linux-gnu ## ui X11 ## language (EN) ## collate en_US.UTF-8 ## ctype en_US.UTF-8 ## tz Etc/UTC ## date 2019-06-30 ## ## ─ Packages ────────────────────────────────────────────────────────────── ## package * version date lib ## assertr 2.6 2019-01-22 [1] ## assertthat 0.2.1 2019-03-21 [1] ## backports 1.1.4 2019-04-10 [1] ## base64enc 0.1-3 2015-07-28 [1] ## bayesplot 1.7.0 2019-05-23 [1] ## boot 1.3-22 2019-04-02 [2] ## broom * 0.5.2 2019-04-07 [1] ## callr 3.2.0 2019-03-15 [1] ## cellranger 1.1.0 2016-07-27 [1] ## class 7.3-15 2019-01-01 [2] ## cli 1.1.0 2019-03-19 [1] ## codetools 0.2-16 2018-12-24 [2] ## colorspace 1.4-1 2019-03-18 [1] ## colourpicker 1.0 2017-09-27 [1] ## conflicted * 1.0.4 2019-06-21 [1] ## crayon 1.3.4 2017-09-16 [1] ## crosstalk 1.0.0 2016-12-21 [1] ## dials * 0.0.2 2018-12-09 [1] ## digest 0.6.19 2019-05-20 [1] ## dplyr * 0.8.1 2019-05-14 [1] ## DT 0.7 2019-06-11 [1] ## dygraphs 1.1.1.6 2018-07-11 [1] ## emo 0.0.0.9000 2019-06-29 [1] ## evaluate 0.14 2019-05-28 [1] ## fansi 0.4.0 2018-10-05 [1] ## forcats * 0.4.0 2019-02-17 [1] ## generics 0.0.2 2018-11-29 [1] ## ggplot2 * 3.2.0 2019-06-16 [1] ## ggridges 0.5.1 2018-09-27 [1] ## glue 1.3.1.9000 2019-06-29 [1] ## gower 0.2.1 2019-05-14 [1] ## gridExtra 2.3 2017-09-09 [1] ## gtable 0.3.0 2019-03-25 [1] ## gtools 3.8.1 2018-06-26 [1] ## haven 2.1.0 2019-02-19 [1] ## here 0.1 2017-05-28 [1] ## hms 0.4.2 2018-03-10 [1] ## htmltools 0.3.6 2017-04-28 [1] ## htmlwidgets 1.3 2018-09-30 [1] ## httpuv 1.5.1 2019-04-05 [1] ## httr 1.4.0 2018-12-11 [1] ## icon 0.1.0 2019-06-29 [1] ## igraph 1.2.4.1 2019-04-22 [1] ## infer * 0.4.0.1 2019-04-22 [1] ## inline 0.3.15 2018-05-18 [1] ## ipred 0.9-9 2019-04-28 [1] ## janeaustenr 0.1.5 2017-06-10 [1] ## jsonlite 1.6 2018-12-07 [1] ## knitr 1.23 2019-05-18 [1] ## labeling 0.3 2014-08-23 [1] ## later 0.8.0 2019-02-11 [1] ## lattice 0.20-38 2018-11-04 [2] ## lava 1.6.5 2019-02-12 [1] ## lazyeval 0.2.2 2019-03-15 [1] ## lme4 1.1-21 2019-03-05 [1] ## loo 2.1.0 2019-03-13 [1] ## lubridate 1.7.4 2018-04-11 [1] ## magrittr 1.5 2014-11-22 [1] ## markdown 1.0 2019-06-07 [1] ## MASS 7.3-51.4 2019-03-31 [2] ## Matrix 1.2-17 2019-03-22 [2] ## matrixStats 0.54.0 2018-07-23 [1] ## memoise 1.1.0 2017-04-21 [1] ## mime 0.7 2019-06-11 [1] ## miniUI 0.1.1.1 2018-05-18 [1] ## minqa 1.2.4 2014-10-09 [1] ## modelr 0.1.4 2019-02-18 [1] ## munsell 0.5.0 2018-06-12 [1] ## nlme 3.1-139 2019-04-09 [2] ## nloptr 1.2.1 2018-10-03 [1] ## nnet 7.3-12 2016-02-02 [2] ## parsnip * 0.0.2 2019-03-22 [1] ## pillar 1.4.1 2019-05-28 [1] ## pkgbuild 1.0.3 2019-03-20 [1] ## pkgconfig 2.0.2 2018-08-16 [1] ## plyr 1.8.4 2016-06-08 [1] ## prettyunits 1.0.2 2015-07-13 [1] ## pROC 1.15.0 2019-06-01 [1] ## processx 3.3.1 2019-05-08 [1] ## prodlim 2018.04.18 2018-04-18 [1] ## promises 1.0.1 2018-04-13 [1] ## ps 1.3.0 2018-12-21 [1] ## purrr * 0.3.2 2019-03-15 [1] ## R6 2.4.0 2019-02-14 [1] ## Rcpp 1.0.1 2019-03-17 [1] ## readr * 1.3.1 2018-12-21 [1] ## readxl 1.3.1 2019-03-13 [1] ## recipes * 0.1.5 2019-03-21 [1] ## reshape2 1.4.3 2017-12-11 [1] ## rlang 0.4.0.9000 2019-06-29 [1] ## rmarkdown 1.13 2019-05-22 [1] ## rpart 4.1-15 2019-04-12 [2] ## rprojroot 1.3-2 2018-01-03 [1] ## rsample * 0.0.4 2019-01-07 [1] ## rsconnect 0.8.13 2019-01-10 [1] ## rstan 2.18.2 2018-11-07 [1] ## rstanarm 2.18.2 2018-11-10 [1] ## rstantools 1.5.1 2018-08-22 [1] ## rstudioapi 0.10 2019-03-19 [1] ## rvest 0.3.4 2019-05-15 [1] ## scales * 1.0.0 2018-08-09 [1] ## sessioninfo 1.1.1 2018-11-05 [1] ## shiny 1.3.2 2019-04-22 [1] ## shinyjs 1.0 2018-01-08 [1] ## shinystan 2.5.0 2018-05-01 [1] ## shinythemes 1.1.2 2018-11-06 [1] ## SnowballC 0.6.0 2019-01-15 [1] ## StanHeaders 2.18.1-10 2019-06-14 [1] ## stringi 1.4.3 2019-03-12 [1] ## stringr * 1.4.0 2019-02-10 [1] ## survival 2.44-1.1 2019-04-01 [2] ## threejs 0.3.1 2017-08-13 [1] ## tibble * 2.1.3 2019-06-06 [1] ## tidymodels * 0.0.2 2018-11-27 [1] ## tidyposterior 0.0.2 2018-11-15 [1] ## tidypredict 0.3.0 2019-01-10 [1] ## tidyr * 0.8.3.9000 2019-06-29 [1] ## tidyselect 0.2.5 2018-10-11 [1] ## tidytext 0.2.1 2019-06-14 [1] ## tidyverse * 1.2.1 2017-11-14 [1] ## timeDate 3043.102 2018-02-21 [1] ## tokenizers 0.2.1 2018-03-29 [1] ## utf8 1.1.4 2018-05-24 [1] ## vctrs 0.1.99.9000 2019-06-29 [1] ## withr 2.1.2 2018-03-15 [1] ## xaringan 0.10 2019-05-14 [1] ## xfun 0.7 2019-05-14 [1] ## xml2 1.2.0 2018-01-24 [1] ## xtable 1.8-4 2019-04-21 [1] ## xts 0.11-2 2018-11-05 [1] ## yaml 2.2.0 2018-07-25 [1] ## yardstick * 0.0.3 2019-03-08 [1] ## zeallot 0.1.0 2018-01-28 [1] ## zoo 1.8-6 2019-05-28 [1] ## source ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## Github (hadley/emo@02a5206) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## Github (tidyverse/glue@ea0edcb) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## Github (ropenscilabs/icon@a510f88) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## Github (r-lib/rlang@fc1aae2) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## Github (tidyverse/tidyr@158f8b4) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## Github (r-lib/vctrs@4c0e04a) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## CRAN (R 3.6.0) ## ## [1] /usr/local/lib/R/site-library ## [2] /usr/local/lib/R/library ``` ]