Rで何かをしたり、読書をするブログ

政府統計の総合窓口のデータや、OECDやUCIやのデータを使って、Rの練習をしています。ときどき、読書記録も載せています。

都道府県別の商業動態統計調査のデータの分析4 - tidymodelsによるモデル作成

www.crosshyou.info

の続きです。前回は、百貨店・スーパーの販売額の前年比の平均値が年度によって違うことがわかりました。今回からはtidymodelsで機械学習をしてみようと思います。予測する変数は、百貨店・スーパーの販売額の前年比です。これをその他のお店の前年比を使って予測してみます。

最初にデータフレームをpivot_wider()関数を使ってワイド型に変換します。

summary()関数で正しくワイド型に変換されたか確認します。

正しくワイド型に変換されていますね。このデータフレームをそのまま使用してもいいのですが、機械学習っぽくデータフレームを加工します。

予測に使わない都道府県名と年度の列を削除して、変数名をそれっぽい名前にしました。

v1は元はなんだったかなどがすぐにわかるように、Lookup Tableを作成しておきます。

こうしておけば、

こんなようにしてv1はコンビニエンスストアの販売額の前年比、v3は大型家電量販店の販売額の前年比だとすぐにわかります。

変数同士の相関マトリックスをみてみます。

0.5より大きいペア、-0.5より小さいペアは無いですね。

tidymodelsのパッケージの読み込みをします。

tidymodels_prefer()関数でtidymodelsの関数を優先するようにしました。

データフレームをトレーニング用とテスト用にわけます。

initial_split()関数でデータフレームを分割し、training()関数でトレーニング用、testing()関数でテスト用にわけました。そのあと、t.test()関数でトレーニング用のtargetの平均値とテスト用の平均値に差がないことを確認しています。

モデルを設定していきます。はじめは線形モデルです。

線形モデルは、linear_reg()でエンジンはlmです。線形モデルはチューニングは不要です。

次はElastic-Netモデル(ペナルティ付き線形モデル)を作りました。

Elastic-Netモデル(ペナルティ付き線形モデル)はlinear_reg()でエンジンはglmnetです。チューニングは、penaltyとmixtureです。

次は決定木モデルを作りましょう。

決定木モデルは、decision_tree()でエンジンはrpartです。set_mode()でregressionと回帰モデルに設定します。

ランダムフォレストモデルも作りました。

ランダムフォレストモデルは、rand_forest()でエンジンはrangerです。これもset_mode()でregressionとしています。set_mode()で回帰を設定します。

サポートベクター回帰(SVR)モデルも作りました。

サポートベクター回帰(SVR)モデルは、svm_rbf()にkernlabエンジンです。

k-NN回帰モデルも試そうと思います。

k-NN回帰モデルは、nearest_neighbor()にkknnエンジンを搭載します。set_mode()で回帰を設定するのは他のモデルと同じです。基本的に、linear_reg()、logistic_reg()以外はset_mode()でregressionかclassificationを指定しますね。

7番目のモデルはニューラルネットワークモデルにしました。

ニューラルネットワークモデルは、mlp()にnnetエンジンです。
最後のモデルは勾配ブースティングモデルにしましょう。

勾配ブースティングは、boost_tree()にエンジンはxgboostです。

この8つのモデルでtargetを予測するモデルを作っていきます。

今回は以上です。

次回は、

www.crosshyou.info

です。

 

はじめから読むには

www.crosshyou.info

です。

今回のコードは以下になります。

#
# dfをワイド型に変換する
df_wide <- df |> 
  pivot_wider(
    names_from = c(type, shop),
    values_from = yoy
)
#
# df_wideのサマリー
summary(df_wide)
#
# 機械学習用にデータフレームを別に作る
df2 <- df_wide |> 
  select(-pref, -year)
colnames(df2) <- 
  c("target", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9")
summary(df2)
#
# 変数名のLookup Table
v_names <- names(df2)
names(v_names) <- colnames(df_wide[ , -c(1, 2)])
v_names
#
# v1は
v_names[v_names == "v1"]
#
# v3は
v_names[v_names == "v3"]
#
# df2の相関マトリックス
cor(df2)
#
# tidymodelsの読み込み
library(tidymodels)
#
# tidymodels優先
tidymodels_prefer()
#
# データをトレーニング用、テスト用にわける
set.seed(666)
splits <- initial_split(df2, prop = 0.8)
train_data <- training(splits)
test_data <- testing(splits)
t.test(test_data$target, train_data$target)
#
# 1. モデルの作成
# 1-1. 線形モデル(lm)
lm_mod <- linear_reg() |> # 普通の線形モデルはチューニングは不要
  set_engine("lm")
#
# 1-2. ペナルティ付き線形モデル(glmnet)
glmnet_mod <- linear_reg(
  penalty = tune(), # λ - 正則化の強さ
  mixture = tune()  # α - (Ridge ~ LASSOの割合)
) |> 
  set_engine("glmnet")
#
# 1-3. 決定木モデル(rpart)
rpart_mod <- decision_tree(
  cost_complexity = tune(), # いわゆるcp
  tree_depth = tune(), # 木の深さ
  min_n = tune() # 最小ノードサイズ
) |> 
  set_engine("rpart") |> 
  set_mode("regression")
#
# 1-4. ランダムフォレストモデル(ranger)
ranger_mod <- rand_forest(
  mtry = tune(), # 使用する特徴量の数
  trees = 1000,  # 木の本数
  min_n = tune() # 
) |> 
  set_engine("ranger") |> 
  set_mode("regression")
#
# 1-5. サポートベクター回帰(SVR)モデル(kernlab)
kernlab_mod <- svm_rbf(
  cost = tune(), # 誤差をどれだけ許すか
  rbf_sigma = tune() # RBFカーネルの広がり
) |> 
  set_engine("kernlab") |> 
  set_mode("regression")
#
# 1-6. k-NN回帰モデル(kknn)
kknn_mod <- nearest_neighbor(
  neighbors = tune(), # k(近傍数)
  weight_func = "rectangular", # 重み付けの方法
  dist_power = 2 # 距離の種類(2 = ユークリッド距離)
) |> 
  set_engine("kknn") |> 
  set_mode("regression")
#
# 1-7. ニューラルネットワークモデル(nnet)
nnet_mod <- mlp(
  hidden_units = tune(), # 中間層のユニット数
  penalty = tune(), # L2 正則化
  epochs = tune() # 学習回数
) |> 
  set_engine("nnet") |> 
  set_mode("regression")
#
# 1-8. 勾配ブースティング回帰モデル(xgboost)
xgboost_mod <- boost_tree(
  trees = 1000,          # 木の数
  tree_depth = tune(),   # 深さ
  learn_rate = tune(),   # 学習率
  loss_reduction = tune(), # gamma
  sample_size = tune(),  # subsample
  mtry = tune(),         # 列サンプリング
  min_n = tune()         # min_child_weight
) |>
  set_engine("xgboost") |>
  set_mode("regression")
#

 

(冒頭の画像は、Bing Image Creator で生成しました。プロンプトは Spring season landscape, close up of yellow Narcissus flowers, blue sky, no clouds, green grass, Photo です。)