<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Machine Learning |</title><link>https://chaeniverse.github.io/tags/machine-learning/</link><atom:link href="https://chaeniverse.github.io/tags/machine-learning/index.xml" rel="self" type="application/rss+xml"/><description>Machine Learning</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>en-us</language><lastBuildDate>Wed, 01 Apr 2026 00:00:00 +0000</lastBuildDate><image><url>https://chaeniverse.github.io/media/icon_hu_da05098ef60dc2e7.png</url><title>Machine Learning</title><link>https://chaeniverse.github.io/tags/machine-learning/</link></image><item><title>OvaRisk-ML: Ovarian Cancer Risk Classification with Machine Learning</title><link>https://chaeniverse.github.io/projects/ovarisk-ml/</link><pubDate>Wed, 01 Apr 2026 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/projects/ovarisk-ml/</guid><description>&lt;h4 id="개요"&gt;개요&lt;/h4&gt;
&lt;p&gt;머신러닝을 활용하여 난소암 위험군을 분류하는 예측 시스템 개발 프로젝트입니다. EDA부터 데이터 전처리, 변수 선택, 모델링, 웹 앱 배포까지 전 과정을 수행했고, 논문은 현재 review 중입니다.&lt;/p&gt;
&lt;h4 id="데이터-전처리"&gt;데이터 전처리&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;변수 탐색.&lt;/strong&gt; 범주형 변수는 2x2 table과 odds ratio로, 연속형 변수는 기초 통계량과 히스토그램으로 영향력을 점검했습니다. Odds ratio가 극단적인 변수는 sensitivity/specificity 분포를 왜곡할 수 있어 별도 검토했습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;결측치 처리.&lt;/strong&gt; 결측률 40% 이상 변수는 설명력이 부족하다고 판단해 제거하고, 나머지는 연속형은 median, 범주형은 mode로 imputation 했습니다. Train set 통계량을 test set에도 동일 적용해 leakage를 방지했습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;다중공선성 점검.&lt;/strong&gt; Imputation 후 VIF(variance inflation factor)를 산출해 cutoff 10 기준으로 변수를 한 번에 하나씩 제거하며 추이를 관찰했습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;인코딩 및 스케일링.&lt;/strong&gt; 범주형 변수는 dummy encoding (reference 카테고리 제외)으로 변환했고, 연속형 변수는 Standardization 또는 MinMaxScaler를 적용했습니다. 표준화 통계량 역시 train 기준으로 test에 동일 적용했습니다.&lt;/p&gt;
&lt;h4 id="변수-선택"&gt;변수 선택&lt;/h4&gt;
&lt;p&gt;5-fold stratified cross-validation을 결합한 Recursive Feature Elimination (RFE-CV)로 변수를 선택했습니다. 평가 기준은 AUROC를 사용했고, RFE-CV 결과 그래프를 토대로 최종 5개 변수를 선정했습니다.&lt;/p&gt;
&lt;h4 id="모델링"&gt;모델링&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;모델 비교.&lt;/strong&gt; Random Forest, Logistic Regression, XGBoost, CatBoost, MLP 5개 모델을 비교했습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;평가 파이프라인.&lt;/strong&gt; 전체 데이터를 3:1 stratified split (train/test)으로 나누고, train 안에서 10-fold stratified cross-validation으로 하이퍼파라미터를 탐색했습니다. 효율을 위해 grid/random search 대신 &lt;strong&gt;Bayesian optimization&lt;/strong&gt;을 사용했습니다. 각 fold의 train→val 전환 시 표준화 통계량은 train 기준으로 일관되게 적용했습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Robustness 확보.&lt;/strong&gt; 전체 split→tuning→fit→test 과정을 &lt;strong&gt;50회 반복&lt;/strong&gt;하고 성능 metric의 평균을 최종 성능으로 보고했습니다. 이를 통해 subject selection bias를 줄이고 모델의 robustness를 높였습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;클래스 불균형 처리.&lt;/strong&gt; 난소암 사례의 희소성을 고려해 undersampling을 적용하고, 그로 인해 편향된 예측 확률을 Bayes rule 기반 수식으로 보정했습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;평가 지표.&lt;/strong&gt; Accuracy, Precision, Recall (Sensitivity), F1-score, AUC-ROC를 보고했습니다.&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Figure 3"
srcset="https://chaeniverse.github.io/projects/ovarisk-ml/fig3_hu_d44118c3852a24a4.webp 320w, https://chaeniverse.github.io/projects/ovarisk-ml/fig3_hu_6cd0fbbc4d73cf4a.webp 457w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://chaeniverse.github.io/projects/ovarisk-ml/fig3_hu_d44118c3852a24a4.webp"
width="457"
height="760"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Figure 4"
srcset="https://chaeniverse.github.io/projects/ovarisk-ml/fig4_hu_a38a4fc2d871b295.webp 320w, https://chaeniverse.github.io/projects/ovarisk-ml/fig4_hu_163e8f4ede47611e.webp 480w, https://chaeniverse.github.io/projects/ovarisk-ml/fig4_hu_8c6bd957ef03fcd3.webp 760w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://chaeniverse.github.io/projects/ovarisk-ml/fig4_hu_a38a4fc2d871b295.webp"
width="760"
height="302"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 id="배포"&gt;배포&lt;/h4&gt;
&lt;p&gt;선정된 최종 모델을 &lt;strong&gt;Python Shiny&lt;/strong&gt; 기반 웹 앱으로 배포해, 사용자 입력값에 대한 위험군 분류 결과와 lifetime risk cumulative incidence plot을 제공합니다.&lt;/p&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;Live App:
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id="성과"&gt;성과&lt;/h4&gt;
&lt;p&gt;논문 작성 완료, 현재 저널 review 중.&lt;/p&gt;</description></item><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>MLP (Multi-Layer Perceptron)</title><link>https://chaeniverse.github.io/blog/mlp-multi-layer-perceptron/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/blog/mlp-multi-layer-perceptron/</guid><description>&lt;h2 id="perceptron의-한계"&gt;Perceptron의 한계&lt;/h2&gt;
&lt;p&gt;단일 perceptron은 두 클래스를 분리하는 hyperplane을 만드는 &lt;strong&gt;선형 모델&lt;/strong&gt;. 변수 관계가 비선형이면 잡아내지 못한다 — 곡선 패턴이 더 적합한 복잡한 관계를 선형 회귀가 잡을 수 없는 것과 같은 한계.&lt;/p&gt;
&lt;h2 id="mlp-도입"&gt;MLP 도입&lt;/h2&gt;
&lt;p&gt;핵심 원리: &lt;strong&gt;여러 선을 결합해 복잡한 문제를 작은 부분 문제들로 분해&lt;/strong&gt;한다. 서로 다른 영역을 식별하는 여러 perceptron을 만들고 그 출력을 조합 → 비선형 결정 경계 형성.&lt;/p&gt;
&lt;p&gt;여러 hidden layer를 쌓으면 모델 복잡도가 증가하고 — 이게 바로 &lt;strong&gt;딥러닝 아키텍처의 시작&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="decision-boundary-비교"&gt;Decision Boundary 비교&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;모델&lt;/th&gt;
&lt;th&gt;결정 경계&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Logistic regression&lt;/td&gt;
&lt;td&gt;선 1개, 임의 방향&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Decision tree&lt;/td&gt;
&lt;td&gt;축에 수직인 여러 선&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MLP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;선 개수와 방향 모두 자유롭게 조정 가능&lt;/strong&gt; (hidden layer / node 수로 복잡도 제어)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="기본-구조"&gt;기본 구조&lt;/h2&gt;
&lt;p&gt;각 input은 모든 hidden node에 서로 다른 가중치로 연결됨. Hidden node가 정보를 처리해 output node에서 집계.&lt;/p&gt;
&lt;p&gt;분류의 경우 output node 수 = 클래스 수. &lt;strong&gt;One-hot encoding&lt;/strong&gt; + &lt;strong&gt;softmax&lt;/strong&gt; 로 확률 분포 출력:&lt;/p&gt;
$$y_j = \frac{e^{z_j}}{\sum_{k=1}^{c} e^{z_k}}$$&lt;h2 id="hidden-node의-역할"&gt;Hidden Node의 역할&lt;/h2&gt;
&lt;p&gt;Hidden node 수 = &lt;strong&gt;네트워크의 복잡도&lt;/strong&gt;. 노드가 많을수록 더 정교한 결정 경계가 가능.&lt;/p&gt;
&lt;h2 id="xor-문제-다시-보기"&gt;XOR 문제 다시 보기&lt;/h2&gt;
&lt;p&gt;선형 분리가 불가능한 데이터를 hidden node를 통해 &lt;strong&gt;분리 가능한 공간으로 변환&lt;/strong&gt;한다. 중간 단계에서 선형 분리들을 만들고 결합하면, 원래는 분리 불가능했던 데이터셋도 분류 가능해진다.&lt;/p&gt;
&lt;h2 id="error-back-propagation"&gt;Error Back-Propagation&lt;/h2&gt;
&lt;p&gt;Gradient descent + backpropagation으로 가중치 업데이트.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Output → Hidden 가중치&lt;/strong&gt;: 실제값과 예측값의 차이 × hidden node 값에 비례해 조정&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Input → Hidden 가중치&lt;/strong&gt;: 오차 크기와 input 값에 의존&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="학습-종료--기타"&gt;학습 종료 / 기타&lt;/h2&gt;
&lt;p&gt;학습은 다음 조건에서 종료:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;가중치 변화가 미미함&lt;/li&gt;
&lt;li&gt;Validation 오차가 임계값 아래로 떨어짐&lt;/li&gt;
&lt;li&gt;미리 정한 epoch 수 도달&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Overfitting 방지를 위한 메커니즘들이 존재 (dropout, regularization, early stopping 등).&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>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>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><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><item><title>Whole-Brain Functional Gradients in Migraine</title><link>https://chaeniverse.github.io/projects/migraine-functional-gradients/</link><pubDate>Sat, 01 Apr 2023 00:00:00 +0000</pubDate><guid>https://chaeniverse.github.io/projects/migraine-functional-gradients/</guid><description>&lt;h4 id="개요"&gt;개요&lt;/h4&gt;
&lt;p&gt;R과 Python을 활용해 편두통 환자군 데이터 분석을 수행하였습니다. 편두통 환자의 뇌 기능 저하를 정량적으로 평가하기 위한 모델을 구축하고 &lt;em&gt;Human Brain Mapping&lt;/em&gt;에 1저자로 출판했습니다.&lt;/p&gt;
&lt;h4 id="방법론"&gt;방법론&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;차원 축소.&lt;/strong&gt; 고차원의 뇌 영상 데이터를 비선형 매니폴드 러닝 기법으로 저차원으로 축소시켜 저차원 고유벡터를 생성했습니다. 결과에 영향을 미칠 수 있는 성별, 나이 등의 요소를 보정하여 다변량 분석을 수행했습니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;집단 간 비교.&lt;/strong&gt; 올바른 통계적 유의성 검정을 위해 false discovery rate (FDR) 보정을 거쳐 환자군과 정상군 사이에 영상 특징 데이터가 유의한 차이를 보이는 뇌 영역을 검출했습니다.&lt;/p&gt;
&lt;p&gt;피질뿐만 아니라 피질-피질하 (subcortico-cortical) 연결성으로 가중된 매니폴드까지 확장해 피질하 영역에서도 환자군 특이적 차이를 검출했습니다.&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Subcortical-weighted manifolds and between-group differences"
srcset="https://chaeniverse.github.io/projects/migraine-functional-gradients/fig2_hu_1e83bb2aa909924c.webp 320w, https://chaeniverse.github.io/projects/migraine-functional-gradients/fig2_hu_6377e236a71d5777.webp 480w, https://chaeniverse.github.io/projects/migraine-functional-gradients/fig2_hu_b35e09cc685d81bd.webp 630w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://chaeniverse.github.io/projects/migraine-functional-gradients/fig2_hu_1e83bb2aa909924c.webp"
width="630"
height="412"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;예측 모델링.&lt;/strong&gt; 편두통의 발병 횟수라는 임상학적 지표를 예측하기 위해 머신러닝 기법을 도입했습니다. 구체적으로, least absolute shrinkage and selection operator (LASSO)를 적용해 영상 피처들을 추출하고, 5-겹 중첩 교차 검증을 갖는 선형 회귀식으로 예측 모형을 구축했습니다. 내부 훈련 데이터 세트에서 성별과 나이를 보정한 후, intra class correlation (ICC)와 mean absolute error (MAE)를 기준으로 모델을 선출하고, 최종적으로 외부 검정 데이터 세트의 임상적 변수들을 예측했습니다. 피실험자들을 뽑는 과정에서 편향이 생기지 않도록 이 과정을 100회 반복했습니다. 예측 정확도는 실제 값과 예측 값 사이의 스피어만 상관 계수, ICC, MAE를 계산해 평가했고, 상관계수의 유의성은 비모수 순열 검정을 기반으로 결정했습니다.&lt;/p&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;
&lt;img alt="Selected feature probability and prediction performance for headache frequency"
srcset="https://chaeniverse.github.io/projects/migraine-functional-gradients/fig3_hu_340b62f810f52a78.webp 320w, https://chaeniverse.github.io/projects/migraine-functional-gradients/fig3_hu_245f0eaed313b4d0.webp 480w, https://chaeniverse.github.io/projects/migraine-functional-gradients/fig3_hu_70c6fae208065cab.webp 697w"
sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 760px"
src="https://chaeniverse.github.io/projects/migraine-functional-gradients/fig3_hu_340b62f810f52a78.webp"
width="697"
height="760"
loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 id="성과"&gt;성과&lt;/h4&gt;
&lt;p&gt;본 연구를 통해 주어진 데이터를 명확하게 이해하고, 해당 데이터를 분석하기 위해 올바르고 견고한 통계 분석 기법을 적용하는 방법을 익혔습니다. 결과는 다음과 같이 출판되었습니다.&lt;/p&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;C.H. Lee, H. Park, M.J. Lee, B. Park, &amp;ldquo;Whole-Brain Functional Gradients Reveal Cortical and Subcortical Alterations in Patients with Episodic Migraine,&amp;rdquo; &lt;em&gt;Human Brain Mapping&lt;/em&gt;, Apr. 2023.&lt;/p&gt;
&lt;/blockquote&gt;</description></item></channel></rss>