勾配ブースティング木:モデルの構築
勾配ブースティング(Gradient Boosting)は、他のモデルの性能を向上させる手法です。基本的な考え方はこうです。まず、単純で計算しやすい弱いモデルを構築します。次に、そのモデルの残差を新たな目的変数として別のモデルを適合させます。元の予測モデルと残差予測モデルを「足し合わせる」ことで、より精度の高いモデルが得られます。この処理を繰り返し、前のモデルの残差を予測する新しいモデルを追加していくことで、モデルはどんどん強化されていきます。
より具体的に説明すると、sparklyr では勾配ブースティング木(Gradient Boosted Trees)が使用されます。これは、弱いモデルとして決定木を用いた勾配ブースティングです。分類問題(目的変数がカテゴリ型)にも回帰問題(目的変数が連続型)にも使用できます。今回のような回帰問題では、各データ点の当てはまりの悪さを残差で測定します。
決定木については、Supervised Learning in R: Classification および Supervised Learning in R: Regression コースでさらに詳しく解説されています。後者のコースでは勾配ブースティングも扱っています。
sparklyr で勾配ブースティング木モデルを実行するには、ml_gradient_boosted_trees() を呼び出します。この関数の使い方は、本章の最初の演習で説明しました。
この演習はコースの一部です
sparklyr を使った Spark 入門(R)
演習の手順
Spark の接続は spark_conn として作成済みです。また、Spark に保存されたトラックのメタデータとティンバーデータを結合・フィルタリングした Spark テーブルに紐付けられたtibble は、track_data_to_model_tbl として事前に定義されています。
- 特徴量として使用する
"timbre"という文字列を含む列を取得します。colnames()を使ってtrack_data_to_model_tblの列名を取得します。names()では意図した結果が得られないため、注意してください。str_subset()を使って列を絞り込みます。- この関数の
pattern引数にはfixed("timbre")を指定します。 - 結果を
feature_colnamesに代入します。
reformulate()を使ってモデルのformulaを作成します。termlabels引数(式の入力変数)にはfeature_colnamesを指定します。response引数(式の出力変数)には"year"を指定します。- 結果を
year_formulaに代入します。 - この方法で
reformulate()を使うと、feature_colnames内のすべての変数が+記号でつながれ、formulaの右辺が形成されます。結果としてyear ~ timbre1 + timbre2 + ... + timbre12という形式の式が生成され、モデルに含める変数間の関係が定義されます。
- 勾配ブースティングモデルを実行します。
ml_gradient_boosted_trees()を、先ほど作成したyear_formulaを唯一の引数として呼び出します。- 結果を
gradient_boosted_trees_modelに代入します。
実践的なインタラクティブ演習
このサンプルコードを完成させて、この演習に挑戦してみましょう。
# track_data_to_model_tbl has been pre-defined
track_data_to_model_tbl
feature_colnames <- track_data_to_model_tbl %>%
# Get the column names
___ %>%
# Limit to the timbre columns
___(___(___))
feature_colnames
# Create the formula for the model
year_formula <- ___
gradient_boosted_trees_model <- track_data_to_model_tbl %>%
# Run the gradient boosted trees model
___