DS講座 tidymodels講座

【tidymodels講座3】{rsample}データ分割

こんにちは,shun(@datasciencemore)です!!

今回はtidymodelsの{rsample}についてやっていきます.

0.{rsample}ってなに??

{rsample}ってなんですか??

{rsample}は,データ分割に関するパッケージだよ!!
{rsample}を使えばデータを様々な形に分割することができるんだ!!

交差検証について覚えているでしょうか?

交差検証をするとき,データを分割する必要がありました.

その分割の方法に色々なパターンがありましたね.

{rsample}を使用すると色々なパターンに分割することができるのです!!

{rsample}の主な関数がこちらです.

これらの関数を使用して,データを様々な形へ分割してみましょう!

0.データ

これからの講座で使用するデータは,ローン情報に関するデータを使用していきます.

ローンを組む,要するにお金を借りるときは,色々な情報を金融機関に提示する必要があります.

色々な情報というのは,例えば,自分の職業,勤めている会社,収入などが該当します

このデータはそういう情報であると考えていただければOKです.

No1のStatusにローンの審査結果が,No2~No14に審査結果に影響する項目が記載されています.

tidymodels編では,基本的にNo1のStatusを目的変数に,No2~No14を説明変数として,このデータを使用していきます.

なので,分類問題ということになります.

このデータは次のようにすれば使用することができます.

既知データというのは,目的変数の値がわかるデータ,未知データというのは目的変数の値がわからないデータのことです.
予測モデリングでやりたいことは既知データからデータの傾向を学習し,未知データの目的変数を予測することです.
なお,今回は練習なので未知データの目的変数の値はわかっていますが,実際はわからないものとして考えてみてください.

1.様々な分割

1.0.初期分割

既知データを学習データと評価データに分割します.

ここで,propは,学習データの割合,strataは,指定した列の比率を同じにすることを示しています.

この例の場合,学習データの割合は全体の80%,「Status」列の割合が学習データと評価データで同じになるように分割するということを示しています.

定義したinitial_splitを実行すると次のように出力されます.

これは,学習データ3563件,評価データ891件,合わせて4454件ということです.

ここから,学習データ,評価データを抽出するには,training関数,testing関数を使用すればOKです.

以下,交差検証に使用する分割を紹介しますが,分割元のデータは上で定義したtrainを使用していきます.

1.1.K分割

K分割はこんな感じに分割することでした.

これを{rsample}でコーディングするとこのようになります.

vで分割数を設定できます.

この場合だと4つに分割しているってことです.

ちなみにwith_seed(1234, .)は,seed:1234の乱数を使用するということです.

K分割は,乱数を使用し分割方法を決定しています.

なので,分割が実行するたびに異なるのです.

分割を固定するにはseedを固定してあげる必要があります.

with_seedという関数を使用することでseedを固定することができるので,常に同じ分割のされ方で分割されるのです!

定義したkfold_splitsを実行すると,出力はこのようになります.

こんな感じで4行にそれぞれのFoldが表示されます.

上の図との対応を確認してください.

このように分割した後にanalysis,assessmentを抽出したい場合は,それぞれのsplitにanalysis関数,assessment関数を適用することで実現できます.

これを利用して各行のsplitに対して,analysisとassessmentを求めたい場合は,rowwiseとmutateを使用してこうするのがいいでしょう.

ちなみに.analysis,.assessmentと列名の頭に「.」をつけたのは,グローバル変数との競合を避けるためです.

別にどのような列名でもいいのですが,自分の意図しない変数を使用したくないので列名の頭に「.」を付けました.

単なるテクニックですのであまり気にしなくてOKです笑

1.2.hold-out分割

hold-out分割は,学習データを単純に2分割にし,analysisとassessmentに分ける方法です.

コーディングはこんな感じです.

1.3.leave-one-out分割

leave-one-out分割は,K分割交差検証のKを学習データ数にする方法です.

コーディングはこうです.

leave-one-out分割は,上述のK分割やhold-out分割と違い,分割方法が一意に定まるので,seedを固定する必要はありません.

1.4.stratified分割

分類タスクの場合に,foldごとに含まれるカテゴリの割合を等しくしてデータを分割することをstratified分割(日本語だと層化抽出)と呼びのでした.

コーディングは,K分割の場合とほとんど一緒です.

引数strataに割合を等しくするカテゴリを設定すればOKです.

上のようにするとStatus列のカテゴリ(goodとbad)の割合が分割しても等しくなります.

ほんとにそうなっているか,実際に確認してみましょう.

trainのStatusの割合を確認します.

badが0.282,goodが0.718の割合であることがわかりました.

それでは,stratified分割した場合,各foldのStatusの割合を見てみましょう.

簡単に考えるため,analysisとassessmentについてgoodの割合を見てみましょう.

はい,こんな感じでどのfoldでもanalysisとassessmentのgoodの割合が約0.718ということが確認できました!

ちなみに引数strataを使用しない(いわゆる普通のK分割の場合)と,分割前と分割後で割合がずれます.

こんな感じでtrain, analysis, assessmentと一緒ではないことが確認できます.

分類タスクの場合は,stratified分割にしたほうがいいでしょう.

1.5.時系列分割

時系列分割はこんな感じに分割することでした.

左のように分割したい場合は,引数cumulativeをFALSEにします.

右のように分割したい場合は,引数cumulativeをTRUEにします.

どちらの場合でも引数skip,引数lagの数値を調整すると微調整ができるので,いろいろな数値を入れてみてどのような挙動するのか試してみましょう.

まとめ

今回は{rsample}についてやってきました!

{rsample}を使用すると簡単にデータを様々な形へ分割できます.

今回学習した分割方法は以下のとおりです.

0.初期分割
1.K分割
2.hold-out分割
3.leave-one-out分割
4.stratified分割
5.時系列分割

もちろん,これ以外にも分割方法はありますが,まずはこれらの主要な分割をマスターしましょう.

大事なことは,目的に合わせて適切にデータを分割することです.

データ分割の基本原則である

①学習データと評価データの関係と各foldのanalysis,assessmentの関係を類似させる.
②各foldのanalysisを網羅的にする.

を意識し,適切なデータ分割を心がけましょう!

それでは,お疲れ様でした!!

-DS講座, tidymodels講座