<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Ensemble |</title><link>https://chaeniverse.github.io/tags/ensemble/</link><atom:link href="https://chaeniverse.github.io/tags/ensemble/index.xml" rel="self" type="application/rss+xml"/><description>Ensemble</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>en-us</language><lastBuildDate>Sat, 21 Sep 2024 00:00:00 +0000</lastBuildDate><image><url>https://chaeniverse.github.io/media/icon_hu_da05098ef60dc2e7.png</url><title>Ensemble</title><link>https://chaeniverse.github.io/tags/ensemble/</link></image><item><title>XGBoost</title><link>https://chaeniverse.github.io/blog/xgboost/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/xgboost/</guid><description>&lt;h2 id="발전-흐름"&gt;발전 흐름&lt;/h2&gt;
&lt;p&gt;단일 decision tree → bagging / Random Forest → Gradient Boosting → &lt;strong&gt;XGBoost&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;XGBoost는 gradient boosting machine의 &lt;strong&gt;성능, 확장성, 속도&lt;/strong&gt; 를 최적화한 구현. 핵심은 &lt;strong&gt;정확한 계산 대신 빠른 근사 해&lt;/strong&gt;를 도입했다는 점.&lt;/p&gt;
&lt;h2 id="split-finding-algorithm"&gt;Split Finding Algorithm&lt;/h2&gt;
&lt;p&gt;Decision tree가 분기점을 찾을 때 가장 큰 비용은 &amp;ldquo;어느 변수의 어느 값에서 split할지&amp;rdquo; 결정하는 것.&lt;/p&gt;
&lt;h3 id="exact-greedy"&gt;Exact Greedy&lt;/h3&gt;
&lt;p&gt;모든 가능한 split 후보를 다 시험. 정렬을 포함해 $O(n \log n)$ 의 복잡도. 데이터가 크면 매우 느리다.&lt;/p&gt;
&lt;h3 id="approximation-방식"&gt;Approximation 방식&lt;/h3&gt;
&lt;p&gt;XGBoost는 변수 값들을 &lt;strong&gt;percentile 기반 bucket&lt;/strong&gt; 으로 나눈 뒤, 각 bucket 안에서만 후보 split을 탐색한다. 예시에서 39개 후보를 30개로 줄이면서 동시에 &lt;strong&gt;bucket 단위로 멀티스레드 병렬화&lt;/strong&gt; 가능.&lt;/p&gt;
&lt;p&gt;두 가지 변종:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Global variant&lt;/strong&gt; — tree depth 전반에 걸쳐 동일한 bucket 구조를 유지&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Local variant&lt;/strong&gt; — 노드마다 일정한 bucket 개수를 유지 (depth가 깊어질수록 더 세밀)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;성능 비교: 근사 알고리즘은 exact 방식과 &lt;strong&gt;거의 동등한 정확도&lt;/strong&gt;를 훨씬 짧은 계산 시간으로 달성.&lt;/p&gt;
&lt;h2 id="sparsity-aware-split-finding"&gt;Sparsity-Aware Split Finding&lt;/h2&gt;
&lt;p&gt;결측값 처리에 특화. 학습 시 결측값을 split의 &lt;strong&gt;왼쪽 / 오른쪽으로 보내는 두 옵션을 모두 시험&lt;/strong&gt;해보고, split 성능이 더 좋은 방향을 그 노드의 default direction으로 학습한다.&lt;/p&gt;
&lt;p&gt;→ 결측 패턴이 있는 데이터에서 별도의 imputation 없이도 우수한 성능.&lt;/p&gt;
&lt;h2 id="system-design"&gt;System Design&lt;/h2&gt;
&lt;p&gt;데이터를 &lt;strong&gt;column-wise&lt;/strong&gt; 포맷으로 저장하고 사전에 정렬해 둔다. tree 학습 중 같은 정렬을 반복할 필요 없음 → 메모리 오버헤드 감소, 속도 향상.&lt;/p&gt;
&lt;p&gt;또한 cache-aware access, out-of-core computation, sparse-aware computation 등 시스템 레벨 최적화가 결합되어, 대규모 데이터에서도 실용적인 학습 시간을 보장한다.&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;원문:
&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Random Forest</title><link>https://chaeniverse.github.io/blog/random-forest/</link><pubDate>Thu, 19 Sep 2024 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/random-forest/</guid><description>&lt;h2 id="random-forest"&gt;Random Forest&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Random Forest&lt;/strong&gt; 는 bagging의 특수한 형태로, base learner로 &lt;strong&gt;decision tree&lt;/strong&gt; 를 쓴다. 두 가지 메커니즘으로 앙상블의 다양성을 확보한다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Bagging (bootstrap sampling)&lt;/strong&gt; — 각 tree는 원본 데이터에서 복원 추출한 bootstrap 샘플로 학습&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Random variable selection&lt;/strong&gt; — tree의 각 분기점에서, 전체 $p$ 개 변수 중 무작위로 $m$ 개만 후보로 두고 그 중 최선의 변수로 분기&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="알고리즘"&gt;알고리즘&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Bootstrap size $t$ 의 무작위 샘플 생성&lt;/li&gt;
&lt;li&gt;분기 시 원본 $p$ 개 변수에서 $m$ 개의 변수만 무작위로 선택해 후보로 두고 분기&lt;/li&gt;
&lt;li&gt;다수의 decision tree를 학습한 뒤 결과를 결합 (분류는 majority vote, 회귀는 평균)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="핵심-통찰"&gt;핵심 통찰&lt;/h2&gt;
&lt;p&gt;변수 제약 때문에 &lt;strong&gt;개별 tree의 성능은 떨어진다.&lt;/strong&gt; 하지만 tree들 간 &lt;strong&gt;상관(correlation)이 줄어들어&lt;/strong&gt; 평균/투표로 결합하면 전체 앙상블의 성능은 더 좋아진다. &amp;ldquo;약한 학습기들을 다양하게 조합해 강한 학습기를 만든다&amp;quot;의 정수.&lt;/p&gt;
&lt;h2 id="일반화-오차-generalization-error"&gt;일반화 오차 (Generalization Error)&lt;/h2&gt;
&lt;p&gt;Random Forest의 일반화 오차에는 다음과 같은 상한이 알려져 있다.&lt;/p&gt;
$$\text{Generalization Error} \;\le\; \frac{\bar{\rho}\,(1 - s^2)}{s^2}$$&lt;p&gt;여기서&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$\bar{\rho}$ : tree들 간 결과의 평균 &lt;strong&gt;상관(correlation)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;$s^2$ : 개별 tree의 &lt;strong&gt;정확도&lt;/strong&gt; (strength)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;→ 좋은 일반화는 &lt;strong&gt;개별 모델 성능($s$)이 높으면서 모델 간 상관($\bar{\rho}$)이 낮을 때&lt;/strong&gt; 얻어진다. 이게 RF가 변수 무작위 선택을 추가하는 이유 — 약간의 개별 정확도 손해를 보더라도 상관을 크게 떨어뜨려서 전체 bound를 줄이는 거래.&lt;/p&gt;
&lt;h2 id="변수-중요도-variable-importance"&gt;변수 중요도 (Variable Importance)&lt;/h2&gt;
&lt;p&gt;Random Forest는 &lt;strong&gt;Out-of-Bag (OOB)&lt;/strong&gt; 데이터를 활용해 변수 중요도를 계산할 수 있다 (별도의 validation set 없이도 가능).&lt;/p&gt;
&lt;h3 id="절차"&gt;절차&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;각 tree에 대해, 그 tree 학습에 쓰이지 않은 OOB 샘플로 예측 오차를 측정.&lt;/li&gt;
&lt;li&gt;변수 $x_i$ 의 값을 &lt;strong&gt;무작위로 permute&lt;/strong&gt; 한 OOB 샘플로 다시 예측 오차 측정.&lt;/li&gt;
&lt;li&gt;두 오차의 차이를 모아 평균과 분산을 구한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="중요도-지표"&gt;중요도 지표&lt;/h3&gt;
$$v_i \;=\; \frac{\bar{d}_i}{s_i}$$&lt;p&gt;여기서&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$\bar{d}_i$ : OOB 오차 차이의 평균 (permute 후 - permute 전)&lt;/li&gt;
&lt;li&gt;$s_i^2$ : 그 차이의 분산&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;직관적으로, &lt;strong&gt;분기 시 자주 쓰이는 중요한 변수&lt;/strong&gt;일수록 permute하면 모델이 크게 망가져 오차 차이가 커진다 → $\bar{d}_i$ 가 크다 → $v_i$ 가 크다.&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;원문:
&lt;/p&gt;
&lt;/blockquote&gt;</description></item></channel></rss>