Big-data-analytics-decision-trees
提供:Dev Guides
ビッグデータ分析-デシジョンツリー
デシジョンツリーは、分類や回帰などの教師あり学習問題に使用されるアルゴリズムです。 デシジョンツリーまたは分類ツリーは、各内部(非リーフ)ノードに入力フィーチャのラベルが付けられたツリーです。 フィーチャでラベル付けされたノードからのアークは、フィーチャの可能な値のそれぞれでラベル付けされます。 ツリーの各リーフには、クラスまたはクラス全体の確率分布のラベルが付けられます。
属性値テストに基づいてソースセットをサブセットに分割することにより、ツリーを「学習」できます。 このプロセスは、*再帰的なパーティショニング*と呼ばれる再帰的な方法で、各派生サブセットで繰り返されます。 ノードのサブセットのターゲット変数の値がすべて同じ場合、または分割によって予測に値が追加されなくなると、再帰が完了します。 決定木のトップダウン誘導のこのプロセスは、貪欲なアルゴリズムの例であり、決定木を学習するための最も一般的な戦略です。
データマイニングで使用される決定木は、2つの主なタイプのものです-
- 分類ツリー-応答が名目上の変数である場合、たとえば電子メールがスパムであるかどうか。
- 回帰ツリー-予測された結果を実数とみなせる場合(例: 労働者の給与)。
決定木は簡単な方法であり、そのためいくつかの問題があります。 この問題の1つは、決定木が生成する結果モデルの分散が大きいことです。 この問題を軽減するために、決定木のアンサンブル法が開発されました。 現在広く使用されているアンサンブルメソッドの2つのグループがあります-
- 決定ツリーのバギング-これらのツリーを使用して、トレーニングデータを置換で繰り返しリサンプリングし、コンセンサス予測のためにツリーを投票することにより、複数の決定ツリーを構築します。 このアルゴリズムは、ランダムフォレストと呼ばれています。
- 決定木をブースト-勾配ブーストは弱学習器を組み合わせます。この場合、意思決定ツリーを反復的な方法で単一の強力な学習者にします。 弱いツリーをデータに適合させ、前のモデルのエラーを修正するために、弱学習器を繰り返し適合させます。
# Install the party package
# install.packages('party')
library(party)
library(ggplot2)
head(diamonds)
# We will predict the cut of diamonds using the features available in the
diamonds dataset.
ct = ctree(cut ~ ., data = diamonds)
# plot(ct, main="Conditional Inference Tree")
# Example output
# Response: cut
# Inputs: carat, color, clarity, depth, table, price, x, y, z
# Number of observations: 53940
#
# 1) table <= 57; criterion = 1, statistic = 10131.878
# 2) depth <= 63; criterion = 1, statistic = 8377.279
# 3) table <= 56.4; criterion = 1, statistic = 226.423
# 4) z <= 2.64; criterion = 1, statistic = 70.393
# 5) clarity <= VS1; criterion = 0.989, statistic = 10.48
# 6) color <= E; criterion = 0.997, statistic = 12.829
# 7)* weights = 82
# 6) color > E
#Table of prediction errors
table(predict(ct), diamonds$cut)
# Fair Good Very Good Premium Ideal
# Fair 1388 171 17 0 14
# Good 102 2912 499 26 27
# Very Good 54 998 3334 249 355
# Premium 44 711 5054 11915 1167
# Ideal 22 114 3178 1601 19988
# Estimated class probabilities
probs = predict(ct, newdata = diamonds, type = "prob")
probs = do.call(rbind, probs)
head(probs)