ディシジョン ツリーを作成する

このユニットでは、YDF(Yggdrasil)を使用します。 デシジョン フォレストなど)ライブラリをトレーニングして、ディシジョン ツリーを解釈します。

このユニットは 🧭? YDF スタートガイド ご覧ください

準備

データセットを調べる前に、次のことを行います。

  1. 新しい Colab を作成する ノートブックをご覧ください。
  2. 以下のコード行を配置して実行し、YDF ライブラリをインストールします。 新しい Colab ノートブックに次の内容を追加します。
    !pip install ydf -U
    
  3. 次のライブラリをインポートします。
    import ydf
    import numpy as np
    import pandas as pd
    

Palmer Penguins データセット

この Colab は <ph type="x-smartling-placeholder"></ph> Palmer Penguins データセットに 3 匹の 3 匹の ペンギンの種類:

  • あごひも
  • Gentoo
  • Adelie

これは分類問題です。目標は、犬の種を ペンギンを分類しました。ペンギンはこちらです。

3 匹のペンギン
できます。

<ph type="x-smartling-placeholder"></ph> 図 16:3 種類のペンギン。画像提供者: @allisonhorst

 

次のコードは、 pandas 関数を呼び出して、パーマーペンギンのデータセットをメモリに読み込みます:

path = "https://storage.googleapis.com/download.tensorflow.org/data/palmer_penguins/penguins.csv"
dataset = pd.read_csv(path)
label = "species"

# Display the first 3 examples.
dataset.head(3)

次の表は、パーマーペンギンの最初の 3 つの例の形式です。 データセット:

<ph type="x-smartling-placeholder"></ph> 表 3:パーマーペンギンの最初の 3 つの例 で確認できます。

island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g 性別
撮影していない Adelie Torgersen 39.1 18.7 181.0 3,750.0 男性 2007 年
1 Adelie Torgersen 3,950 17.4 1,860 3,800.0 女性 2007 年
2 Adelie Torgersen 40.3 1800 1,950 3,250.0 女性 2007 年

完全なデータセットには、数値(例: bill_depth_mm)が混在しています。 欠損している特徴の 3 つ(例: island)があります。ニューラル デシジョン フォレストではこれらすべての特徴タイプがネイティブにサポートされているため、 ワンホット エンコーディング、正規化、追加の is_present 機能は必要ありません。

次のコードセルでは、データセットをトレーニング セットとテスト用に分割しています。 set:

# Use the ~20% of the examples as the testing set
# and the remaining ~80% of the examples as the training set.
np.random.seed(1)
is_test = np.random.rand(len(dataset)) < 0.2

train_dataset = dataset[~is_test]
test_dataset = dataset[is_test]

print("Training examples: ", len(train_dataset))
# >> Training examples: 272

print("Testing examples: ", len(test_dataset))
# >> Testing examples: 72

デフォルトのハイパーパラメータを使用したディシジョン ツリーのトレーニング

最初のディシジョン ツリーは CART(分類と トレーニング アルゴリズム(別名: 学習者)を ハイパーパラメータです。 これは、ydf.CartLearner 学習者が適切なデフォルト値を設定するためです。 ハイパーパラメータ値を使用します。このタイプのモデルの仕組みについては、このモジュールで 後ほど説明します

model = ydf.CartLearner(label=label).train(train_dataset)

上記の呼び出しでは、使用する列が指定されていませんでした 学習します。そのため、トレーニング セット内のすべての列が使用されます。コール セマンティクス(数値、カテゴリ、テキストなど)も指定していない 学習します。したがって、特徴セマンティクスは自動的に推測されます。

model.plot_tree() を呼び出して、結果のディシジョン ツリーを表示します。

model.plot_tree()

Colab ではマウスを使用して、たとえば 各ノードのクラス分布として表されます。

デフォルト値を使用してトレーニングしたディシジョン ツリー
ハイパーパラメータです。

<ph type="x-smartling-placeholder"></ph> 図 17:デフォルトのハイパーパラメータでトレーニングされたディシジョン ツリー。 で確認できます。

Colab により、ルート条件に 243 個の例が含まれていることがわかります。ただし、 トレーニング データセットには 272 個のサンプルが含まれていました。残りの 29 サンプルは、検証とツリー プルーニング用に自動的に予約されています。

最初の条件は、bill_depth_mm の値をテストします。表 4 と表 5 に、 異なる種の確率を、最初の条件の結果に依存します。

<ph type="x-smartling-placeholder"></ph> 表 4:bill_depth_mm ≥ 42.3 の場合に異なる種になる可能性

Likelihood
Adelie(赤) 8%
Gentoo(ブルー) 58%
あごひも(緑) 36%

 

<ph type="x-smartling-placeholder"></ph> 表 5:別の種の確率が bill_depth_mm < 42.3

Likelihood
Adelie(赤) 97%
Gentoo(ブルー) 2%
あごひも(緑) 0%

bill_depth_mm は数値特徴量です。したがって、値 42.3 が判明しました。 数値によるバイナリ分類の厳密な分割を 学習します。

bill_depth_mm ≥ 42.3 が True の場合、 flipper_length_mm ≥ 207.5 は、元の画像のキャプションを Gentoos と Gentoos + Adelie のつながり。

次のコードは、モデルのトレーニングとテストの精度を示しています。

train_evaluation = model.evaluate(train_dataset)
print("train accuracy:", train_evaluation.accuracy)
# >> train accuracy:  0.9338

test_evaluation = model.evaluate(test_dataset)
print("test accuracy:", test_evaluation.accuracy)
# >> test accuracy:  0.9167

まれですが、テストの精度がトレーニング データよりも高くなる可能性は、 向上しますこの場合、テストセットはトレーニング セットと異なる可能性があります。 しかし、これは例外として、トレーニングとテストが分割されました 予測します。より考えられるのは、テスト データセットが非常に小さいことです(テスト データセットのみが 72 個のサンプル)があるため、精度の推定にはノイズが多くなります。

実際には、このような小さなデータセットの場合、 交差検証 より正確な評価指標の値を計算するため、この方法をおすすめします。 ただしこの例では、引き続きトレーニングと念のためテストを行う シンプルさ。

モデルのハイパーパラメータを改善する

このモデルは、デフォルトのハイパーパラメータでトレーニングされた単一のディシジョン ツリーです。 使用できます。より適切な予測を得るには、次のことができます。

  1. 次のような、より効果的な学習者の ランダム フォレスト または勾配ブースティング ディシジョン ツリー モデルです。これらの学習アルゴリズムについては、次のページで説明します。

  2. 観察と直感を使用してハイパーパラメータを最適化します。「 モデル改善ガイド 役立つことがあります。

  3. ハイパーパラメータ チューニングを使用する 多数のハイパーパラメータを自動的にテストできます。

ランダム フォレストと勾配ブースト ツリーはまだ見たことがないため、 サンプルの数が少なすぎて自動処理を実行できないため、 手動でモデルを改善する必要があります。

上のディシジョン ツリーは小さく、例の 61 のリーフには 混同しています。アルゴリズムがこのリーフを分割しなかった理由 どうすればよいでしょうか。理由は 2 つ考えられます。

  • リーフあたりのサンプルの最小数(デフォルトでは min_examples=5)に指定できる なります。
  • 過学習を防ぐために、ツリーが分割されてプルーニングされた可能性があります。

例の最小数を 1 に減らして結果を確認します。

model = ydf.CartLearner(label=label, min_examples=1).train(train_dataset)
model.plot_tree()

トレーニングしたディシジョン ツリーは
min_examples=1 とします。

<ph type="x-smartling-placeholder"></ph> 図 18:min_examples=1 でトレーニングしたディシジョン ツリー。 で確認できます。

 

61 個のサンプルを含むリーフノードは、さらに複数の あります。

ノードをさらに分割することに価値があるかどうかを確認するために、 新しいモデルを作成します。

print(model.evaluate(test_dataset).accuracy)
# >> 0.97222

モデルの品質はテスト精度が 0.9167 から 0.97222。このハイパーパラメータの変更は良い考えでした。

デシジョン フォレストの前方

ハイパーパラメータを改善し続けることで、おそらくは完璧な 向上しますしかし、この手動プロセスの代わりに、より強力な モデルを作成して、うまくいくか試してみましょう。

model = ydf.RandomForestLearner(label=label).train(pandas_train_dataset)
print("Test accuracy: ", model.evaluate(pandas_test_dataset).accuracy)
# >> Test accuracy: 0.986111

ランダム フォレストの精度は、今回作成した単純なツリーより優れています。手順 理由については次で説明します

使用方法と制限

前述のように、単一のディシジョン ツリーは、多くの場合、最新の ランダム フォレスト、勾配ブースティング ディシジョン ツリー、ニューラル 接続しますただし、ディシジョン ツリーは次のケースでも有用です。

  • より複雑なアプローチを評価するためのシンプルで低コストのベースライン。
  • モデルの品質と解釈可能性との間にトレードオフがある場合。
  • デシジョン フォレスト モデルの解釈の代用として、 後ほど詳しく説明します。