<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Classification |</title><link>https://chaeniverse.github.io/tags/classification/</link><atom:link href="https://chaeniverse.github.io/tags/classification/index.xml" rel="self" type="application/rss+xml"/><description>Classification</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>en-us</language><lastBuildDate>Thu, 24 Oct 2024 00:00:00 +0000</lastBuildDate><image><url>https://chaeniverse.github.io/media/icon_hu_da05098ef60dc2e7.png</url><title>Classification</title><link>https://chaeniverse.github.io/tags/classification/</link></image><item><title>머신러닝 분류 과제 수행 단계</title><link>https://chaeniverse.github.io/blog/ml-classification-workflow/</link><pubDate>Thu, 24 Oct 2024 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/ml-classification-workflow/</guid><description>&lt;p&gt;분류(classification) 머신러닝 프로젝트를 처음부터 끝까지 끌고 가본 경험을 정리한 워크플로 가이드. &lt;strong&gt;전처리 → 변수 선택 → 모델링 → 평가&lt;/strong&gt; 순서.&lt;/p&gt;
&lt;h2 id="전처리-단계"&gt;전처리 단계&lt;/h2&gt;
&lt;h3 id="1차-변수-탐색"&gt;1차 변수 탐색&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;범주형&lt;/strong&gt;: 2x2 table과 odds ratio로 변수 영향력 점검. odds ratio가 10 이상이거나 지나치게 낮으면 sensitivity/specificity 분포가 극단적으로 왜곡되므로 별도 검토.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;연속형&lt;/strong&gt;: 기초 통계량 (mean, sd 등) 과 histogram으로 영향력 확인.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2차-변수-탐색-결측--다중공선성"&gt;2차 변수 탐색 (결측 + 다중공선성)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;결측치 처리&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;결측률 &lt;strong&gt;40% 이상&lt;/strong&gt; 이면 변수의 설명력 부족으로 판단해 제거.&lt;/li&gt;
&lt;li&gt;나머지는 imputation:
&lt;ul&gt;
&lt;li&gt;연속형 → &lt;strong&gt;median&lt;/strong&gt; (mean보다 극단값 영향 덜 받음)&lt;/li&gt;
&lt;li&gt;범주형 → &lt;strong&gt;mode&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Train set 통계량을 test set에도 동일 적용 (leakage 방지).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;다중공선성 (VIF)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Imputation 후 연속형 변수 간 VIF 산출.&lt;/li&gt;
&lt;li&gt;VIF $\ge 10$ 인 변수는 한 번에 한 개씩 제거하며 추이 관찰. cutoff는 주관적이지만 10 초과면 제거 권장.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="범주형-변수-변환"&gt;범주형 변수 변환&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;One-hot encoding은 다중공선성 우려가 있으므로, 한 카테고리를 reference로 두는 &lt;strong&gt;dummy encoding&lt;/strong&gt; 사용.&lt;/li&gt;
&lt;li&gt;Reference 카테고리는 모든 컬럼에서 0인 행 → 최종 컬럼 수 = 카테고리 수 - 1.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="정규화--표준화"&gt;정규화 / 표준화&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;연속형 변수 scale 차이가 크면 모델 설명력에 영향 → MinMaxScaler 또는 Standardization 적용.&lt;/li&gt;
&lt;li&gt;표준화 통계량 (mean, sd) 역시 &lt;strong&gt;train 기준으로 test에 동일 적용&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="변수-선택"&gt;변수 선택&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Feature가 많을수록 설명력은 ↑ but overfitting 위험 ↑.&lt;/li&gt;
&lt;li&gt;Hyperparameter 최적화 전에 변수 선택을 거친다.&lt;/li&gt;
&lt;li&gt;방법: &lt;strong&gt;RFE (Recursive Feature Elimination)&lt;/strong&gt; with &lt;strong&gt;5-fold stratified CV&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;평가 기준: &lt;strong&gt;AUROC&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;RFE-CV 결과 그래프로 최적 feature 수 (예: 5개) 결정.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="모델링-단계"&gt;모델링 단계&lt;/h2&gt;
&lt;h3 id="데이터-분할"&gt;데이터 분할&lt;/h3&gt;
&lt;p&gt;전체 데이터를 &lt;strong&gt;3:1 stratified split&lt;/strong&gt; (train/test).&lt;/p&gt;
&lt;h3 id="하이퍼파라미터-탐색"&gt;하이퍼파라미터 탐색&lt;/h3&gt;
&lt;p&gt;Train 안에서 &lt;strong&gt;10-fold stratified CV&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;10-fold CV로 train/val 분할&lt;/li&gt;
&lt;li&gt;Train set 표준화 → 그 통계량으로 val set 표준화&lt;/li&gt;
&lt;li&gt;각 fold에서 성능 metric 계산 → 평균&lt;/li&gt;
&lt;li&gt;평균이 가장 높은 hyperparameter 조합 저장&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;탐색 알고리즘: &lt;strong&gt;Bayesian optimization&lt;/strong&gt; (grid / random search보다 효율적).&lt;/p&gt;
&lt;h3 id="최종-학습--평가"&gt;최종 학습 + 평가&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;전체 train data 표준화&lt;/li&gt;
&lt;li&gt;위에서 찾은 best hyperparameter로 모델 fitting → 모델 $a$&lt;/li&gt;
&lt;li&gt;Train 통계량으로 test data 표준화 → 모델 $a$ 에 넣고 성능 metric 출력&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="robustness--50회-반복"&gt;Robustness — 50회 반복&lt;/h3&gt;
&lt;p&gt;위 과정 (split → tuning → fit → test) 을 &lt;strong&gt;50번 반복&lt;/strong&gt;하고 metric의 평균을 최종 성능으로 보고. → subject selection bias를 줄이고 robustness 확보.&lt;/p&gt;
&lt;h2 id="모델-후보"&gt;모델 후보&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;XGBoost&lt;/li&gt;
&lt;li&gt;Random Forest&lt;/li&gt;
&lt;li&gt;Support Vector Machine (SVM)&lt;/li&gt;
&lt;li&gt;Logistic Regression&lt;/li&gt;
&lt;li&gt;Multi-Layer Perceptron (MLP)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="평가-지표"&gt;평가 지표&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Accuracy&lt;/li&gt;
&lt;li&gt;Precision&lt;/li&gt;
&lt;li&gt;Recall (Sensitivity)&lt;/li&gt;
&lt;li&gt;F1-score&lt;/li&gt;
&lt;li&gt;AUC-ROC&lt;/li&gt;
&lt;/ul&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;p&gt;이 워크플로를 적용한 실제 프로젝트는
참고.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Logistic Regression</title><link>https://chaeniverse.github.io/blog/logistic-regression/</link><pubDate>Sun, 22 Sep 2024 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/logistic-regression/</guid><description>&lt;h2 id="logistic-regression-vs-linear-regression"&gt;Logistic Regression vs Linear Regression&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Linear regression — &lt;strong&gt;닫힌 해 (closed-form solution)&lt;/strong&gt; 가 존재 (정규방정식)&lt;/li&gt;
&lt;li&gt;Logistic regression — 닫힌 해 없음. &lt;strong&gt;최적화 기법&lt;/strong&gt; 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;좋은 logistic regression 모델은 정답 클래스에는 높은 확률을, 오답 클래스에는 낮은 확률을 부여한다.&lt;/p&gt;
&lt;h2 id="likelihood-function"&gt;Likelihood Function&lt;/h2&gt;
&lt;p&gt;모델 성능을 &lt;strong&gt;likelihood&lt;/strong&gt; — &amp;ldquo;각 데이터 포인트가 정답 클래스로 분류될 확률을 모두 곱한 것&amp;rdquo; — 로 측정한다.&lt;/p&gt;
&lt;p&gt;문제: 확률값을 계속 곱하면 값이 0에 가까워져 수치적으로 불안정. → 로그를 취해 &lt;strong&gt;log-likelihood&lt;/strong&gt; 사용.&lt;/p&gt;
&lt;h2 id="maximum-likelihood-estimation-mle"&gt;Maximum Likelihood Estimation (MLE)&lt;/h2&gt;
$$\arg\max_\theta \mathcal{L}(\theta) \;=\; \arg\max_\theta \log \mathcal{L}(\theta) \;=\; \arg\min_\theta \big(-\log \mathcal{L}(\theta)\big)$$&lt;p&gt;데이터셋 likelihood를 최대화하는 계수 $\theta$ 를 찾는 것이 MLE. 실전에서는 보통 &lt;strong&gt;negative log-likelihood (NLL) 최소화&lt;/strong&gt; 형태로 푼다.&lt;/p&gt;
&lt;h2 id="gradient-descent"&gt;Gradient Descent&lt;/h2&gt;
&lt;p&gt;Logistic regression에는 닫힌 해가 없으므로 &lt;strong&gt;gradient descent&lt;/strong&gt; 로 반복 개선:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;가중치 $\theta$ 를 무작위로 초기화&lt;/li&gt;
&lt;li&gt;NLL의 gradient (1차 도함수) 계산&lt;/li&gt;
&lt;li&gt;Gradient의 반대 방향으로 step size $\alpha$ (learning rate) 만큼 이동&lt;/li&gt;
&lt;li&gt;수렴할 때까지 반복&lt;/li&gt;
&lt;/ol&gt;
$$\theta^{(t+1)} = \theta^{(t)} - \alpha \cdot \nabla_\theta \big(-\log \mathcal{L}(\theta^{(t)})\big)$$&lt;h2 id="예측-및-분류"&gt;예측 및 분류&lt;/h2&gt;
&lt;p&gt;학습된 계수로 새 데이터의 확률을 계산할 때 &lt;strong&gt;sigmoid 함수&lt;/strong&gt; 사용 — S자 곡선:&lt;/p&gt;
$$\sigma(z) = \frac{1}{1 + e^{-z}}, \qquad z = \theta^\top x$$&lt;p&gt;기본 cutoff threshold (보통 0.5) 를 적용해 확률을 이진 분류로 변환:&lt;/p&gt;
$$\hat{y} = \begin{cases} 1 &amp; \text{if } \sigma(\theta^\top x) \ge 0.5 \\ 0 &amp; \text{otherwise} \end{cases}$$&lt;p&gt;threshold는 도메인에 따라 (예: 의료에서 false negative 비용이 클 때) 0.3, 0.7 등으로 조절 가능.&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>SVM (Support Vector Machine)</title><link>https://chaeniverse.github.io/blog/svm-part-1/</link><pubDate>Fri, 20 Sep 2024 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/svm-part-1/</guid><description>&lt;h2 id="svm-개요"&gt;SVM 개요&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;SVM (Support Vector Machine)&lt;/strong&gt; 은 이진 분류 알고리즘이다. 본 글에서 다루는 original SVM은 본질적으로 &lt;strong&gt;선형 모델&lt;/strong&gt;이다 (이후 kernel trick으로 비선형 확장 가능).&lt;/p&gt;
&lt;h2 id="linear-classifier의-목적"&gt;Linear Classifier의 목적&lt;/h2&gt;
&lt;p&gt;SVM은 이진 분류에서 라벨을 $\{-1, +1\}$ 로 표기한다. 목표는 분류기 집합 $H$ 안에서 일반화 오차 $R_D(h)$ 가 작은 가설 $h: X \to \{-1, +1\}$ 을 찾는 것.&lt;/p&gt;
&lt;p&gt;입력 공간 $X$ 에서 각 학습 데이터의 실제 라벨 ($+1$, $-1$) 을 정확히 분류하는 최적 분류기를 찾는다 — 결국 일반화 오차 $R_D(h)$ 를 최소화하는 문제.&lt;/p&gt;
&lt;p&gt;SVM은 고차원 공간에서도 선형 분류를 수행한다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2D → &lt;strong&gt;선(line)&lt;/strong&gt; 으로 분리&lt;/li&gt;
&lt;li&gt;3D → &lt;strong&gt;평면(plane)&lt;/strong&gt; 으로 분리&lt;/li&gt;
&lt;li&gt;일반 $d$ 차원 → $(d-1)$ 차원의 &lt;strong&gt;초평면(hyperplane)&lt;/strong&gt; 으로 두 클래스 분리&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;선형 분류기는 다음 형태:&lt;/p&gt;
$$H = \{\, x \mapsto \mathrm{sign}(w \cdot x + b) \;:\; w \in \mathbb{R}^d,\; b \in \mathbb{R} \,\}$$&lt;p&gt;$w \cdot x + b$ 의 부호로 라벨을 결정 (음수 → $-1$, 양수 → $+1$). 여기서 $w, b$ 가 학습 대상.&lt;/p&gt;
&lt;h2 id="local-optimum-global-optimum"&gt;Local Optimum? Global Optimum!&lt;/h2&gt;
&lt;p&gt;학습 데이터를 정확히 분류하는 hyperplane은 무수히 많다. SVM은 그 중 &lt;strong&gt;두 클래스 사이의 마진(margin)이 가장 넓은&lt;/strong&gt; hyperplane을 고른다.&lt;/p&gt;
&lt;h3 id="마진-너비-도출"&gt;마진 너비 도출&lt;/h3&gt;
&lt;p&gt;분류 경계 위의 점 $x_0$ 에서 $w^\top x_0 + b = 0$. 여기서 $w$ 는 hyperplane의 법선 벡터.&lt;/p&gt;
&lt;p&gt;&amp;ldquo;+1 plane&amp;rdquo; 위의 점 $x_1$ 은 법선 방향으로 거리만큼 이동한 점이므로&lt;/p&gt;
$$x_1 = x_0 + p\, w$$&lt;p&gt;$x_1$ 이 plus plane 위에 있다는 조건 $w^\top x + b = 1$ 에 대입:&lt;/p&gt;
$$w^\top x_0 + p\, w^\top w + b = 1$$&lt;p&gt;$w^\top x_0 + b = 0$ 이므로&lt;/p&gt;
$$p\, w^\top w = 1 \quad\Longrightarrow\quad |p| = \frac{1}{\|w\|^2}$$&lt;p&gt;→ 한쪽 마진은 $\dfrac{1}{\|w\|^2}$, &lt;strong&gt;양쪽 합 마진은 $\dfrac{2}{\|w\|^2}$.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(보다 일반적으로 plus와 minus plane 거리를 $\|w\|$ 로 정규화하면 마진은 $\dfrac{2}{\|w\|}$. 위 도출은 $w^\top x + b = \pm 1$ 형태로 정규화한 경우의 결과)&lt;/p&gt;
&lt;h2 id="마진과-vc-차원의-관계"&gt;마진과 VC 차원의 관계&lt;/h2&gt;
&lt;p&gt;마진 $\Delta$ 를 가지는 분리 초평면의 VC 차원은 다음 상한을 가진다.&lt;/p&gt;
$$h \;\le\; \min\!\left(\left\lceil \frac{R^2}{\Delta^2}\right\rceil,\; D\right) + 1$$&lt;ul&gt;
&lt;li&gt;$D$ : 입력 공간의 차원&lt;/li&gt;
&lt;li&gt;$R$ : 모든 입력 벡터를 포함하는 가장 작은 구의 반지름&lt;/li&gt;
&lt;li&gt;$\Delta$ : 마진&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;여기서 변하는 건 $\Delta$ 뿐. &lt;strong&gt;마진이 클수록 $R^2/\Delta^2$ 가 작아져 VC 차원이 $D$ 보다 더 낮아질 수 있다.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;VC 차원이 작아지면 일반화 위험 상한 (capacity term) 도 작아진다:&lt;/p&gt;
$$R[f] \;\le\; R_{\text{emp}}[f] + \sqrt{\frac{h(\ln(2n/h)+1) + \ln(\delta/4)}{n}}$$&lt;p&gt;→ &lt;strong&gt;마진을 최대화 = VC 차원 ↓ = capacity ↓ = 기대 위험 ↓.&lt;/strong&gt; SVM이 마진을 최대화하는 이론적 근거.&lt;/p&gt;
&lt;h2 id="svm-case-i-linear--hard-margin"&gt;SVM Case I: Linear &amp;amp; Hard Margin&lt;/h2&gt;
&lt;p&gt;데이터가 선형 분리 가능하고 예외(오분류)를 허용하지 않는 경우 (hard margin).&lt;/p&gt;
&lt;h3 id="primal-problem"&gt;Primal Problem&lt;/h3&gt;
$$\min_{w, b} \;\frac{1}{2}\|w\|^2$$$$\text{s.t.} \quad y_i(w^\top x_i + b) \;\ge\; 1 \quad \forall i$$&lt;p&gt;마진 $\dfrac{2}{\|w\|^2}$ 을 최대화 ↔ $\dfrac{1}{2}\|w\|^2$ 을 최소화. 제약은&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;클래스 $+1$: $w^\top x_i + b \ge 1$&lt;/li&gt;
&lt;li&gt;클래스 $-1$: $w^\top x_i + b \le -1$&lt;/li&gt;
&lt;li&gt;둘을 합쳐서 $y_i(w^\top x_i + b) \ge 1$&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="lagrangian--dual"&gt;Lagrangian → Dual&lt;/h3&gt;
&lt;p&gt;라그랑주 승수 $\alpha_i \ge 0$ 을 도입:&lt;/p&gt;
$$L_P = \frac{1}{2}\|w\|^2 - \sum_{i} \alpha_i \big( y_i(w^\top x_i + b) - 1 \big)$$&lt;p&gt;KKT 조건:&lt;/p&gt;
$$\frac{\partial L_P}{\partial w} = 0 \quad\Longrightarrow\quad w = \sum_i \alpha_i y_i x_i$$$$\frac{\partial L_P}{\partial b} = 0 \quad\Longrightarrow\quad \sum_i \alpha_i y_i = 0$$&lt;p&gt;이를 $L_P$ 에 다시 대입하면 &lt;strong&gt;$\alpha$ 만의 함수&lt;/strong&gt;인 dual 문제가 나온다 (convex). 해를 $\alpha^\star$ 라 하자.&lt;/p&gt;
&lt;h3 id="새-입력-분류"&gt;새 입력 분류&lt;/h3&gt;
$$f(x_{\text{new}}) = \mathrm{sign}\!\left(\sum_i \alpha_i^\star y_i \, x_i^\top x_{\text{new}} + b\right)$$&lt;h3 id="support-vectors"&gt;Support Vectors&lt;/h3&gt;
&lt;p&gt;KKT의 complementary slackness에 의해 대부분의 데이터에서 $\alpha_i = 0$ 이 되고, &lt;strong&gt;마진 경계 위에 정확히 놓인 데이터들에 대해서만 $\alpha_i &gt; 0$.&lt;/strong&gt; 이들이 &lt;strong&gt;support vector&lt;/strong&gt; — 모델 $w$ 를 결정짓는 핵심 데이터들.&lt;/p&gt;
&lt;p&gt;데이터셋 안쪽 깊은 점들은 분류기 결정에 영향을 주지 않고, 마진 위 소수 점만이 모델을 정의한다는 게 SVM의 본질.&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>