JapanR 20201205 一般LT R tidymodels
japan.R 2020/12/5
View Slide
@Ringa_hyj@Ringa_hyjName <- ‘@Ringa_hyj’自 己 紹 介スライドの間違い・指摘歓迎致します
https://www.slideshare.net/YutakaKuroki/tokyo-r-20181110 https://speakerdeck.com/dropout009/tokyo-dot-r83Rコミュニティを通して知ったtidymodelsの存在https://speakerdeck.com/dropout009/tidymodelsniyorutidynaji-jie-xue-xihttps://speakerdeck.com/s_uryu/tidymodels
知らないパッケージを知る機会やっぱRコミュニティええなぁ…受け取ったからには何かお返ししたい!!今日やること
tidymodelsの紹介検 証 対 象今日やること
を今日やること
料理に例えるので親しんでもらいたい今日やることinstall.packages(‘tidymodels’)library(tidymodels) いれてみて!!
飛行機の遅延予測
食材 の準備 =欠損値messyデータ準備・前処理library(nycflights13)#まず確認library(skimr)skim(flights)library(tidyverse)glimpse(flights)#余分なゴミを落とすflight_data <-flights %>%mutate(arr_delay = ifelse(arr_delay >= 30, "late", "on_time"),arr_delay = factor(arr_delay),date = as.Date(time_hour)) %>%inner_join(weather, by = c("origin", "time_hour")) %>%select(dep_time, flight, origin, dest, air_time, distance,carrier, date, arr_delay, time_hour) %>%na.omit() %>%mutate_if(is.character, as.factor)
食材 の準備 = データ準備・前処理
食材 の確認 =#食材の状態や揃っているかを確認p <- ggplot(flight_data, aes(x = carrier,fill=arr_delay)) +geom_bar(stat = "count",position = "stack") +stat_count(aes(label = ..count..),geom = "text", vjust = 2, colour = "red")library(plotly)ggplotly(p)EDAで確認EDA
食材 の確認 = EDA
味見・評価 する人 = train,test,valid#試食者にだけウケる味でなく#色々な人に良い評価をもらうためset.seed(123)data_split <- initial_split(flight_data, prop = 0.7)train_data <- training(data_split)test_data <- testing(data_split)train testvalid感想:内輪ウケ世間的な評価口コミ感想:一般ウケ
調理手順 の設定 = モデル学習用の前処理#どんな手順で調理するのが効率的か#料理直前の下ごしらえ#trainとtestの人で提供する食材の部分が変化しないかflights_rec <-recipe(arr_delay ~ ., data = train_data) %>%update_role(flight, time_hour, new_role = "ID") %>%step_date(date, features = c("dow", "month")) %>%step_holiday(date, holidays = timeDate::listHolidays("US")) %>%step_rm(date) %>%step_dummy(all_nominal(), -all_outcomes()) %>%step_zv(all_predictors())#step_smote()今回不均衡だが不使用 ← themisにも対応#recipeをかけた後がどうなるか#調理前にデータを味見する#prep, bake, juiceflights_rec%>% prep() %>% juice()flights_rec %>% prep() %>% bake(test_data)
調理手順 の設定 = モデル学習用の前処理従来まで・testにないカテゴリをone hotしないように!・ID列を予測に使ってないよな?・どの列box-coxしたっけ?・日付から月,日,曜日の特徴量合成したっけ?・正規化終わってたっけ?・予測対象がleakしてないよな?・あ、testにも同じパラメタで処理しなきゃいけないんだった…juice(), bake()レシピを展開
調理器具 の設定 = モデル決め#調理前の下ごしらえも終わった#調理器具によってはマッチしない下ごしらえもある#フライパンか鍋か、IHかガスかlr_mod <-logistic_reg() %>%set_engine("glm")
調理器具 の設定 = モデル決めモデル式の記述の違い(ベクトル,マトリックス,列名)lm glmnetlr_mod <- logistic_reg() %>% set_engine("lm")lr_mod <- logistic_reg() %>% set_engine("glm")
調理器具 の設定 = モデル決め内部パラメタの名前の違い(おなじチューニングパラメタなのに…)ranger randomForestranger randomForest parsnip抽出サイズ mtry mtry → mtry木の数 num.trees ntree → trees分割サイズ min.node.size nodesize → min_n
調理場手順と器具を持って へ = 学習・推論#調理場へ持っていくflights_wflow <-workflow() %>%add_model(lr_mod) %>%add_recipe(flights_rec)#いざ調理flights_fit <-flights_wflow %>%fit(data = train_data)#完成predict(flights_fit, test_data)predict(flights_fit, test_data, type = "prob")
調理場手順と器具を持って へ = 学習・推論従来のsummary()oh, messy…
調理場手順と器具を持って へ = 学習・推論tidy() is tidy !
調理場手順と器具を持って へ = 学習・推論bootstrapしてfitして結果をnest & tidyにして回帰係数のサンプリング分布から最善モデルの選択
料理人 から話を聞く= レシピ,データ逆引き#さっき調理fitした結果#flights_fit <-# flights_wflow %>%# fit(data = train_data)#食材教えてぇなflights_fit %>%pull_workflow_mold()#レシピ教えてぇなflights_fit %>%pull_workflow_prepped_recipe() %>%broom::tidy()flights_fit %>%pull_workflow_preprocessor() %>%broom::tidy()
#評価結果は?flights_pred <- predict(flights_fit, test_data, type = "prob") %>%bind_cols(test_data %>% select(arr_delay,time_hour,flight))flights_pred %>%roc_curve(truth = arr_delay, .pred_late) %>%autoplot()世間的な評価口コミ評価 を調べる= 評価指標の確認
評価 を調べる= 評価指標の確認Tidymodelsのpredict思想・ 入 力 デ ー タ と 同 じ だ け の p r e d を( 行 数 一 致 、 b i n d _ c o l で き る )・ I D 列 を 常 に 隣 に 保 持 で き る よ う に・ 列 名 は 「 . p r e d 」 で 被 り な く
Enjoy !
referencehttps://www.tidymodels.org/https://rstudio-conf-2020.github.io/applied-ml/Part_3.html#1https://unsplash.com/https://www.tidyverse.org/blog/2020/02/themis-0-1-0/