Adaboostで意思決定の切り株を弱学習器として使用する方法


11

Decision Stumpを使用してAdaboostを実装したい。Adaboostの各反復で、データセットの機能と同じ数の決定の切り株を作ることは正しいですか?

たとえば、24の特徴を持つデータセットがある場合、各反復で24の決定株の分類子を使用する必要がありますか?または、いくつかの機能をランダムに選択して、すべての機能ではなくそれらに分類子を作成する必要がありますか?

回答:


11

(1レベルの)ディシジョンツリーをトレーニングする一般的な方法は、最も純粋な分割を提供する属性を見つけることです。つまり、データセットを2つのサブセットに分割する場合、これらのサブセット内のラベルをできるだけ均一にする必要があります。したがって、多くのツリー(属性ごとに1つのツリー)を構築し、最適な分割を生成するツリーを選択することと見なすこともできます。

場合によっては、属性のサブセットを選択して、そのサブセットでツリーをトレーニングすることも意味があります。たとえば、これは、個々のツリー間の相関を減らすためにランダムフォレストで使用されます。

しかし、AdaBoostに関しては、通常、基本分類子が重み付けされたデータポイントでトレーニングできることを確認するだけで十分であり、ランダムな特徴選択はそれほど重要ではありません。ディシジョンツリーは重みを処理できます(たとえば、ここまたはここを参照)。これは、サブセットの不純物全体に対する各データポイントの寄与に重みを付けることで実行できます。

参考のために私はまた、numpyのと使用してpythonで私のAdaBoostの実装を追加しますsklearnのをDecisionTreeClassifiermax_depth=1

# input: dataset X and labels y (in {+1, -1})
hypotheses = []
hypothesis_weights = []

N, _ = X.shape
d = np.ones(N) / N

for t in range(num_iterations):
    h = DecisionTreeClassifier(max_depth=1)

    h.fit(X, y, sample_weight=d)
    pred = h.predict(X)

    eps = d.dot(pred != y)
    alpha = (np.log(1 - eps) - np.log(eps)) / 2

    d = d * np.exp(- alpha * y * pred)
    d = d / d.sum()

    hypotheses.append(h)
    hypothesis_weights.append(alpha)

ラベルを予測するには:

# X input, y output
y = np.zeros(N)
for (h, alpha) in zip(hypotheses, hypotheses_weight):
    y = y + alpha * h.predict(X)
y = np.sign(y)

ありがとう。決定スタンプは最大深度1のrpartとして(決定ツリーアルゴリズムとして)使用されますか?属性をランダムに選択するべきですか、それともツリーはGini Indexのような特定の基準に基づいて分割するべきですか?@AlexeyGrigorev
ペガ

デシジョンスタンプ= 1-ルール=ノードが1つのデシジョンツリー(最大深度1)。たとえば、ジニインデックスに基づいて、いくつかの不純な尺度に基づいて分割を選択する必要があります。
Alexey Grigorev

この詳細な回答をありがとう!
xsari3x
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.