グループ効果を考慮したデータの分割
モデルを実行する前に、データを訓練セットとテストセットに分割する必要があります。ただし、このデータセットには注意が必要な点があり、単純に sdf_random_split() を呼び出すだけでは対応できません。同じアーティストのトラックは同じセットにまとめる必要があります。あるアーティストのトラックをモデルの訓練に使い、同じアーティストの別のトラックがテストセットに含まれてしまうと、モデルの精度が実際よりも高く見えてしまうからです。
この問題を解決するには、アーティスト ID のみを先に分割し、その分割済み ID を元のデータセットに内部結合する方法が有効です。なお、一部のアーティストはトラックによって表記が異なる場合があるため、artist_name よりも artist_id を使った分割の方が信頼性が高くなります。たとえば、Duke Ellington の artist_name は "Duke Ellington" の場合もあれば、"Duke Ellington & His Orchestra" や複数の表記揺れを持つ場合もあります。
この演習はコースの一部です
sparklyr を使った Spark 入門(R)
演習の手順
Spark接続は spark_conn として作成済みです。Sparkに格納された、結合・フィルタリング済みのトラックメタデータとティンバーデータを持つtibbleは track_data_tbl として事前に定義されています。
- アーティスト ID を訓練セットとテストセットに分割し、結果を
training_testing_artist_idsに代入します。track_data_tblのartist_id列を選択します。- 重複のない行を取得します。
- 訓練用70%、テスト用30%に分割します。
- 訓練データセットを
artist_idをキーとしてtrack_data_tblに内部結合し、結果をtrack_data_to_model_tblに代入します。 - テストデータセットを
artist_idをキーとしてtrack_data_tblに内部結合し、結果をtrack_data_to_predict_tblに代入します。
実践的なインタラクティブ演習
このサンプルコードを完成させて、この演習に挑戦してみましょう。
# track_data_tbl has been pre-defined
track_data_tbl
training_testing_artist_ids <- track_data_tbl %>%
# Select the artist ID
___ %>%
# Get distinct rows
___ %>%
# Partition into training/testing sets
___
track_data_to_model_tbl <- track_data_tbl %>%
# Inner join to training partition
___
track_data_to_predict_tbl <- track_data_tbl %>%
# Inner join to testing partition
___