Adaboost에서 의사 결정 그루터기를 약한 학습자로 사용하는 방법은 무엇입니까?


12

Decision Stump를 사용하여 Adaboost를 구현하고 싶습니다. Adaboost를 반복 할 때마다 데이터 세트의 기능만큼 많은 의사 결정을 내릴 수 있습니까?

예를 들어, 24 개의 기능이있는 데이터 세트가있는 경우 각 반복마다 24 개의 의사 결정 스텀프 분류 기가 있어야합니까? 아니면 무작위로 일부 기능을 선택하고 모든 기능 대신 분류기를 만들어야합니까?

답변:


12

(1 레벨) 의사 결정 트리를 훈련시키는 일반적인 방법은 가장 순수한 분리를 제공하는 그러한 속성을 찾는 것입니다. 즉, 데이터 집합을 두 개의 하위 집합으로 나누면 이러한 하위 집합 내의 레이블이 최대한 균일해야합니다. 따라서 각 속성에 대한 트리 인 많은 트리를 만든 다음 최상의 분할을 생성하는 트리를 선택하는 것으로 볼 수도 있습니다.

경우에 따라 속성의 하위 집합을 선택한 다음 하위 집합에서 트리를 학습하는 것이 좋습니다. 예를 들어, 이것은 임의의 포리스트에서 개별 트리 간의 상관 관계를 줄이기 위해 사용됩니다.

그러나 AdaBoost와 관련하여 일반적으로 기본 분류 기가 계량 된 데이터 포인트에 대해 학습 할 수 있고 충분 한 기능 선택이 덜 중요합니다. 의사 결정 트리는 가중치를 처리 할 수 ​​있습니다 (예 : here 또는 here 참조 ). 전체 서브 세트 불순물에 대한 각 데이터 포인트의 기여를 가중함으로써 수행 될 수있다.

참고로 나는 또한 NumPy와 및 사용하여 파이썬에서 내 에이다 부스트 구현을 추가 할 것입니다 sklearn의를DecisionTreeClassifier 가진 max_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
Pegah

의사 결정 그루터기 = 1- 규칙 = 하나의 노드가있는 의사 결정 트리 (최대 깊이 1). 예를 들어 Gini 지수를 기준으로 일부 불순물 측정을 기준으로 분할을 선택해야합니다.
Alexey Grigorev

이 자세한 답변에 감사드립니다!
xsari3x
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.